Node* Parser::UnaryExpr() { if(oper == KEYWORD_SIZEOF) { Next(); if(oper == ROUND_LEFT_BRACKET) { Next(); string type = text; if(!symStack->TypeAt(text)) throw ParserException(currentToken, "Undefinite type"); Next(); if(oper == ROUND_RIGHT_BRACKET) { Next(); return new NodeUnary(SIZE_OF, new NodeConst(type, type)); } else throw ParserException(currentToken, "Sizeof operation without ')'"); } else { Next(); Node *link = UnaryExpr(); if(link == NULL) throw ParserException(currentToken, "Sizeof operation without argument"); return new NodeUnary(SIZE_OF, link); } } if(oper == OPER_INC || oper == OPER_DEC) { TokenValue _oper = oper; Next(); Node *right = UnaryExpr(); if(right == NULL) throw ParserException(currentToken, "No left operand"); return new NodeUnary(_oper, right); } if(unaryOperator[oper]) { TokenValue _oper = oper; Next(); Node *right = CastExpr(); if(right == NULL) throw ParserException(currentToken, "No left operand"); return new NodeUnary(_oper, right); } return PostfixExpr(); }
void nsXFormsXPathParser::MultiplicationExpr() { UnaryExpr(); PRBool con = PR_TRUE; while (con) { nsXFormsXPathScanner::XPATHTOKEN t = PeekToken(); switch (t) { case nsXFormsXPathScanner::MULTIPLYOPERATOR: case nsXFormsXPathScanner::DIV: case nsXFormsXPathScanner::MOD: PopToken(); UnaryExpr(); break; default: con = PR_FALSE; } } }
void nsXFormsXPathParser::UnaryExpr() { nsXFormsXPathScanner::XPATHTOKEN t = PeekToken(); switch (t) { case nsXFormsXPathScanner::MINUS: PopToken(); UnaryExpr(); break; default: UnionExpr(); } }
Node* Parser::CastExpr() { if(symStack->TypeAt(text) && lastToken->GetTokenValue() == ROUND_LEFT_BRACKET) { Next(); if(oper == ROUND_RIGHT_BRACKET) { Next(); Node *right = CastExpr(); if(right == NULL) throw ParserException(currentToken, "Cast expression without right operand"); return new NodeUnary(CAST_CHAR, right); } else throw ParserException(currentToken, "Cast expression without ')'"); } return UnaryExpr(); }