예제 #1
0
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();
  }
}
예제 #4
0
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();
}