private void is_function_or_array(ref InlineExpressionNode inline, ref InlineExpressionNode inline_p) { if (inline_p.primary is FunctionCallExpressionNode) { if (((FunctionCallExpressionNode)inline_p.primary).identifier == null) { ((FunctionCallExpressionNode)inline_p.primary).identifier = inline.primary as IdNode; inline.primary = inline_p.primary; inline.nextExpression = null; } } else if (inline_p.primary is ArrayAccessExpressionNode) { if (((ArrayAccessExpressionNode)inline_p.primary).identifier == null) { ((ArrayAccessExpressionNode)inline_p.primary).identifier = inline.primary as IdNode; inline.primary = inline_p.primary; inline.nextExpression = null; } } else if (inline_p.primary is PostAdditiveExpressionNode) { if (((PostAdditiveExpressionNode)inline_p.primary).primary == null) { ((PostAdditiveExpressionNode)inline_p.primary).primary = inline.primary as PrimaryExpressionNode; inline.primary = inline_p.primary; inline.nextExpression = null; } } }
/*primary-expression-p: | '.' identifier primary-expression-p | optional-funct-or-array-call primary-expression-p | increment-decrement primary-expression-p | EPSILON */ private void primary_expression_p(ref InlineExpressionNode inline) { printIfDebug("primary_expression_p"); if (pass(TokenType.PUNT_ACCESOR)) { consumeToken(); if (!pass(TokenType.ID)) { throwError("identifier expected"); } var identifier = new IdNode(token.lexeme, token); consumeToken(); // var nextExpression = new AccessorNode(identifier,identifier.token); var inline_p = new InlineExpressionNode(identifier, identifier.token); if (inline_p.primary is FunctionCallExpressionNode || inline_p.primary is ArrayAccessExpressionNode) { is_function_or_array(ref inline, ref inline_p); primary_expression_p(ref inline); } else { primary_expression_p(ref inline_p); inline.nextExpression = inline_p; } } else if (pass(TokenType.PUNT_PAREN_OPEN, TokenType.PUNT_SQUARE_BRACKET_OPEN)) { var accessOrCall = optional_funct_or_array_call(); var inline_p = new InlineExpressionNode(accessOrCall, accessOrCall.token); if (accessOrCall is FunctionCallExpressionNode || accessOrCall is ArrayAccessExpressionNode) { is_function_or_array(ref inline, ref inline_p); primary_expression_p(ref inline); } else { primary_expression_p(ref inline_p); inline.nextExpression = inline_p; } } else if (pass(TokenType.OP_PLUS_PLUS, TokenType.OP_MINUS_MINUS)) { var operatorToken = token; consumeToken(); var postOp = new PostAdditiveExpressionNode(operatorToken.type, operatorToken); var inline_p = new InlineExpressionNode(postOp, operatorToken); if (inline_p.primary is PostAdditiveExpressionNode) { is_function_or_array(ref inline, ref inline_p); primary_expression_p(ref inline); } else { primary_expression_p(ref inline_p); inline.nextExpression = inline_p; } // inline.nextExpression = inline_p; } else { // return null; } }
/*primary-expression: | "new" instance-expression primary-expression-p | literal primary-expression-p | identifier primary-expression-p | '(' expression ')' primary-expression-p | "this" primary-expression-p | "base" primary-expression-p | "null" | type primary-expression-p*/ private InlineExpressionNode primary_expression() { printIfDebug("primary_expression"); if (pass(TokenType.RW_NEW)) { var NewToken = token; consumeToken(); var instance = instance_expression(); var inline = new InlineExpressionNode(instance, NewToken); primary_expression_p(ref inline); return(inline); } else if (pass(literalOptions)) { var literalToken = token; consumeToken(); PrimaryExpressionNode literal = null; if (literalToken.type == TokenType.LIT_INT) { literal = new LiteralIntNode(literalToken.lexeme, literalToken); } else if (literalToken.type == TokenType.LIT_FLOAT) { literal = new LiteralFloatNode(literalToken.lexeme, literalToken); } else if (literalToken.type == TokenType.LIT_BOOL) { literal = new LiteralBoolNode(literalToken.lexeme, literalToken); } else if (literalToken.type == TokenType.LIT_CHAR) { literal = new LiteralCharNode(literalToken.lexeme, literalToken); } else if (literalToken.type == TokenType.LIT_STRING) { literal = new LiteralStringNode(literalToken.lexeme, literalToken); } var inline = new InlineExpressionNode(literal, literalToken); primary_expression_p(ref inline); return(inline); } else if (pass(TokenType.ID)) { var identifier = new IdNode(token.lexeme, token); consumeToken(); var inline = new InlineExpressionNode(identifier, identifier.token); primary_expression_p(ref inline); return(inline); } else if (pass(TokenType.PUNT_PAREN_OPEN)) { var parentizedToken = token; consumeToken(); var exp = expression(); if (!pass(TokenType.PUNT_PAREN_CLOSE)) { throwError(") expected"); } consumeToken(); var groupedExp = new GroupedExpressionNode(exp, exp.token); var inline = new InlineExpressionNode(groupedExp, parentizedToken); primary_expression_p(ref inline); return(inline); } else if (pass(TokenType.RW_THIS)) { var thisToken = token; consumeToken(); var thisExp = new ThisReferenceAccsessNode(thisToken); var inline = new InlineExpressionNode(thisExp, thisToken); primary_expression_p(ref inline); return(inline); } else if (pass(TokenType.RW_BASE)) { var baseToken = token; consumeToken(); var baseExp = new BaseReferenceAccessNode(baseToken); var inline = new InlineExpressionNode(baseExp, baseToken); primary_expression_p(ref inline); return(inline); } else if (pass(TokenType.RW_NULL)) { var nullToken = token; consumeToken(); var nullExp = new NullExpressionNode(nullToken); var inline = new InlineExpressionNode(nullExp, nullToken); // primary_expression_p(ref inline); return(inline); } else if (pass(typesOptions)) { var type = types(); var inline = new InlineExpressionNode(new IdNode(type.ToString(), type.token), type.token); primary_expression_p(ref inline); return(inline); } else { throwError("new, literal, identifier, '(' or \"this\" expected"); } return(null); }