Changeset 32


Ignore:
Timestamp:
Nov 11, 2009, 2:14:44 PM (15 years ago)
Author:
george
Message:
  • Průběžné uložení.
Location:
branches/Analyzátor gramatiky
Files:
1 added
4 edited

Legend:

Unmodified
Added
Removed
  • branches/Analyzátor gramatiky/PascalCompiler.lpi

    r31 r32  
    99      <Icon Value="0"/>
    1010      <UseXPManifest Value="True"/>
    11       <ActiveEditorIndexAtStart Value="0"/>
     11      <ActiveEditorIndexAtStart Value="4"/>
    1212    </General>
    1313    <VersionInfo>
     
    3131      </Item1>
    3232    </RequiredPackages>
    33     <Units Count="7">
     33    <Units Count="9">
    3434      <Unit0>
    3535        <Filename Value="PascalCompiler.lpr"/>
     
    3737        <CursorPos X="28" Y="8"/>
    3838        <TopLine Value="1"/>
    39         <EditorIndex Value="1"/>
    40         <UsageCount Value="27"/>
     39        <EditorIndex Value="2"/>
     40        <UsageCount Value="28"/>
    4141        <Loaded Value="True"/>
    4242      </Unit0>
     
    4848        <ResourceBaseClass Value="Form"/>
    4949        <UnitName Value="UMainForm"/>
    50         <CursorPos X="20" Y="58"/>
    51         <TopLine Value="54"/>
    52         <EditorIndex Value="2"/>
    53         <UsageCount Value="27"/>
     50        <CursorPos X="15" Y="336"/>
     51        <TopLine Value="315"/>
     52        <EditorIndex Value="3"/>
     53        <UsageCount Value="28"/>
    5454        <Loaded Value="True"/>
    5555      </Unit1>
     
    5858        <IsPartOfProject Value="True"/>
    5959        <UnitName Value="UGrammer"/>
    60         <CursorPos X="10" Y="398"/>
    61         <TopLine Value="384"/>
     60        <CursorPos X="9" Y="238"/>
     61        <TopLine Value="237"/>
    6262        <EditorIndex Value="0"/>
    63         <UsageCount Value="27"/>
     63        <UsageCount Value="28"/>
    6464        <Loaded Value="True"/>
    6565      </Unit2>
     
    6868        <IsPartOfProject Value="True"/>
    6969        <UnitName Value="UProgram"/>
    70         <CursorPos X="1" Y="101"/>
    71         <TopLine Value="86"/>
    72         <EditorIndex Value="3"/>
    73         <UsageCount Value="27"/>
     70        <CursorPos X="1" Y="122"/>
     71        <TopLine Value="107"/>
     72        <EditorIndex Value="4"/>
     73        <UsageCount Value="28"/>
    7474        <Loaded Value="True"/>
    7575      </Unit3>
     
    9393        <UsageCount Value="10"/>
    9494      </Unit6>
     95      <Unit7>
     96        <Filename Value="UParser.pas"/>
     97        <IsPartOfProject Value="True"/>
     98        <UnitName Value="UParser"/>
     99        <CursorPos X="14" Y="3"/>
     100        <TopLine Value="1"/>
     101        <EditorIndex Value="1"/>
     102        <UsageCount Value="21"/>
     103        <Loaded Value="True"/>
     104      </Unit7>
     105      <Unit8>
     106        <Filename Value="..\..\..\..\..\Programy\Lazarus_0.9.29\fpc\2.3.1\source\rtl\objpas\classes\classesh.inc"/>
     107        <CursorPos X="3" Y="604"/>
     108        <TopLine Value="589"/>
     109        <EditorIndex Value="5"/>
     110        <UsageCount Value="10"/>
     111        <Loaded Value="True"/>
     112      </Unit8>
    95113    </Units>
    96114    <JumpHistory Count="30" HistoryIndex="29">
    97115      <Position1>
    98         <Filename Value="PascalCompiler.lpr"/>
    99         <Caret Line="12" Column="11" TopLine="1"/>
     116        <Filename Value="UGrammer.pas"/>
     117        <Caret Line="125" Column="41" TopLine="125"/>
    100118      </Position1>
    101119      <Position2>
    102         <Filename Value="PascalCompiler.lpr"/>
    103         <Caret Line="18" Column="15" TopLine="1"/>
     120        <Filename Value="UGrammer.pas"/>
     121        <Caret Line="129" Column="18" TopLine="125"/>
    104122      </Position2>
    105123      <Position3>
    106         <Filename Value="UProgram.pas"/>
    107         <Caret Line="19" Column="20" TopLine="1"/>
     124        <Filename Value="UGrammer.pas"/>
     125        <Caret Line="58" Column="17" TopLine="37"/>
    108126      </Position3>
    109127      <Position4>
    110         <Filename Value="UMainForm.pas"/>
    111         <Caret Line="83" Column="15" TopLine="57"/>
     128        <Filename Value="UGrammer.pas"/>
     129        <Caret Line="314" Column="1" TopLine="293"/>
    112130      </Position4>
    113131      <Position5>
    114         <Filename Value="UMainForm.pas"/>
    115         <Caret Line="642" Column="15" TopLine="621"/>
     132        <Filename Value="UGrammer.pas"/>
     133        <Caret Line="63" Column="3" TopLine="48"/>
    116134      </Position5>
    117135      <Position6>
    118         <Filename Value="UMainForm.pas"/>
    119         <Caret Line="629" Column="55" TopLine="589"/>
     136        <Filename Value="UGrammer.pas"/>
     137        <Caret Line="228" Column="3" TopLine="206"/>
    120138      </Position6>
    121139      <Position7>
    122         <Filename Value="UMainForm.pas"/>
    123         <Caret Line="58" Column="20" TopLine="54"/>
     140        <Filename Value="UGrammer.pas"/>
     141        <Caret Line="83" Column="3" TopLine="68"/>
    124142      </Position7>
    125143      <Position8>
    126144        <Filename Value="UProgram.pas"/>
    127         <Caret Line="116" Column="21" TopLine="93"/>
     145        <Caret Line="101" Column="1" TopLine="86"/>
    128146      </Position8>
    129147      <Position9>
    130148        <Filename Value="UProgram.pas"/>
    131         <Caret Line="118" Column="22" TopLine="102"/>
     149        <Caret Line="90" Column="43" TopLine="86"/>
    132150      </Position9>
    133151      <Position10>
    134         <Filename Value="UGrammer.pas"/>
    135         <Caret Line="238" Column="10" TopLine="233"/>
     152        <Filename Value="UProgram.pas"/>
     153        <Caret Line="39" Column="40" TopLine="39"/>
    136154      </Position10>
    137155      <Position11>
    138         <Filename Value="UGrammer.pas"/>
    139         <Caret Line="93" Column="22" TopLine="78"/>
     156        <Filename Value="UProgram.pas"/>
     157        <Caret Line="111" Column="13" TopLine="96"/>
    140158      </Position11>
    141159      <Position12>
    142         <Filename Value="UGrammer.pas"/>
    143         <Caret Line="89" Column="57" TopLine="74"/>
     160        <Filename Value="UProgram.pas"/>
     161        <Caret Line="197" Column="1" TopLine="175"/>
    144162      </Position12>
    145163      <Position13>
    146164        <Filename Value="UProgram.pas"/>
    147         <Caret Line="119" Column="31" TopLine="96"/>
     165        <Caret Line="95" Column="1" TopLine="88"/>
    148166      </Position13>
    149167      <Position14>
    150         <Filename Value="UGrammer.pas"/>
    151         <Caret Line="102" Column="63" TopLine="88"/>
     168        <Filename Value="UProgram.pas"/>
     169        <Caret Line="102" Column="1" TopLine="87"/>
    152170      </Position14>
    153171      <Position15>
    154172        <Filename Value="UProgram.pas"/>
    155         <Caret Line="101" Column="1" TopLine="86"/>
     173        <Caret Line="113" Column="1" TopLine="98"/>
    156174      </Position15>
    157175      <Position16>
    158         <Filename Value="UGrammer.pas"/>
    159         <Caret Line="309" Column="36" TopLine="286"/>
     176        <Filename Value="UProgram.pas"/>
     177        <Caret Line="114" Column="9" TopLine="99"/>
    160178      </Position16>
    161179      <Position17>
    162         <Filename Value="UGrammer.pas"/>
    163         <Caret Line="25" Column="23" TopLine="10"/>
     180        <Filename Value="UProgram.pas"/>
     181        <Caret Line="94" Column="1" TopLine="93"/>
    164182      </Position17>
    165183      <Position18>
    166         <Filename Value="UGrammer.pas"/>
    167         <Caret Line="22" Column="45" TopLine="7"/>
     184        <Filename Value="UProgram.pas"/>
     185        <Caret Line="97" Column="1" TopLine="88"/>
    168186      </Position18>
    169187      <Position19>
    170         <Filename Value="UGrammer.pas"/>
    171         <Caret Line="309" Column="48" TopLine="371"/>
     188        <Filename Value="UProgram.pas"/>
     189        <Caret Line="112" Column="1" TopLine="100"/>
    172190      </Position19>
    173191      <Position20>
    174         <Filename Value="UProgram.pas"/>
    175         <Caret Line="101" Column="1" TopLine="86"/>
     192        <Filename Value="UGrammer.pas"/>
     193        <Caret Line="87" Column="19" TopLine="63"/>
    176194      </Position20>
    177195      <Position21>
    178         <Filename Value="UGrammer.pas"/>
    179         <Caret Line="327" Column="36" TopLine="305"/>
     196        <Filename Value="UProgram.pas"/>
     197        <Caret Line="112" Column="13" TopLine="97"/>
    180198      </Position21>
    181199      <Position22>
    182200        <Filename Value="UProgram.pas"/>
    183         <Caret Line="101" Column="1" TopLine="86"/>
     201        <Caret Line="96" Column="20" TopLine="81"/>
    184202      </Position22>
    185203      <Position23>
    186         <Filename Value="UGrammer.pas"/>
    187         <Caret Line="320" Column="1" TopLine="305"/>
     204        <Filename Value="UProgram.pas"/>
     205        <Caret Line="113" Column="39" TopLine="88"/>
    188206      </Position23>
    189207      <Position24>
    190208        <Filename Value="UProgram.pas"/>
    191         <Caret Line="101" Column="1" TopLine="86"/>
     209        <Caret Line="112" Column="33" TopLine="97"/>
    192210      </Position24>
    193211      <Position25>
    194         <Filename Value="UGrammer.pas"/>
    195         <Caret Line="316" Column="11" TopLine="310"/>
     212        <Filename Value="UProgram.pas"/>
     213        <Caret Line="90" Column="59" TopLine="75"/>
    196214      </Position25>
    197215      <Position26>
    198         <Filename Value="UGrammer.pas"/>
    199         <Caret Line="292" Column="22" TopLine="277"/>
     216        <Filename Value="UProgram.pas"/>
     217        <Caret Line="112" Column="20" TopLine="97"/>
    200218      </Position26>
    201219      <Position27>
    202220        <Filename Value="UGrammer.pas"/>
    203         <Caret Line="43" Column="26" TopLine="28"/>
     221        <Caret Line="87" Column="21" TopLine="72"/>
    204222      </Position27>
    205223      <Position28>
    206         <Filename Value="UGrammer.pas"/>
    207         <Caret Line="38" Column="62" TopLine="23"/>
     224        <Filename Value="UProgram.pas"/>
     225        <Caret Line="112" Column="20" TopLine="97"/>
    208226      </Position28>
    209227      <Position29>
    210228        <Filename Value="UGrammer.pas"/>
    211         <Caret Line="290" Column="39" TopLine="283"/>
     229        <Caret Line="88" Column="66" TopLine="72"/>
    212230      </Position29>
    213231      <Position30>
    214         <Filename Value="UGrammer.pas"/>
    215         <Caret Line="38" Column="17" TopLine="17"/>
     232        <Filename Value="UProgram.pas"/>
     233        <Caret Line="112" Column="20" TopLine="97"/>
    216234      </Position30>
    217235    </JumpHistory>
     
    237255  </CompilerOptions>
    238256  <Debugging>
    239     <BreakPoints Count="3">
     257    <BreakPoints Count="2">
    240258      <Item1>
    241259        <Source Value="UMainForm.pas"/>
     
    244262      <Item2>
    245263        <Source Value="UProgram.pas"/>
    246         <Line Value="101"/>
     264        <Line Value="98"/>
    247265      </Item2>
    248       <Item3>
    249         <Source Value="UGrammer.pas"/>
    250         <Line Value="323"/>
    251       </Item3>
    252266    </BreakPoints>
    253267    <Exceptions Count="3">
  • branches/Analyzátor gramatiky/PascalCompiler.lpr

    r29 r32  
    77  UMainForm in 'UMainForm.pas' {MainForm},
    88  UGrammer in 'UGrammer.pas',
    9   UProgram in 'UProgram.pas';
     9  UProgram in 'UProgram.pas', UParser;
    1010
    1111{$IFDEF WINDOWS}{$R PascalCompiler.rc}{$ENDIF}
  • branches/Analyzátor gramatiky/UGrammer.pas

    r31 r32  
    66
    77uses
    8   Classes, ComCtrls, SysUtils, Math, UGrammerRules, fgl;
     8  Classes, ComCtrls, SysUtils, fgl, UParser;
    99
    1010type
     
    3030  end;
    3131
    32   { TPossibleCharacter }
    33 
    3432  TPossibleCharacter = class
    3533    Character: Char;
     
    4139
    4240  TPossibleCharacterList = specialize TFPGObjectList<TPossibleCharacter>;
    43 
    44   { TPossibleCharacters }
    4541
    4642  TPossibleCharacters = class
     
    6056  public
    6157    ItemType: TRuleItemType;
    62     Character: Char;
     58    Text: string;
    6359    Rule: TGrammerRule;
    6460    RuleName: string;
    6561    Optional: Boolean;
    6662    Repetition: Boolean;
    67     procedure GetPossibleCharacters(Path: TGrammerPath; var Characters: TPossibleCharacters);
     63//    procedure GetPossibleCharacters(Path: TGrammerPath; var Characters: TPossibleCharacters);
    6864    constructor Create;
    6965  end;
    7066
    7167  TGrammerItemList = specialize TFPGObjectList<TGrammerItem>;
     68
     69  { TGrammerRule }
    7270
    7371  TGrammerRule = class
     
    8179    procedure ClearProcessed;
    8280    function Add: TGrammerItem;
    83     procedure AddTerminal(ACharacter: Char; AOptional, ARepetition: Boolean);
     81    procedure AddTerminal(AText: string; AOptional, ARepetition: Boolean);
    8482    procedure AddTerminalText(Text: string);
    8583    procedure AddRule(ARule: TGrammerRule; AOptional, ARepetition: Boolean);
    8684    procedure ProcessCharacter(Character: Char);
    87     procedure GetPossibleCharacters(Path: TGrammerPath;
    88       var Characters: TPossibleCharacters; UseIndex: Integer = 0; UseCharIndex: Integer = -1);
     85//    procedure GetPossibleCharacters(Path: TGrammerPath;
     86//      var Characters: TPossibleCharacters; UseIndex: Integer = 0; UseCharIndex: Integer = -1);
     87    function Check(Path: TGrammerPath; Token: string;
     88      UseIndex: Integer = 0; UseCharIndex: Integer = -1): Boolean;
    8989    constructor Create;
    9090    destructor Destroy; override;
     
    127127end;
    128128
    129 procedure TGrammerRule.AddTerminal(ACharacter: Char; AOptional, ARepetition: Boolean);
     129procedure TGrammerRule.AddTerminal(AText: string; AOptional, ARepetition: Boolean);
    130130begin
    131131  with Add do begin
    132132    ItemType := itTerminal;
    133     Character := ACharacter;
     133    Text := AText;
    134134    Optional := AOptional;
    135135    Repetition := ARepetition;
     
    166166end;
    167167
     168(*
    168169procedure TGrammerRule.GetPossibleCharacters(Path: TGrammerPath;
    169170  var Characters: TPossibleCharacters; UseIndex: Integer = 0; UseCharIndex: Integer = -1);
     
    229230  TempPath.Destroy;
    230231end;
     232*)
    231233
    232234procedure TGrammerRule.ProcessCharacter(Character: Char);
    233235begin
     236end;
     237
     238function TGrammerRule.Check(Path: TGrammerPath; Token: string;
     239  UseIndex: Integer; UseCharIndex: Integer): Boolean;
     240begin
     241
    234242end;
    235243
     
    281289end;
    282290
     291(*
    283292procedure TGrammerItem.GetPossibleCharacters(Path: TGrammerPath;
    284293  var Characters: TPossibleCharacters);
    285294var
    286295  Found: Boolean;
    287   PathIndex: Integer;
    288296  NextItemIndex, NextCharIndex: Integer;
    289297  NextRule: TGrammerRule;
     
    315323  end;
    316324end;
     325*)
    317326
    318327{ TGrammerPath }
  • branches/Analyzátor gramatiky/UProgram.pas

    r31 r32  
    3737    constructor Create;
    3838    procedure Insert(Path: TGrammerPath; Character: Char);
    39     procedure Parse(Grammer: TGrammer; Text: string);
     39    procedure Parse(Grammer: TGrammer; Tokens: TStringList);
    4040    destructor Destroy; override;
    4141  end;
     
    8888end;
    8989
    90 procedure TProgram.Parse(Grammer: TGrammer; Text: string);
     90procedure TProgram.Parse(Grammer: TGrammer; Tokens: TStringList);
    9191var
    9292  Path: TGrammerPath;
    9393  I, II: Integer;
    94   C: Integer;
    95   Scope: TPossibleCharacters;
    9694  UseIndex: Integer;
    9795  UseCharIndex: Integer;
    9896  UseRule: TGrammerRule;
    99   ExpectedCharacters: string;
    10097  Level: array of Integer;
    10198begin
    10299  Path := TGrammerPath.Create;
    103   Scope := TPossibleCharacters.Create;
    104 
    105100  with Path.Items[Path.Items.Add(TPathItem.Create)] do begin
    106101    Rule := Grammer.TopRule;
     
    109104  end;
    110105
    111   for I := 1 to Length(Text) do begin
    112     if (Text[I] <> #13) and (Text[I] <> #10) then begin
     106  for I := 0 to Tokens.Count - 1 do begin
    113107      UseIndex := Path.Items[Path.Items.Count - 1].ItemIndex;
    114108      UseCharIndex := Path.Items[Path.Items.Count - 1].CharIndex;
    115109      UseRule := Path.Items[Path.Items.Count - 1].Rule;
    116110      Path.Items.Delete(Path.Items.Count - 1);
    117       Scope.Items.Clear;
    118111      Grammer.ClearProcessed;
    119       UseRule.GetPossibleCharacters(Path, Scope, UseIndex, UseCharIndex);
    120       C := Scope.Items.Count;
    121 
    122       // Possible character selection
    123       SetLength(Level, 0);
    124       for II := 0 to Scope.Items.Count - 1 do
    125       with Scope.Items[II] do
     112      if UseRule.Check(Path, Tokens[I], UseIndex, UseCharIndex) then
    126113      begin
    127         if (Character = Text[I]) then
    128         begin
    129           C := II;
    130           Break;
    131 {
    132             MaxLevel := Max(Length(RulePath.Items), Length(Path.Items));
    133             Different := False;
    134             for Q := 0 to MaxLevel - 1 do
    135             begin
    136               if (Q >= Length(RulePath.Items)) or (Q >= Length(Path.Items)) or
    137                 (RulePath.Items[Q].ItemIndex <> Path.Items[Q].ItemIndex) then
    138                 begin
    139                   Different := True;
    140                   Break;
    141                 end;
    142             end;
    143             if Different and (Q >= LevelLength) then
    144             begin
    145               LevelLength := Q;
    146               C := II;
    147             end;
    148 
    149 }
    150                 {
    151               // Append missing level items
    152                                 if Length(RulePath.Items) > Length(Level) then begin
    153                                   LevelLength := Length(Level);
    154                                   SetLength(Level, Length(RulePath.Items));
    155                                   for Q := LevelLength to High(Level) do
    156                                     Level[Q] := High(Integer);
    157                                 end;
    158                                 // Compare leftness for all rulepath items
    159                                 LevelIsLeft := True;
    160                                 for Q := 0 to High(Level) do begin
    161                                   if Level[Q] > RulePath.Items[Q].ItemIndex then begin
    162                                     LevelIsLeft := False;
    163                                     Break;
    164                                   end;
    165                                   if Level[Q] < RulePath.Items[Q].ItemIndex then Break;
    166                                 end;
    167 
    168                                 if (not LevelIsLeft) or (Length(RulePath.Items) > Length(Level)) then begin
    169                                   SetLength(Level, Length(RulePath.Items));
    170                                   for Q := 0 to High(Level) do
    171                                     Level[Q] := RulePath.Items[Q].ItemIndex;
    172                                   C := II;
    173                                 end;
    174         }
    175         end;
    176       end;
    177 
    178       if C < Scope.Items.Count then begin
    179         Path.Assign(Scope.Items[C].RulePath);
    180         for II := 0 to Path.Items.Count - 1 do
    181         with Path.Items[II] do begin
    182           if Affected then Inc(CharIndex);
    183         end;
    184         Insert(Path, Scope.Items[C].Character);
    185         for II := 0 to Path.Items.Count - 1 do
    186         with Path.Items[II] do begin
    187           Affected := False;
    188         end;
    189         //Path.Next;
     114
    190115      end else begin
    191         ExpectedCharacters := '';
    192         for II := 0 to Scope.Items.Count - 1 do
    193           ExpectedCharacters := ExpectedCharacters + Scope.Items[II].Character;
    194         //raise Exception.Create('Parse error. Expected "' + ExpectedCharacters + '" but found "' + Text[I] + '".');
     116        //raise Exception.Create('Parse error. Expected "' + Tokens[I] + '" but found "' + Text[I] + '".');
    195117        //MainForm.StatusBar1.SimpleText := 'Parse error. Expected "' + ExpectedCharacters + '" but found "' + Text[I] + '".';
    196118        break;
    197119      end;
    198     end;
    199120  end;
    200121  Path.Destroy;
    201   Scope.Destroy;
    202122end;
    203123
Note: See TracChangeset for help on using the changeset viewer.