/// <summary> /// Returns a factor (integer, string, boolean, unaryast) /// </summary> /// <returns>Factor AST</returns> private AST Factor() { Token token = this.currentToken; if (token.type == TokenType.INTEGER) { this.ConsumeToken(TokenType.INTEGER); return(new NumericAST(token)); } else if (token.type == TokenType.STRING) { this.ConsumeToken(TokenType.STRING); return(new StringAST(token)); } else if (token.type == TokenType.BOOL) { this.ConsumeToken(TokenType.BOOL); return(new BooleanAST(token)); } else if (token.type == TokenType.PARENLEFT) { this.ConsumeToken(TokenType.PARENLEFT); AST ast = this.Expression(); this.ConsumeToken(TokenType.PARENRIGHT); return(ast); } else if (token.type == TokenType.PLUS) { this.ConsumeToken(TokenType.PLUS); AST ast = new OneOperatorAST(token, this.Factor()); return(ast); } else if (token.type == TokenType.MINUS) { this.ConsumeToken(TokenType.MINUS); AST ast = new OneOperatorAST(token, this.Factor()); return(ast); } else if (token.type == TokenType.LOGICAL_NOT) { this.ConsumeToken(TokenType.LOGICAL_NOT); AST ast = new OneOperatorAST(token, this.Factor()); return(ast); } else { AST ast = this.Variable(); return(ast); } }
/// <summary> /// Traverses unary operation AST /// </summary> /// <param name="ast"></param> /// <returns>OneOperatorAST</returns> private object VisitOneOperatorAST(OneOperatorAST ast) { object component1 = this.VisitNode(ast.expression); if (component1 is bool) { return(!(bool)component1); } else { if (ast.token.type == TokenType.MINUS) { return(-(int)this.VisitNode(ast.expression)); } return(+(int)this.VisitNode(ast.expression)); } }