Ignore:
Timestamp:
Aug 5, 2010, 8:47:21 AM (14 years ago)
Author:
george
Message:

Modified parsing mechanism of some blocks.
Error messages rewrited as resource strings.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/DelphiToC/Analyze/UPascalParser.pas

    r37 r38  
    1414  TOnErrorMessage = procedure (Text: string) of object;
    1515
    16   TParserCommand = class(TCommonBlock)
    17     function Parse(Parser: TPascalParser): TCommand;
    18   end;
    19 
    2016  TParserWhileDo = class(TWhileDo)
    2117    procedure Parse(Parser: TPascalParser);
     
    3834  TParserCommonBlock = class(TCommonBlock)
    3935    procedure Parse(Parser: TPascalParser; EndSymbol: Char = ';');
     36    function ParseCommand(Parser: TPascalParser): TCommand;
    4037  end;
    4138
     
    7673    ProgramCode: TProgram;
    7774    FOnErrorMessage: TOnErrorMessage;
    78     procedure ErrorMessage(Text: string);
     75    procedure ErrorMessage(const Text: string; const Arguments: array of const);
    7976  public
    8077    CodePosition: Integer;
     
    9592implementation
    9693
     94resourcestring
     95  SUnknownIdentifier = 'Unknown identificator "%s".';
     96  SExpectedButFound = 'Expected "%s" but "%s" found.';
     97  SRedefineIdentifier = 'Identificator "%s" redefinition.';
     98  STypeNotDefined = 'Type "%s" not defined.';
     99
    97100{ TPascalParser }
    98101
    99 procedure TPascalParser.ErrorMessage(Text: string);
    100 begin
    101   if Assigned(FOnErrorMessage) then FOnErrorMessage(Text);
     102procedure TPascalParser.ErrorMessage(const Text: string; const Arguments: array of const);
     103begin
     104  if Assigned(FOnErrorMessage) then
     105    FOnErrorMessage(Format(Text, Arguments));
    102106end;
    103107
     
    106110  Log('Expected: ' + Code + '  Readed: ' + NextCode);
    107111  if NextCode <> Code then begin
    108     ErrorMessage('Expected ' + Code + ' but ' + NextCode + ' found.');
     112    ErrorMessage(SExpectedButFound, [Code, NextCode]);
    109113  end;
    110114  ReadCode;
     
    252256    TParserExpression(Condition).Parse(Parser);
    253257    Expect('do');
    254     TParserCommand(Command).Parse(Parser);
     258    Command := TParserCommonBlock(CommonBlock).ParseCommand(Parser);
    255259  end;
    256260end;
     
    262266  Identifier: string;
    263267  NewVariable: TVariable;
     268  NewExpression: TExpression;
    264269  Method: TFunction;
    265270  Constant: TConstant;
     
    269274  II: Integer;
    270275begin
    271   (*Expressions := TExpressionList.Create;
     276  Expressions := TExpressionList.Create;
    272277  Expressions.Add(TExpression.Create);
    273278  with Parser do begin
     
    276281        Identifier := ReadCode;
    277282        if Identifier = '(' then begin
     283          // Subexpression
    278284          with TExpression(Expressions[Expressions.Count - 1]) do begin
    279             //SubItems[1] := TParserExpression(Self).Parse(Parser);
     285            SubItems[1] := TExpression.Create;
     286            TParserExpression(SubItems[1]).Parse(Parser);
    280287          end;
    281288          with TExpression(Expressions.Items[Expressions.Add(TExpression.Create)]) do begin
     
    285292        end else
    286293        if IsOperator(Identifier) then begin
     294          // Operator
    287295          TExpression(Expressions[Expressions.Count - 1]).OperatorName := Identifier;
    288296          TExpression(Expressions[Expressions.Count - 1]).NodeType := ntOperator;
    289297        end else
    290298        if IsIdentificator(Identifier) then begin
    291           NewVariable := Variables.Search(Identifier);
     299          // Reference to identificator
     300          NewVariable := CommonBlock.Variables.Search(Identifier);
    292301          if Assigned(NewVariable) then begin
     302            // Referenced variable
    293303            with TExpression(Expressions[Expressions.Count - 1]) do begin
    294304              SubItems[1] := TExpression.Create;
     
    300310            end;
    301311          end else begin
    302             Method := Methods.Search(Identifier);
     312            Method := CommonBlock.Methods.Search(Identifier);
    303313            if Assigned(Method) then begin
     314              // Referenced method
    304315              with TExpression(Expressions[Expressions.Count - 1]) do begin
    305316                SubItems[1] := TExpression.Create;
     
    307318                with TExpression(SubItems[1]) do begin
    308319                  Expect('(');
    309                   SubItems.Add(ParseCommonBlockExpression(CommonBlock));
     320                  NewExpression := TExpression.Create;
     321                  NewExpression.CommonBlock := CommonBlock;
     322                  TParserExpression(NewExpression).Parse(Parser);
     323                  SubItems.Add(NewExpression);
    310324                  while NextCode = ',' do begin
    311325                    Expect(',');
    312                     SubItems.Add(ParseCommonBlockExpression(CommonBlock));
     326                    NewExpression := TExpression.Create;
     327                    NewExpression.CommonBlock := CommonBlock;
     328                    TParserExpression(NewExpression).Parse(Parser);
     329                    SubItems.Add(NewExpression);
    313330                  end;
    314331                  Expect(')');
     
    321338              end;
    322339            end else begin
    323               Constant := Constants.Search(Identifier);
     340              Constant := CommonBlock.Constants.Search(Identifier);
    324341              if Assigned(Constant) then begin
     342                // Referenced constant
    325343                with TExpression(Expressions[Expressions.Count - 1]) do begin
    326344                  SubItems[1] := TExpression.Create;
     
    332350                end;
    333351              end else begin
    334                 ErrorMessage('Neznámý identifikátor: ' + Identifier);
     352                ErrorMessage(SUnknownIdentifier, [Identifier]);
    335353              end;
    336354            end;
     
    338356        end else
    339357        begin
     358          // Constant value
    340359          with TExpression(Expressions[Expressions.Count - 1]) do begin
    341360            SubItems[1] := TExpression.Create;
     
    372391    end;
    373392  end;
    374   Result := TExpression(Expressions[0]).SubItems[1];
     393  Result := TExpression(TExpression(Expressions[0]).SubItems[1]);
    375394  TExpression(Expressions[0]).SubItems[1] := nil;
    376395  TExpression(Expressions[1]).SubItems[0] := nil;
    377396  Expressions.Destroy;
    378   *)
    379 end;
    380 
    381 { TParserCommand }
    382 
    383 function TParserCommand.Parse(Parser: TPascalParser): TCommand;
     397end;
     398
     399function TParserCommonBlock.ParseCommand(Parser: TPascalParser): TCommand;
    384400var
    385401  Identifier: string;
     
    395411    if NextCode = 'begin' then begin
    396412      Result := TBeginEnd.Create;
     413      Result.CommonBlock := Self;
    397414      TParserBeginEnd(Result).Parse(Parser);
    398415    end else
    399416    if NextCode = 'if' then begin
    400       Result :=  TIfThenElse.Create;
     417      Result := TIfThenElse.Create;
     418      Result.CommonBlock := Self;
    401419      TParserIfThenElse(Result).Parse(Parser);
    402420    end else
    403421    if NextCode = 'while' then begin
    404422      Result := TWhileDo.Create;
     423      Result.CommonBlock := Self;
    405424      TParserWhileDo(Result).Parse(Parser);
    406425    end else
     
    408427      if Assigned(Variables.Search(NextCode)) then begin
    409428        Result := TAssignment.Create;
     429        Result.CommonBlock := Self;
    410430        IdentName := ReadCode;
    411431        TAssignment(Result).Target := Variables.Search(IdentName);
    412432        Expect(':=');
    413         TAssignment(Result).Source := TParserExpression(Result).Parse(Parser);
     433        TAssignment(Result).Source := TExpression.Create;
     434        TAssignment(Result).Source.CommonBlock := Self;
     435        TParserExpression(TAssignment(Result).Source).Parse(Parser);
    414436      end else
    415437      if Assigned(Methods.Search(NextCode)) then begin
    416438        Result := TMethodCall.Create;
     439        Result.CommonBlock := Self;
    417440  //      ParseMetVariable(TMethodCall(Result).Target);
    418441      end;
     
    657680    Expect('begin');
    658681    while NextCode <> 'end' do begin
    659       NewCommand := TParserCommand(Self).Parse(Parser);
     682      NewCommand := TParserCommonBlock(CommonBlock).ParseCommand(Parser);
    660683      if Assigned(NewCommand) then Commands.Add(NewCommand);
    661684      //ShowMessage(NextCode);
     
    696719                Identifiers.Add(ReadCode);
    697720              end;
    698             end else ErrorMessage('Pøedefinování existující promìnné.');
     721            end else ErrorMessage(SRedefineIdentifier, [VariableName]);
    699722            Expect(':');
    700723            TypeName := ReadCode;
    701724            NewValueType := Parent.Types.Search(TypeName);
    702             if not Assigned(NewValueType) then ErrorMessage('Typ ' + TypeName + ' nebyl definován.')
     725            if not Assigned(NewValueType) then ErrorMessage(STypeNotDefined, [TypeName])
    703726              else for I := 0 to Identifiers.Count - 1 do
    704727                with TParameter(Items[Add(TParameter.Create)]) do begin
     
    753776          Identifiers.Add(ReadCode);
    754777        end;
    755       end else ErrorMessage('Pøedefinování existující promìnné.');
     778      end else ErrorMessage(SRedefineIdentifier, [VariableName]);
    756779      Expect(':');
    757780      TypeName := ReadCode;
    758781      NewValueType := Parent.Types.Search(TypeName);
    759       if NewValueType = nil then ErrorMessage('Typ ' + TypeName + ' nebyl definován.')
     782      if NewValueType = nil then ErrorMessage(STypeNotDefined, [TypeName])
    760783        else for I := 0 to Identifiers.Count - 1 do
    761784          with TVariable(Items[Add(TVariable.Create)]) do begin
     
    804827          Identifiers.Add(ReadCode);
    805828        end;
    806       end else ErrorMessage('Pøedefinování existující konstanty.');
     829      end else ErrorMessage(SRedefineIdentifier, [ConstantName]);
    807830      Expect(':');
    808831      TypeName := ReadCode;
     
    812835      Expect(';');
    813836
    814       if NewValueType = nil then ErrorMessage('Typ ' + TypeName + ' nebyl definován.')
     837      if NewValueType = nil then ErrorMessage(STypeNotDefined, [TypeName])
    815838        else for I := 0 to Identifiers.Count - 1 do
    816839          with TConstant(Items[Add(TConstant.Create)]) do begin
Note: See TracChangeset for help on using the changeset viewer.