Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (* TParser.Parse *)
- Function TParser.Parse: Boolean;
- Const Order1: TTokenKindSet = [tkEqual];
- Order2: TTokenKindSet = [tkPlus, tkMinus];
- Order3: TTokenKindSet = [tkStar, tkSlash];
- Order4: TTokenKindSet = [tkCaret];
- Var LoopToken: TToken;
- Function ParseOrder1: PExpressionNode; forward;
- { WhileCondition }
- Function WhileCondition(const Tokens: TTokenKindSet): Boolean;
- Begin
- Scanner.savePosition;
- LoopToken := Scanner.getNext;
- Result := (LoopToken.Kind in Tokens);
- if (not Result) Then
- Scanner.restorePosition;
- End;
- { ParseOrder6 } // number, variable, brackets
- Function ParseOrder6: PExpressionNode;
- Var Token: TToken;
- Begin
- Token := Scanner.getNext;
- Case Token.Kind of
- { number }
- tkNumber:
- Begin
- Result := TExpressionNode.Create(ekNumber);
- Result^.Number := Token.Number;
- End;
- { variable }
- tkIdentifier:
- Begin
- Result := TExpressionNode.Create(ekVariable);
- Result^.VarName := Token.Identifier;
- End;
- { left bracket }
- tkLeftBracket:
- Begin
- Result := ParseOrder1();
- Scanner.eatNext(tkRightBracket);
- End;
- { some other token }
- else
- raise EParserException.CreateFmt('Unexpected token: %s', [Token.Lexeme]);
- End;
- End;
- { ParseOrder5 } // unary '-'
- Function ParseOrder5: PExpressionNode;
- Begin
- Scanner.savePosition;
- // unary "-" found?
- if (Scanner.getNext.Kind = tkMinus) Then
- Begin
- Result := TExpressionNode.Create(ekNeg, ParseOrder5());
- End Else
- // if not, give up and move higher
- Begin
- Scanner.restorePosition;
- Result := ParseOrder6;
- End;
- End;
- { ParseOrder4 } // ^
- Function ParseOrder4: PExpressionNode;
- Begin
- Result := ParseOrder5;
- While (WhileCondition(Order4)) Do
- Begin
- Result := TExpressionNode.Create(ekPow, Result, ParseOrder5);
- End;
- End;
- { ParseOrder3 } // * /
- Function ParseOrder3: PExpressionNode;
- Var Kind: TExpressionNodeKind;
- Begin
- Result := ParseOrder4;
- While (WhileCondition(Order3)) Do
- Begin
- Case LoopToken.Kind of
- tkStar : Kind := ekMul;
- tkSlash: Kind := ekDiv;
- End;
- Result := TExpressionNode.Create(Kind, Result, ParseOrder4);
- End;
- End;
- { ParseOrder2 } // + -
- Function ParseOrder2: PExpressionNode;
- Var Kind: TExpressionNodeKind;
- Begin
- Result := ParseOrder3;
- While (WhileCondition(Order2)) Do
- Begin
- Case LoopToken.Kind of
- tkPlus : Kind := ekAdd;
- tkMinus: Kind := ekSub;
- End;
- Result := TExpressionNode.Create(Kind, Result, ParseOrder3);
- End;
- End;
- { ParseOrder1 } // =
- Function ParseOrder1: PExpressionNode;
- Begin
- Result := ParseOrder2;
- While (WhileCondition(Order1)) Do
- Begin
- Result := TExpressionNode.Create(ekAssign, Result, ParseOrder2);
- End;
- End;
- Begin
- Try
- Try
- Scanner.Reset;
- Root := ParseOrder1();
- Finally
- Result := True;
- End;
- Except
- Exit(False);
- End;
- End;
- End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement