Changeset 10


Ignore:
Timestamp:
Nov 9, 2009, 3:02:26 PM (15 years ago)
Author:
george
Message:
  • Přidáno: Parser jazyka Void (Pascalovský dialekt).
  • Upraveno: Kontrola syntaxe srovnáváním typů parsovaných tokenů.
Location:
branches/Void
Files:
1 added
6 edited

Legend:

Unmodified
Added
Removed
  • branches/Void/Example.void

    r9 r10  
    11Define Text
    2 WriteLn Leave me
    3 WriteLn Heal the world
    4 Assign Text Hell
     2Text := Hell
     3WriteLn('Leave me')
     4WriteLn('Heal the world')
    55ReadLn
  • branches/Void/UCompilator.pas

    r9 r10  
    66
    77uses
    8   Classes, SysUtils, UOutputGenerator, UModel;
     8  Classes, SysUtils, UOutputGenerator, UModel, UVoidParser;
    99
    1010type
     
    1616  private
    1717    FOnError: TOnErrorEvent;
    18     ParsePosition: TPoint;
    1918    procedure DoError(Text: string);
    2019  public
    2120    Model: TModel;
    22     SourceCode: TStringList;
     21    SourceCode: TStream;
    2322    Generator: TOutputGenerator;
     23    Parser: TVoidParser;
    2424    procedure Compile;
    25     procedure ProcessLine(Line: string);
     25    procedure Process;
    2626    constructor Create;
    2727    destructor Destroy; override;
    28     function Parse(var Text: string; Separator: string = ' '): string;
    2928    property OnError: TOnErrorEvent read FOnError write FOnError;
    3029  end;
     
    3938begin
    4039  Terminate := False;
    41   if Assigned(FOnError) then FOnError(Text, Terminate, ParsePosition);
     40  if Assigned(FOnError) then FOnError(Text, Terminate, Parser.TokenStartPosition);
    4241  if Terminate then raise Exception.Create('Compilation terminated');
    4342end;
     
    4847begin
    4948  Model.Clear;
     49  SourceCode.Position := 0;
     50  Parser.Open(SourceCode);
    5051
    5152  // Process source lines
    52   for I := 0 to SourceCode.Count - 1 do begin
    53     ParsePosition.Y := I;
    54     ProcessLine(SourceCode[I]);
     53  while SourceCode.Position < SourceCode.Size do begin;
     54    Process;
     55    Parser.ParseNextToken;
    5556  end;
    5657
     
    5859end;
    5960
    60 procedure TCompilator.ProcessLine(Line: string);
     61procedure TCompilator.Process;
    6162var
    6263  CommandName: string;
     
    6465  Variable: TVariable;
    6566  VariableName: string;
     67  Value: string;
    6668begin
    6769  with Model, BeginEnd do begin
    68     CommandName := Parse(Line);
    69     if CommandName = 'Define' then begin
    70       VariableName := Parse(Line);
    71       Variable := FindVariableByName(VariableName);
    72       if Assigned(Variable) then DoError('Variable ' + VariableName + ' redefined')
    73       else begin
    74         Variable := TVariable.Create;
    75         with Variable do begin
    76           Name := VariableName;
    77           VarType := 'string';
     70    if Parser.TokenType = ttIdentifier then begin
     71      CommandName := Parser.TokenValue;
     72      if CommandName = 'Define' then begin
     73        Parser.ParseNextToken;
     74        if Parser.TokenType <> ttWhiteSpace then DoError('Expected white space');
     75        Parser.ParseNextToken;
     76        if Parser.TokenType <> ttIdentifier then DoError('Expected identifier');
     77        VariableName := Parser.TokenValue;
     78        Variable := FindVariableByName(VariableName);
     79        if Assigned(Variable) then DoError('Variable ' + VariableName + ' redefined')
     80        else begin
     81          Variable := TVariable.Create;
     82          with Variable do begin
     83            Name := VariableName;
     84            VarType := 'string';
     85          end;
     86          Variables.Add(Variable);
    7887        end;
    79         Variables.Add(Variable);
     88      end else begin
     89        Command := FindProcedureByName(CommandName);
     90        if Assigned(Command) then begin
     91          with TCommand(Commands[Commands.Add(TCommand.Create)]) do begin
     92            Name := CommandName;
     93            Parser.ParseNextToken;
     94            if (Parser.TokenType = ttSymbol) and (Parser.TokenValue = '(') then begin
     95              Parser.ParseNextToken;
     96              if (Parser.TokenType <> ttString) then DoError('Expected string');
     97              Parameters.Add(Parser.TokenValue);
     98              Parser.ParseNextToken;
     99              if (Parser.TokenType <> ttSymbol) and (Parser.TokenValue = ')') then
     100                DoError('Expected )');
     101            end;
     102          end;
     103        end else begin
     104          Variable := FindVariableByName(CommandName);
     105          if Assigned(Variable) then begin
     106            Parser.ParseNextToken;
     107            if Parser.TokenType <> ttWhiteSpace then DoError('Expected white space');
     108            Parser.ParseNextToken;
     109            if (Parser.TokenType <> ttSymbol) and (Parser.TokenValue = ':=') then
     110              DoError('Expected :=');
     111            Parser.ParseNextToken;
     112            if Parser.TokenType <> ttWhiteSpace then DoError('Expected white space');
     113            Parser.ParseNextToken;
     114            Value := Parser.TokenValue;
     115            if Parser.TokenType = ttIdentifier then begin
     116              Variable := FindVariableByName(CommandName);
     117              if Assigned(Variable) then
     118              with TCommand(Commands[Commands.Add(TCommand.Create)]) do begin
     119                Name := 'Assignment';
     120                Parameters.Add(CommandName);
     121                Parameters.Add(Value);
     122              end else DoError('Undefined variable ' + CommandName);
     123            end else if Parser.TokenType = ttString then begin
     124              with TCommand(Commands[Commands.Add(TCommand.Create)]) do begin
     125                Name := 'Assignment';
     126                Parameters.Add(CommandName);
     127                Parameters.Add(Value);
     128              end;
     129            end else DoError('Expected variable or string')
     130          end else DoError('Unknown command ' + CommandName);
     131        end;
    80132      end;
    81     end else if CommandName = 'Assign' then with TCommand(Commands[Commands.Add(TCommand.Create)]) do begin
    82       VariableName := Parse(Line);
    83       Variable := FindVariableByName(VariableName);
    84       if not Assigned(Variable) then DoError('Undefined variable ' + VariableName)
    85       else begin
    86         Name := 'Assignment';
    87         Parameters.Add(VariableName);
    88         Parameters.Add(Parse(Line));
    89       end;
    90     end else begin
    91       Command := FindProcedureByName(CommandName);
    92       if Assigned(Command) then begin
    93         with TCommand(Commands[Commands.Add(TCommand.Create)]) do begin
    94           Name := CommandName;
    95 
    96         end;
    97       end else DoError('Unknown command ' + CommandName);
    98     end;
     133    end else DoError('Expected identifier');
     134    Parser.ParseNextToken;
     135    if Parser.TokenType <> ttWhiteSpace then DoError('Expected white space');
    99136  end;
    100137end;
     
    102139constructor TCompilator.Create;
    103140begin
    104   SourceCode := TStringList.Create;
     141  SourceCode := TMemoryStream.Create;
    105142  Model := TModel.Create;
     143  Parser := TVoidParser.Create;
    106144end;
    107145
    108146destructor TCompilator.Destroy;
    109 var
    110   I: Integer;
    111147begin
    112148  SourceCode.Destroy;
    113149  Model.Destroy;
     150  Parser.Destroy;
    114151  inherited Destroy;
    115 end;
    116 
    117 function TCompilator.Parse(var Text: string; Separator: string): string;
    118 begin
    119   Text := Trim(Text);
    120   if Pos(Separator, Text) > 0 then begin
    121     Result := Copy(Text, 1, Pos(Separator, Text) - 1);
    122     Delete(Text, 1, Length(Result));
    123   end else begin
    124     Result := Text;
    125     Text := '';
    126   end;
    127   Text := Trim(Text);
    128152end;
    129153
  • branches/Void/UMainForm.pas

    r9 r10  
    3131    procedure FormShow(Sender: TObject);
    3232  private
     33    SourceCode: TMemoryStream;
    3334    procedure CompilatorError(Text: string; var Terminate: Boolean;
    3435      Position: TPoint);
     
    6768
    6869procedure TMainForm.ButtonCompileClick(Sender: TObject);
     70var
     71  Code: string;
    6972begin
    7073  with Compilator do begin
    7174    Memo3.Lines.Clear;
    72     SourceCode.Assign(Memo1.Lines);
    73 
     75    Code := Memo1.Lines.Text;
     76    SourceCode.Size := 0;
     77    SourceCode.Write(Code[1], Length(Code));
    7478    if Assigned(Generator) then Generator.Destroy;
    7579    if ComboBox1.ItemIndex = 0 then
     
    7882    Compile;
    7983    Memo2.Lines.Assign(Generator.Output);
    80   end;
     84    end;
    8185end;
    8286
  • branches/Void/UOutputGenerator.pas

    r9 r10  
    8585          ParameterText := '';
    8686          for P := 0 to Parameters.Count - 1 do
    87             ParameterText := ParameterText + Parameters[P] + ', ';
     87            ParameterText := ParameterText + '''' + Parameters[P] + ''', ';
    8888          Row := Row + '(' + Copy(ParameterText, 1, Length(ParameterText) - 2) + ')';
    8989        end;
     
    129129            ParameterText := '';
    130130            for P := 0 to Parameters.Count - 1 do
    131               ParameterText := ParameterText + Parameters[P] + ', ';
     131              ParameterText := ParameterText + '''' + Parameters[P] + ''', ';
    132132            Row := Row + Copy(ParameterText, 1, Length(ParameterText) - 2);
    133133          end;
  • branches/Void/project1.lpi

    r9 r10  
    3333      </Item1>
    3434    </RequiredPackages>
    35     <Units Count="6">
     35    <Units Count="12">
    3636      <Unit0>
    3737        <Filename Value="project1.lpr"/>
    3838        <IsPartOfProject Value="True"/>
    3939        <UnitName Value="project1"/>
    40         <UsageCount Value="20"/>
     40        <CursorPos X="26" Y="17"/>
     41        <TopLine Value="1"/>
     42        <EditorIndex Value="2"/>
     43        <UsageCount Value="29"/>
     44        <Loaded Value="True"/>
    4145      </Unit0>
    4246      <Unit1>
     
    4650        <ResourceBaseClass Value="Form"/>
    4751        <UnitName Value="UMainForm"/>
    48         <CursorPos X="20" Y="71"/>
    49         <TopLine Value="58"/>
     52        <CursorPos X="44" Y="91"/>
     53        <TopLine Value="68"/>
    5054        <EditorIndex Value="0"/>
    51         <UsageCount Value="20"/>
     55        <UsageCount Value="29"/>
    5256        <Loaded Value="True"/>
    5357      </Unit1>
     
    5559        <Filename Value="UCompilator.pas"/>
    5660        <UnitName Value="UCompilator"/>
    57         <CursorPos X="20" Y="39"/>
    58         <TopLine Value="35"/>
     61        <CursorPos X="53" Y="116"/>
     62        <TopLine Value="99"/>
    5963        <EditorIndex Value="1"/>
    60         <UsageCount Value="10"/>
     64        <UsageCount Value="15"/>
    6165        <Loaded Value="True"/>
    6266      </Unit2>
     
    6569        <IsPartOfProject Value="True"/>
    6670        <UnitName Value="UOutputGenerator"/>
    67         <CursorPos X="15" Y="118"/>
    68         <TopLine Value="110"/>
    69         <EditorIndex Value="2"/>
    70         <UsageCount Value="20"/>
     71        <CursorPos X="72" Y="87"/>
     72        <TopLine Value="71"/>
     73        <EditorIndex Value="4"/>
     74        <UsageCount Value="29"/>
    7175        <Loaded Value="True"/>
    7276      </Unit3>
    7377      <Unit4>
    7478        <Filename Value="Example.void"/>
    75         <CursorPos X="1" Y="1"/>
     79        <IsPartOfProject Value="True"/>
     80        <CursorPos X="15" Y="4"/>
    7681        <TopLine Value="1"/>
    77         <EditorIndex Value="4"/>
    78         <UsageCount Value="20"/>
    79         <Loaded Value="True"/>
     82        <UsageCount Value="29"/>
    8083        <SyntaxHighlighter Value="None"/>
    8184      </Unit4>
     
    8487        <IsPartOfProject Value="True"/>
    8588        <UnitName Value="UModel"/>
    86         <CursorPos X="1" Y="110"/>
     89        <CursorPos X="25" Y="87"/>
    8790        <TopLine Value="83"/>
     91        <EditorIndex Value="5"/>
     92        <UsageCount Value="29"/>
     93        <Loaded Value="True"/>
     94      </Unit5>
     95      <Unit6>
     96        <Filename Value="UParser.pas"/>
     97        <UnitName Value="UParser"/>
     98        <CursorPos X="7" Y="11"/>
     99        <TopLine Value="1"/>
     100        <UsageCount Value="19"/>
     101      </Unit6>
     102      <Unit7>
     103        <Filename Value="..\..\..\..\..\Programy\Lazarus_0.9.29\fpc\2.3.1\source\rtl\objpas\classes\classesh.inc"/>
     104        <CursorPos X="15" Y="743"/>
     105        <TopLine Value="728"/>
     106        <UsageCount Value="14"/>
     107      </Unit7>
     108      <Unit8>
     109        <Filename Value="..\..\..\..\..\Programy\Lazarus_0.9.29\fpc\2.3.1\source\rtl\objpas\classes\parser.inc"/>
     110        <CursorPos X="16" Y="324"/>
     111        <TopLine Value="322"/>
     112        <UsageCount Value="14"/>
     113      </Unit8>
     114      <Unit9>
     115        <Filename Value="..\..\..\..\..\Programy\Lazarus_0.9.29\fpc\2.3.1\source\rtl\inc\heaph.inc"/>
     116        <CursorPos X="10" Y="89"/>
     117        <TopLine Value="70"/>
     118        <UsageCount Value="9"/>
     119      </Unit9>
     120      <Unit10>
     121        <Filename Value="UVoidParser.pas"/>
     122        <IsPartOfProject Value="True"/>
     123        <UnitName Value="UVoidParser"/>
     124        <CursorPos X="44" Y="54"/>
     125        <TopLine Value="40"/>
    88126        <EditorIndex Value="3"/>
    89         <UsageCount Value="20"/>
    90         <Loaded Value="True"/>
    91       </Unit5>
     127        <UsageCount Value="29"/>
     128        <Loaded Value="True"/>
     129      </Unit10>
     130      <Unit11>
     131        <Filename Value="..\..\..\..\..\Programy\Lazarus_0.9.29\fpc\2.3.1\source\rtl\objpas\classes\streams.inc"/>
     132        <CursorPos X="5" Y="370"/>
     133        <TopLine Value="365"/>
     134        <UsageCount Value="10"/>
     135      </Unit11>
    92136    </Units>
    93137    <JumpHistory Count="30" HistoryIndex="29">
    94138      <Position1>
    95         <Filename Value="UOutputGenerator.pas"/>
    96         <Caret Line="97" Column="1" TopLine="84"/>
     139        <Filename Value="UCompilator.pas"/>
     140        <Caret Line="107" Column="1" TopLine="92"/>
    97141      </Position1>
    98142      <Position2>
    99143        <Filename Value="UCompilator.pas"/>
    100         <Caret Line="53" Column="17" TopLine="52"/>
     144        <Caret Line="108" Column="1" TopLine="93"/>
    101145      </Position2>
    102146      <Position3>
    103147        <Filename Value="UCompilator.pas"/>
    104         <Caret Line="64" Column="23" TopLine="52"/>
     148        <Caret Line="109" Column="1" TopLine="94"/>
    105149      </Position3>
    106150      <Position4>
    107151        <Filename Value="UCompilator.pas"/>
    108         <Caret Line="69" Column="1" TopLine="53"/>
     152        <Caret Line="111" Column="1" TopLine="96"/>
    109153      </Position4>
    110154      <Position5>
    111155        <Filename Value="UCompilator.pas"/>
    112         <Caret Line="87" Column="41" TopLine="1"/>
     156        <Caret Line="112" Column="1" TopLine="97"/>
    113157      </Position5>
    114158      <Position6>
    115         <Filename Value="UModel.pas"/>
    116         <Caret Line="30" Column="1" TopLine="2"/>
     159        <Filename Value="UCompilator.pas"/>
     160        <Caret Line="113" Column="1" TopLine="98"/>
    117161      </Position6>
    118162      <Position7>
    119         <Filename Value="UModel.pas"/>
    120         <Caret Line="138" Column="7" TopLine="118"/>
     163        <Filename Value="UCompilator.pas"/>
     164        <Caret Line="114" Column="1" TopLine="99"/>
    121165      </Position7>
    122166      <Position8>
    123         <Filename Value="UModel.pas"/>
    124         <Caret Line="28" Column="24" TopLine="13"/>
     167        <Filename Value="UCompilator.pas"/>
     168        <Caret Line="115" Column="1" TopLine="100"/>
    125169      </Position8>
    126170      <Position9>
    127         <Filename Value="UModel.pas"/>
    128         <Caret Line="29" Column="1" TopLine="13"/>
     171        <Filename Value="UCompilator.pas"/>
     172        <Caret Line="116" Column="1" TopLine="101"/>
    129173      </Position9>
    130174      <Position10>
    131         <Filename Value="UModel.pas"/>
    132         <Caret Line="34" Column="5" TopLine="19"/>
     175        <Filename Value="UCompilator.pas"/>
     176        <Caret Line="117" Column="1" TopLine="102"/>
    133177      </Position10>
    134178      <Position11>
    135         <Filename Value="UModel.pas"/>
    136         <Caret Line="70" Column="13" TopLine="54"/>
     179        <Filename Value="UCompilator.pas"/>
     180        <Caret Line="116" Column="33" TopLine="103"/>
    137181      </Position11>
    138182      <Position12>
    139183        <Filename Value="UCompilator.pas"/>
    140         <Caret Line="20" Column="1" TopLine="13"/>
     184        <Caret Line="114" Column="23" TopLine="99"/>
    141185      </Position12>
    142186      <Position13>
    143187        <Filename Value="UCompilator.pas"/>
    144         <Caret Line="66" Column="20" TopLine="46"/>
     188        <Caret Line="113" Column="1" TopLine="98"/>
    145189      </Position13>
    146190      <Position14>
    147         <Filename Value="UCompilator.pas"/>
    148         <Caret Line="49" Column="18" TopLine="34"/>
     191        <Filename Value="UVoidParser.pas"/>
     192        <Caret Line="49" Column="1" TopLine="34"/>
    149193      </Position14>
    150194      <Position15>
    151         <Filename Value="UCompilator.pas"/>
    152         <Caret Line="67" Column="64" TopLine="47"/>
     195        <Filename Value="UVoidParser.pas"/>
     196        <Caret Line="51" Column="1" TopLine="36"/>
    153197      </Position15>
    154198      <Position16>
    155         <Filename Value="UOutputGenerator.pas"/>
    156         <Caret Line="19" Column="19" TopLine="1"/>
     199        <Filename Value="UVoidParser.pas"/>
     200        <Caret Line="52" Column="1" TopLine="37"/>
    157201      </Position16>
    158202      <Position17>
    159         <Filename Value="UOutputGenerator.pas"/>
    160         <Caret Line="28" Column="3" TopLine="6"/>
     203        <Filename Value="UVoidParser.pas"/>
     204        <Caret Line="54" Column="1" TopLine="39"/>
    161205      </Position17>
    162206      <Position18>
    163         <Filename Value="UOutputGenerator.pas"/>
    164         <Caret Line="35" Column="18" TopLine="13"/>
     207        <Filename Value="UVoidParser.pas"/>
     208        <Caret Line="55" Column="1" TopLine="40"/>
    165209      </Position18>
    166210      <Position19>
    167         <Filename Value="UOutputGenerator.pas"/>
    168         <Caret Line="176" Column="1" TopLine="146"/>
     211        <Filename Value="UVoidParser.pas"/>
     212        <Caret Line="56" Column="1" TopLine="41"/>
    169213      </Position19>
    170214      <Position20>
    171         <Filename Value="UCompilator.pas"/>
    172         <Caret Line="43" Column="1" TopLine="43"/>
     215        <Filename Value="UVoidParser.pas"/>
     216        <Caret Line="58" Column="1" TopLine="43"/>
    173217      </Position20>
    174218      <Position21>
    175         <Filename Value="UCompilator.pas"/>
    176         <Caret Line="20" Column="1" TopLine="5"/>
     219        <Filename Value="UVoidParser.pas"/>
     220        <Caret Line="60" Column="1" TopLine="45"/>
    177221      </Position21>
    178222      <Position22>
    179         <Filename Value="UCompilator.pas"/>
    180         <Caret Line="51" Column="3" TopLine="35"/>
     223        <Filename Value="UVoidParser.pas"/>
     224        <Caret Line="61" Column="1" TopLine="46"/>
    181225      </Position22>
    182226      <Position23>
    183         <Filename Value="UModel.pas"/>
    184         <Caret Line="47" Column="27" TopLine="21"/>
     227        <Filename Value="UVoidParser.pas"/>
     228        <Caret Line="64" Column="1" TopLine="49"/>
    185229      </Position23>
    186230      <Position24>
    187         <Filename Value="UModel.pas"/>
    188         <Caret Line="93" Column="14" TopLine="88"/>
     231        <Filename Value="UVoidParser.pas"/>
     232        <Caret Line="65" Column="1" TopLine="50"/>
    189233      </Position24>
    190234      <Position25>
    191         <Filename Value="UModel.pas"/>
    192         <Caret Line="88" Column="53" TopLine="78"/>
     235        <Filename Value="UVoidParser.pas"/>
     236        <Caret Line="165" Column="1" TopLine="142"/>
    193237      </Position25>
    194238      <Position26>
    195         <Filename Value="UModel.pas"/>
    196         <Caret Line="49" Column="5" TopLine="28"/>
     239        <Filename Value="UCompilator.pas"/>
     240        <Caret Line="113" Column="1" TopLine="98"/>
    197241      </Position26>
    198242      <Position27>
    199         <Filename Value="UOutputGenerator.pas"/>
    200         <Caret Line="19" Column="1" TopLine="13"/>
     243        <Filename Value="UVoidParser.pas"/>
     244        <Caret Line="56" Column="26" TopLine="40"/>
    201245      </Position27>
    202246      <Position28>
    203         <Filename Value="UOutputGenerator.pas"/>
    204         <Caret Line="44" Column="1" TopLine="29"/>
     247        <Filename Value="UVoidParser.pas"/>
     248        <Caret Line="54" Column="44" TopLine="40"/>
    205249      </Position28>
    206250      <Position29>
    207         <Filename Value="UOutputGenerator.pas"/>
    208         <Caret Line="97" Column="1" TopLine="83"/>
     251        <Filename Value="project1.lpr"/>
     252        <Caret Line="19" Column="1" TopLine="1"/>
    209253      </Position29>
    210254      <Position30>
    211         <Filename Value="UCompilator.pas"/>
    212         <Caret Line="87" Column="41" TopLine="79"/>
     255        <Filename Value="project1.lpr"/>
     256        <Caret Line="20" Column="36" TopLine="1"/>
    213257      </Position30>
    214258    </JumpHistory>
  • branches/Void/project1.lpr

    r7 r10  
    88  {$ENDIF}{$ENDIF}
    99  Interfaces, // this includes the LCL widgetset
    10   Forms, UMainForm, UOutputGenerator, LResources, UModel
    11   { you can add units after this };
     10  Forms, UMainForm, UOutputGenerator, LResources, UModel, UVoidParser;
    1211
    1312{$IFDEF WINDOWS}{$R project1.rc}{$ENDIF}
Note: See TracChangeset for help on using the changeset viewer.