Changeset 9


Ignore:
Timestamp:
Nov 9, 2009, 10:15:36 AM (15 years ago)
Author:
george
Message:
  • Přidáno: Definování systémových procedůr.
Location:
branches/Void
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • branches/Void/Example.void

    r6 r9  
    11Define Text
    2 Define Text
    3 Write Leave me
    4 Write Heal the world
     2WriteLn Leave me
     3WriteLn Heal the world
    54Assign Text Hell
    6 Assign Texts Hell
    7 Pause
     5ReadLn
  • branches/Void/UCompilator.pas

    r8 r9  
    1010type
    1111  TOnErrorEvent = procedure (Text: string; var Terminate: Boolean; Position: TPoint) of object;
     12
     13  { TCompilator }
    1214
    1315  TCompilator = class
     
    5860procedure TCompilator.ProcessLine(Line: string);
    5961var
    60   Command: string;
     62  CommandName: string;
     63  Command: TProcedure;
    6164  Variable: TVariable;
    6265  VariableName: string;
    6366begin
    6467  with Model, BeginEnd do begin
    65   Command := Parse(Line);
    66   if Command = 'Write' then
    67   with TCommand(Commands[Commands.Add(TCommand.Create)]) do begin
    68     Name := 'WriteLn';
    69     Parameters.Add(Parse(Line));
    70   end else if Command = 'Define' then begin
    71     VariableName := Parse(Line);
    72     Variable := FindVariableByName(VariableName);
    73     if Assigned(Variable) then DoError('Variable ' + VariableName + ' redefined')
    74     else begin
    75       Variable := TVariable.Create;
    76       with Variable do begin
    77         Name := VariableName;
    78         VarType := 'string';
     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';
     78        end;
     79        Variables.Add(Variable);
    7980      end;
    80       Variables.Add(Variable);
     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);
    8198    end;
    82   end else if Command = 'Assign' then with TCommand(Commands[Commands.Add(TCommand.Create)]) do begin
    83     VariableName := Parse(Line);
    84     Variable := FindVariableByName(VariableName);
    85     if not Assigned(Variable) then DoError('Undefined variable ' + VariableName)
    86     else begin
    87       Name := 'Assignment';
    88       Parameters.Add(VariableName);
    89       Parameters.Add(Parse(Line));
    90     end;
    91   end else if Command = 'Pause' then with TCommand(Commands[Commands.Add(TCommand.Create)]) do begin
    92     Name := 'ReadLn';
    93   end else if Command = 'Exit' then with TCommand(Commands[Commands.Add(TCommand.Create)]) do begin
    94     Name := 'Exit';
    95   end else DoError('Unknown command ' + Command);
    96 
    9799  end;
    98100end;
  • branches/Void/UMainForm.lfm

    r8 r9  
    11object MainForm: TMainForm
    2   Left = 259
     2  Left = 457
    33  Height = 525
    4   Top = 124
     4  Top = 112
    55  Width = 660
    66  Caption = 'Překladač Void'
     
    1717    Top = 22
    1818    Width = 279
     19    ScrollBars = ssAutoBoth
    1920    TabOrder = 0
    2021  end
     
    2425    Top = 24
    2526    Width = 260
     27    ScrollBars = ssAutoBoth
    2628    TabOrder = 1
    2729  end
     
    4446  object Memo3: TMemo
    4547    Left = 9
    46     Height = 53
     48    Height = 77
    4749    Top = 443
    48     Width = 548
     50    Width = 549
     51    ScrollBars = ssAutoBoth
    4952    TabOrder = 2
    5053  end
  • branches/Void/UMainForm.pas

    r8 r9  
    6969begin
    7070  with Compilator do begin
     71    Memo3.Lines.Clear;
    7172    SourceCode.Assign(Memo1.Lines);
    7273
  • branches/Void/UModel.pas

    r8 r9  
    2121  end;
    2222
    23   { TBeginEnd }
    24 
    2523  TBeginEnd = class
    2624    Commands: TList;
     
    2826    destructor Destroy; override;
    2927    procedure Clear;
     28  end;
     29
     30  TProcedure = class
     31    Name: string;
     32    Parameters: TStringList;
     33    BeginEnd: TBeginEnd;
     34    constructor Create;
     35    destructor Destroy; override;
    3036  end;
    3137
     
    3642  public
    3743    Variables: TList;
     44    Procedures: TList;
    3845    BeginEnd: TBeginEnd;
    3946    function FindVariableByName(AName: string): TVariable;
     47    function FindProcedureByName(AName: string): TProcedure;
     48    procedure Init;
    4049    procedure Clear;
    4150    constructor Create;
     
    5160  Variables := TList.Create;
    5261  BeginEnd := TBeginEnd.Create;
     62  Procedures := TList.Create;
    5363end;
    5464
     
    6070    TVariable(Variables[I]).Destroy;
    6171  Variables.Destroy;
     72  for I := 0 to Procedures.Count - 1 do
     73    TProcedure(Procedures[I]).Destroy;
     74  Procedures.Destroy;
    6275  BeginEnd.Destroy;
    6376  inherited Destroy;
     
    7487end;
    7588
     89function TModel.FindProcedureByName(AName: string): TProcedure;
     90var
     91  I: Integer;
     92begin
     93  I := 0;
     94  while (I < Procedures.Count) and (TProcedure(Procedures[I]).Name <> AName) do
     95    Inc(I);
     96  if I < Procedures.Count then Result := Procedures[I] else Result := nil;
     97end;
     98
     99procedure TModel.Init;
     100begin
     101  with TProcedure(Procedures[Procedures.Add(TProcedure.Create)]) do begin
     102    Name := 'WriteLn';
     103  end;
     104   with TProcedure(Procedures[Procedures.Add(TProcedure.Create)]) do begin
     105    Name := 'Exit';
     106  end;
     107  with TProcedure(Procedures[Procedures.Add(TProcedure.Create)]) do begin
     108    Name := 'ReadLn';
     109  end;
     110end;
     111
    76112procedure TModel.Clear;
    77113var
     
    82118  Variables.Clear;
    83119  BeginEnd.Clear;
     120  Init;
    84121end;
    85122
     
    124161end;
    125162
     163constructor TProcedure.Create;
     164begin
     165  BeginEnd := TBeginEnd.Create;
     166  Parameters := TStringList.Create;
     167end;
     168
     169destructor TProcedure.Destroy;
     170begin
     171  Parameters.Destroy;
     172  BeginEnd.Destroy;
     173  inherited Destroy;
     174end;
     175
    126176end.
    127177
  • branches/Void/UOutputGenerator.pas

    r8 r9  
    99
    1010type
     11
     12  { TOutputGenerator }
     13
    1114  TOutputGenerator = class
    1215  private
     
    119122        if Name = 'Assignment' then Output.Add(Parameters[0] + ' = ' + Parameters[1] + ';')
    120123        else begin
    121         Row := Name;
    122         if Parameters.Count > 0 then begin
    123           ParameterText := '';
    124           for P := 0 to Parameters.Count - 1 do
    125             ParameterText := ParameterText + Parameters[P] + ', ';
    126           Row := Row + '(' + Copy(ParameterText, 1, Length(ParameterText) - 2) + ')';
    127         end;
    128         Output.Add(Row + ';');
     124          if Name = 'WriteLn' then Row := 'printf'
     125          else if Name = 'ReadLn' then Row := 'scanf'
     126          else if Name = 'Exit' then Row := 'exit';
     127          Row := Row + '(';
     128          if Parameters.Count > 0 then begin
     129            ParameterText := '';
     130            for P := 0 to Parameters.Count - 1 do
     131              ParameterText := ParameterText + Parameters[P] + ', ';
     132            Row := Row + Copy(ParameterText, 1, Length(ParameterText) - 2);
     133          end;
     134          Output.Add(Row + ');');
    129135        end;
    130136      end;
  • branches/Void/project1.lpi

    r8 r9  
    99      <Icon Value="0"/>
    1010      <UseXPManifest Value="True"/>
    11       <ActiveEditorIndexAtStart Value="1"/>
     11      <ActiveEditorIndexAtStart Value="2"/>
    1212    </General>
    1313    <VersionInfo>
     
    4646        <ResourceBaseClass Value="Form"/>
    4747        <UnitName Value="UMainForm"/>
    48         <CursorPos X="39" Y="70"/>
    49         <TopLine Value="25"/>
     48        <CursorPos X="20" Y="71"/>
     49        <TopLine Value="58"/>
    5050        <EditorIndex Value="0"/>
    5151        <UsageCount Value="20"/>
     
    5555        <Filename Value="UCompilator.pas"/>
    5656        <UnitName Value="UCompilator"/>
    57         <CursorPos X="69" Y="85"/>
    58         <TopLine Value="66"/>
     57        <CursorPos X="20" Y="39"/>
     58        <TopLine Value="35"/>
    5959        <EditorIndex Value="1"/>
    6060        <UsageCount Value="10"/>
     
    6565        <IsPartOfProject Value="True"/>
    6666        <UnitName Value="UOutputGenerator"/>
    67         <CursorPos X="75" Y="81"/>
    68         <TopLine Value="74"/>
     67        <CursorPos X="15" Y="118"/>
     68        <TopLine Value="110"/>
    6969        <EditorIndex Value="2"/>
    7070        <UsageCount Value="20"/>
     
    7373      <Unit4>
    7474        <Filename Value="Example.void"/>
    75         <IsPartOfProject Value="True"/>
    7675        <CursorPos X="1" Y="1"/>
    7776        <TopLine Value="1"/>
     
    8584        <IsPartOfProject Value="True"/>
    8685        <UnitName Value="UModel"/>
    87         <CursorPos X="1" Y="19"/>
    88         <TopLine Value="11"/>
     86        <CursorPos X="1" Y="110"/>
     87        <TopLine Value="83"/>
    8988        <EditorIndex Value="3"/>
    9089        <UsageCount Value="20"/>
     
    9493    <JumpHistory Count="30" HistoryIndex="29">
    9594      <Position1>
    96         <Filename Value="UMainForm.pas"/>
    97         <Caret Line="68" Column="42" TopLine="48"/>
     95        <Filename Value="UOutputGenerator.pas"/>
     96        <Caret Line="97" Column="1" TopLine="84"/>
    9897      </Position1>
    9998      <Position2>
    100         <Filename Value="UMainForm.pas"/>
    101         <Caret Line="69" Column="11" TopLine="55"/>
     99        <Filename Value="UCompilator.pas"/>
     100        <Caret Line="53" Column="17" TopLine="52"/>
    102101      </Position2>
    103102      <Position3>
    104103        <Filename Value="UCompilator.pas"/>
    105         <Caret Line="56" Column="18" TopLine="44"/>
     104        <Caret Line="64" Column="23" TopLine="52"/>
    106105      </Position3>
    107106      <Position4>
    108107        <Filename Value="UCompilator.pas"/>
    109         <Caret Line="48" Column="5" TopLine="44"/>
     108        <Caret Line="69" Column="1" TopLine="53"/>
    110109      </Position4>
    111110      <Position5>
    112111        <Filename Value="UCompilator.pas"/>
    113         <Caret Line="61" Column="6" TopLine="59"/>
     112        <Caret Line="87" Column="41" TopLine="1"/>
    114113      </Position5>
    115114      <Position6>
    116         <Filename Value="UCompilator.pas"/>
    117         <Caret Line="19" Column="15" TopLine="4"/>
     115        <Filename Value="UModel.pas"/>
     116        <Caret Line="30" Column="1" TopLine="2"/>
    118117      </Position6>
    119118      <Position7>
    120119        <Filename Value="UModel.pas"/>
    121         <Caret Line="28" Column="21" TopLine="5"/>
     120        <Caret Line="138" Column="7" TopLine="118"/>
    122121      </Position7>
    123122      <Position8>
    124         <Filename Value="UCompilator.pas"/>
    125         <Caret Line="23" Column="1" TopLine="4"/>
     123        <Filename Value="UModel.pas"/>
     124        <Caret Line="28" Column="24" TopLine="13"/>
    126125      </Position8>
    127126      <Position9>
    128         <Filename Value="UCompilator.pas"/>
    129         <Caret Line="47" Column="9" TopLine="32"/>
     127        <Filename Value="UModel.pas"/>
     128        <Caret Line="29" Column="1" TopLine="13"/>
    130129      </Position9>
    131130      <Position10>
    132         <Filename Value="UMainForm.pas"/>
    133         <Caret Line="69" Column="11" TopLine="55"/>
     131        <Filename Value="UModel.pas"/>
     132        <Caret Line="34" Column="5" TopLine="19"/>
    134133      </Position10>
    135134      <Position11>
    136         <Filename Value="UMainForm.pas"/>
    137         <Caret Line="72" Column="8" TopLine="57"/>
     135        <Filename Value="UModel.pas"/>
     136        <Caret Line="70" Column="13" TopLine="54"/>
    138137      </Position11>
    139138      <Position12>
    140         <Filename Value="UMainForm.pas"/>
    141         <Caret Line="73" Column="51" TopLine="57"/>
     139        <Filename Value="UCompilator.pas"/>
     140        <Caret Line="20" Column="1" TopLine="13"/>
    142141      </Position12>
    143142      <Position13>
    144         <Filename Value="UModel.pas"/>
    145         <Caret Line="27" Column="1" TopLine="16"/>
     143        <Filename Value="UCompilator.pas"/>
     144        <Caret Line="66" Column="20" TopLine="46"/>
    146145      </Position13>
    147146      <Position14>
    148         <Filename Value="UModel.pas"/>
    149         <Caret Line="59" Column="11" TopLine="46"/>
     147        <Filename Value="UCompilator.pas"/>
     148        <Caret Line="49" Column="18" TopLine="34"/>
    150149      </Position14>
    151150      <Position15>
    152         <Filename Value="UModel.pas"/>
    153         <Caret Line="80" Column="8" TopLine="65"/>
     151        <Filename Value="UCompilator.pas"/>
     152        <Caret Line="67" Column="64" TopLine="47"/>
    154153      </Position15>
    155154      <Position16>
    156         <Filename Value="UModel.pas"/>
    157         <Caret Line="35" Column="20" TopLine="20"/>
     155        <Filename Value="UOutputGenerator.pas"/>
     156        <Caret Line="19" Column="19" TopLine="1"/>
    158157      </Position16>
    159158      <Position17>
    160         <Filename Value="UModel.pas"/>
    161         <Caret Line="27" Column="1" TopLine="8"/>
     159        <Filename Value="UOutputGenerator.pas"/>
     160        <Caret Line="28" Column="3" TopLine="6"/>
    162161      </Position17>
    163162      <Position18>
    164         <Filename Value="UModel.pas"/>
    165         <Caret Line="107" Column="1" TopLine="78"/>
     163        <Filename Value="UOutputGenerator.pas"/>
     164        <Caret Line="35" Column="18" TopLine="13"/>
    166165      </Position18>
    167166      <Position19>
    168167        <Filename Value="UOutputGenerator.pas"/>
    169         <Caret Line="81" Column="69" TopLine="79"/>
     168        <Caret Line="176" Column="1" TopLine="146"/>
    170169      </Position19>
    171170      <Position20>
    172         <Filename Value="UOutputGenerator.pas"/>
    173         <Caret Line="74" Column="36" TopLine="59"/>
     171        <Filename Value="UCompilator.pas"/>
     172        <Caret Line="43" Column="1" TopLine="43"/>
    174173      </Position20>
    175174      <Position21>
    176         <Filename Value="UOutputGenerator.pas"/>
    177         <Caret Line="75" Column="30" TopLine="60"/>
     175        <Filename Value="UCompilator.pas"/>
     176        <Caret Line="20" Column="1" TopLine="5"/>
    178177      </Position21>
    179178      <Position22>
    180         <Filename Value="UOutputGenerator.pas"/>
    181         <Caret Line="79" Column="29" TopLine="58"/>
     179        <Filename Value="UCompilator.pas"/>
     180        <Caret Line="51" Column="3" TopLine="35"/>
    182181      </Position22>
    183182      <Position23>
    184183        <Filename Value="UModel.pas"/>
    185         <Caret Line="21" Column="1" TopLine="3"/>
     184        <Caret Line="47" Column="27" TopLine="21"/>
    186185      </Position23>
    187186      <Position24>
    188         <Filename Value="UOutputGenerator.pas"/>
    189         <Caret Line="79" Column="12" TopLine="68"/>
     187        <Filename Value="UModel.pas"/>
     188        <Caret Line="93" Column="14" TopLine="88"/>
    190189      </Position24>
    191190      <Position25>
    192         <Filename Value="UOutputGenerator.pas"/>
    193         <Caret Line="85" Column="29" TopLine="64"/>
     191        <Filename Value="UModel.pas"/>
     192        <Caret Line="88" Column="53" TopLine="78"/>
    194193      </Position25>
    195194      <Position26>
    196         <Filename Value="UOutputGenerator.pas"/>
    197         <Caret Line="97" Column="1" TopLine="84"/>
     195        <Filename Value="UModel.pas"/>
     196        <Caret Line="49" Column="5" TopLine="28"/>
    198197      </Position26>
    199198      <Position27>
    200         <Filename Value="UCompilator.pas"/>
    201         <Caret Line="53" Column="17" TopLine="52"/>
     199        <Filename Value="UOutputGenerator.pas"/>
     200        <Caret Line="19" Column="1" TopLine="13"/>
    202201      </Position27>
    203202      <Position28>
    204         <Filename Value="UCompilator.pas"/>
    205         <Caret Line="64" Column="23" TopLine="52"/>
     203        <Filename Value="UOutputGenerator.pas"/>
     204        <Caret Line="44" Column="1" TopLine="29"/>
    206205      </Position28>
    207206      <Position29>
    208         <Filename Value="UCompilator.pas"/>
    209         <Caret Line="69" Column="1" TopLine="53"/>
     207        <Filename Value="UOutputGenerator.pas"/>
     208        <Caret Line="97" Column="1" TopLine="83"/>
    210209      </Position29>
    211210      <Position30>
    212211        <Filename Value="UCompilator.pas"/>
    213         <Caret Line="87" Column="41" TopLine="1"/>
     212        <Caret Line="87" Column="41" TopLine="79"/>
    214213      </Position30>
    215214    </JumpHistory>
Note: See TracChangeset for help on using the changeset viewer.