Advertisement
Guest User

Untitled

a guest
Apr 20th, 2014
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 3.04 KB | None | 0 0
  1. (* TParser.Parse *)
  2. Function TParser.Parse: Boolean;
  3. Const Order1: TTokenKindSet = [tkEqual];
  4.       Order2: TTokenKindSet = [tkPlus, tkMinus];
  5.       Order3: TTokenKindSet = [tkStar, tkSlash];
  6.       Order4: TTokenKindSet = [tkCaret];
  7.  
  8. Var LoopToken: TToken;
  9.  
  10.   Function ParseOrder1: PExpressionNode; forward;
  11.  
  12.   { WhileCondition }
  13.   Function WhileCondition(const Tokens: TTokenKindSet): Boolean;
  14.   Begin
  15.    Scanner.savePosition;
  16.  
  17.    LoopToken := Scanner.getNext;
  18.    Result    := (LoopToken.Kind in Tokens);
  19.  
  20.    if (not Result) Then
  21.     Scanner.restorePosition;
  22.   End;
  23.  
  24.   { ParseOrder6 } // number, variable, brackets
  25.   Function ParseOrder6: PExpressionNode;
  26.   Var Token: TToken;
  27.   Begin
  28.    Token := Scanner.getNext;
  29.  
  30.    Case Token.Kind of
  31.     { number }
  32.     tkNumber:
  33.     Begin
  34.      Result         := TExpressionNode.Create(ekNumber);
  35.      Result^.Number := Token.Number;
  36.     End;
  37.  
  38.     { variable }
  39.     tkIdentifier:
  40.     Begin
  41.      Result          := TExpressionNode.Create(ekVariable);
  42.      Result^.VarName := Token.Identifier;
  43.     End;
  44.  
  45.     { left bracket }
  46.     tkLeftBracket:
  47.     Begin
  48.      Result := ParseOrder1();
  49.      Scanner.eatNext(tkRightBracket);
  50.     End;
  51.  
  52.     { some other token }
  53.     else
  54.      raise EParserException.CreateFmt('Unexpected token: %s', [Token.Lexeme]);
  55.    End;
  56.   End;
  57.  
  58.   { ParseOrder5 } // unary '-'
  59.   Function ParseOrder5: PExpressionNode;
  60.   Begin
  61.    Scanner.savePosition;
  62.  
  63.    // unary "-" found?
  64.    if (Scanner.getNext.Kind = tkMinus) Then
  65.    Begin
  66.     Result := TExpressionNode.Create(ekNeg, ParseOrder5());
  67.    End Else
  68.  
  69.    // if not, give up and move higher
  70.    Begin
  71.     Scanner.restorePosition;
  72.     Result := ParseOrder6;
  73.    End;
  74.   End;
  75.  
  76.   { ParseOrder4 } // ^
  77.   Function ParseOrder4: PExpressionNode;
  78.   Begin
  79.    Result := ParseOrder5;
  80.  
  81.    While (WhileCondition(Order4)) Do
  82.    Begin
  83.     Result := TExpressionNode.Create(ekPow, Result, ParseOrder5);
  84.    End;
  85.   End;
  86.  
  87.   { ParseOrder3 } // * /
  88.   Function ParseOrder3: PExpressionNode;
  89.   Var Kind: TExpressionNodeKind;
  90.   Begin
  91.    Result := ParseOrder4;
  92.  
  93.    While (WhileCondition(Order3)) Do
  94.    Begin
  95.     Case LoopToken.Kind of
  96.      tkStar : Kind := ekMul;
  97.      tkSlash: Kind := ekDiv;
  98.     End;
  99.  
  100.     Result := TExpressionNode.Create(Kind, Result, ParseOrder4);
  101.    End;
  102.   End;
  103.  
  104.   { ParseOrder2 } // + -
  105.   Function ParseOrder2: PExpressionNode;
  106.   Var Kind: TExpressionNodeKind;
  107.   Begin
  108.    Result := ParseOrder3;
  109.  
  110.    While (WhileCondition(Order2)) Do
  111.    Begin
  112.     Case LoopToken.Kind of
  113.      tkPlus : Kind := ekAdd;
  114.      tkMinus: Kind := ekSub;
  115.     End;
  116.  
  117.     Result := TExpressionNode.Create(Kind, Result, ParseOrder3);
  118.    End;
  119.   End;
  120.  
  121.   { ParseOrder1 } // =
  122.   Function ParseOrder1: PExpressionNode;
  123.   Begin
  124.    Result := ParseOrder2;
  125.  
  126.    While (WhileCondition(Order1)) Do
  127.    Begin
  128.     Result := TExpressionNode.Create(ekAssign, Result, ParseOrder2);
  129.    End;
  130.   End;
  131.  
  132. Begin
  133.  Try
  134.   Try
  135.    Scanner.Reset;
  136.    Root := ParseOrder1();
  137.   Finally
  138.    Result := True;
  139.   End;
  140.  Except
  141.   Exit(False);
  142.  End;
  143. End;
  144. End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement