Advertisement
Guest User

Untitled

a guest
Nov 24th, 2017
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.60 KB | None | 0 0
  1. static inline bool isUnaryOp(TokenKind token) {
  2.     return (token == tSUB) || (token == tNOT);
  3. }
  4.  
  5. static inline bool isBinaryOp(TokenKind token) {
  6.     return (token >= tADD && token <= tMOD) ||
  7.            (token == tRANGE) ||
  8.            (token >= tEQ && token <= tLE) ||
  9.            (token == tAND  || token == tOR ||
  10.             token == tAAND || token == tAOR || token == tAXOR);
  11. }
  12.  
  13. AstNode* Parser::parseUnary() {
  14.     if (isUnaryOp(currentToken())) {
  15.         TokenKind op = currentToken();
  16.         consumeToken();
  17.         return new UnaryOpNode(_currentTokenIndex, op, parseUnary());
  18.     } else if (currentToken() == tIDENT && lookaheadToken(1) == tLPAREN) {
  19.         AstNode* expr = parseCall();
  20.         return expr;
  21.     } else if (currentToken() == tIDENT) {
  22.         AstVar* var = _currentScope->lookupVariable(currentTokenValue());
  23.         if (var == 0) {
  24.             error("undeclared atom: %s", currentTokenValue().c_str());
  25.         }
  26.         LoadNode* result = new LoadNode(_currentTokenIndex, var);
  27.         consumeToken();
  28.         return result;
  29.     } else if (currentToken() == tDOUBLE) {
  30.         DoubleLiteralNode* result =
  31.             new DoubleLiteralNode(_currentTokenIndex,
  32.                                   parseDouble(currentTokenValue()));
  33.         consumeToken();
  34.         return result;
  35.     } else if (currentToken() == tINT) {
  36.         IntLiteralNode* result =
  37.             new IntLiteralNode(_currentTokenIndex,
  38.                                parseInt(currentTokenValue()));
  39.         consumeToken();
  40.         return result;
  41.     } else if (currentToken() == tSTRING) {
  42.         StringLiteralNode* result =
  43.             new StringLiteralNode(_currentTokenIndex,
  44.                                   currentTokenValue());
  45.         consumeToken();
  46.         return result;
  47.     } else if (currentToken() == tLPAREN) {
  48.         consumeToken();
  49.         AstNode* expr = parseExpression();
  50.         ensureToken(tRPAREN);
  51.         return expr;
  52.     } else {
  53.         error("Unexpected token: %s", tokenStr(currentToken()));
  54.         return 0;
  55.     }
  56. }
  57.  
  58. AstNode* Parser::parseBinary(int minPrecedence) {
  59.     AstNode* left = parseUnary();
  60.     int precedence = tokenPrecedence(currentToken());
  61.  
  62.     while (precedence >= minPrecedence) {
  63.         while (tokenPrecedence(currentToken()) == precedence) {
  64.             TokenKind op = currentToken();
  65.             uint32_t op_pos = _currentTokenIndex;
  66.             consumeToken();
  67.             AstNode* right = parseBinary(precedence + 1);
  68.             left = new BinaryOpNode(op_pos, op, left, right);
  69.         }
  70.         precedence--;
  71.     }
  72.     return left;
  73. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement