PARSENODE_PTR SQLParser::parseExpression() { PARSENODE_PTR columnNode = parseIdentifier(); PARSENODE_PTR opNode = parseOperator(); PARSENODE_PTR valueNode = parseLiteral(); opNode->children.push_back(columnNode); opNode->children.push_back(valueNode); return opNode; }
Token Lexer::nextToken() { if (atEof_) { return Token(TokenType::END_OF_INPUT, ""); } if (std::isdigit(next_)) { return parseNumber(); } else if (isIdentifierStart(next_)) { return parseIdentifier(); } else if (isEol(next_)) { return parseNewLine(); } else { return parseOperator(); } }
ParseTreeAndEnd<GroupIterator> parseArithmeticExpression(GroupIterator& groups_begin, GroupIterator& groups_end) { std::unique_ptr<ParseTree<ARITH_EXPR> > parse_tree_ptr; ParseTreeAndEnd<GroupIterator> sub_parse_tree; GroupIterator current_position = groups_begin; if (current_position->token == LEFT_PAREN) { sub_parse_tree = parseParenthesesEnclosedArithmeticExpression( groups_begin, groups_end); parse_tree_ptr->addChild(std::move(*sub_parse_tree.parse_tree_ptr)); current_position = sub_parse_tree.end; } else if (current_position->token == NUMBER) { parse_tree_ptr->addChild(ParseTree<NUMBER>()); ++current_position; } if (current_position == groups_end || !isOperatorBeginning(current_position->token)) { return makeParseTreeAndEnd( parse_tree_ptr, current_position); } sub_parse_tree = parseOperator(current_position, groups_end); parse_tree_ptr->addChild(*sub_parse_tree.parse_tree_ptr); current_position = sub_parse_tree.end; sub_parse_tree = parseArithmeticExpression(current_position, groups_end); parse_tree_ptr->addChild(*sub_parse_tree.parse_tree_ptr); current_position = sub_parse_tree.end; return makeParseTreeAndEnd( parse_tree_ptr, current_position); }
static int yylex(YYSTYPE *lvalp, yyscan_t scanner) { const size_t len = scanner->insize; const unsigned char *in = (const unsigned char*)scanner->in; unsigned char lookahead; enum char_class cClass; scanner->yytext = NULL; scanner->yylen = 0; if(scanner->pos == scanner->lastpos) { if(scanner->last_state == scanner->state) { cli_dbgmsg(MODULE "infloop detected, skipping character\n"); scanner->pos++; } /* its not necesarely an infloop if it changed * state, and it shouldn't infloop between states */ } scanner->lastpos = scanner->pos; scanner->last_state = scanner->state; while(scanner->pos < scanner->insize) { switch(scanner->state) { case Initial: textbuf_clean(&scanner->buf); cClass = ctype[in[scanner->pos++]]; switch(cClass) { case Whitespace: /* eat whitespace */ continue; case Slash: if(scanner->pos < len) { lookahead = in[scanner->pos]; switch(lookahead) { case '*': scanner->state = MultilineComment; scanner->pos++; continue; case '/': scanner->state = SinglelineComment; scanner->pos++; continue; } } --scanner->pos; return parseOperator(lvalp, scanner); case Operator: --scanner->pos; return parseOperator(lvalp, scanner); case DQuote: return parseDQString(lvalp, scanner); case SQuote: return parseSQString(lvalp, scanner); case Digit: --scanner->pos; return parseNumber(lvalp, scanner); case IdStart: --scanner->pos; return parseId(lvalp,scanner); CASE_SPECIAL_CHAR(BracketOpen, "["); CASE_SPECIAL_CHAR(BracketClose, "]"); CASE_SPECIAL_CHAR(Comma, ","); CASE_SPECIAL_CHAR(CurlyOpen, "{"); CASE_SPECIAL_CHAR(CurlyClose, "}"); CASE_SPECIAL_CHAR(ParOpen, "("); CASE_SPECIAL_CHAR(ParClose, ")"); CASE_SPECIAL_CHAR(Dot, "."); CASE_SPECIAL_CHAR(SemiColon, ";"); case Nop: continue; } break; case DoubleQString: return parseString(lvalp, scanner, '"', DoubleQString); case SingleQString: return parseString(lvalp, scanner, '\'', SingleQString); case Identifier: return parseId(lvalp, scanner); case MultilineComment: while(scanner->pos+1 < scanner->insize) { if(in[scanner->pos] == '*' && in[scanner->pos+1] == '/') { scanner->state = Initial; scanner->pos++; break; } scanner->pos++; } scanner->pos++; break; case Number: return parseNumber(lvalp, scanner); case SinglelineComment: while(scanner->pos < scanner->insize) { /* htmlnorm converts \n to space, so * stop on space too */ if(in[scanner->pos] == '\n' || in[scanner->pos] == ' ') break; scanner->pos++; } scanner->state = Initial; break; default: assert(0 && "Not reached"); } } return 0; }