private ASTAssignment GetASTAssignment(ASTAssignment.AssignmentType type, string variable, ASTExpressionBase expression, ASTMemberAccess memberAccess) { if (!_insideClass) { if (memberAccess != null) { // assigning a member variable from outside the class return(new ASTMemberAssignmentInstance(type, variable, expression, memberAccess.InstanceName)); } else { // assigning a local variable return(new ASTAssignment(type, variable, expression)); } } else { // assigning a member variable from inside the class return(new ASTMemberAssignment(type, variable, expression)); } }
/// <summary> /// <para>Handles *identifier* "[" *tableKey* "]"</para> /// <para>*identifier* "(" *argumentList* ")"</para> /// <para>*identifier* -> *identifier* "(" *argumentList* ")"</para> /// </summary> /// <returns></returns> private ASTExpressionBase ParseExpression9() { ASTExpressionBase expression = ParseExpression10(); while (Match(TokenType.LEFT_PARENTHESIS) || Match(TokenType.ARROW) || Match(TokenType.LEFT_BRACKET)) { switch (_buffer[0].Type) { case TokenType.LEFT_BRACKET: { Consume(); if (expression.Type != ExpressionType.IDENTIFIER) { throw new ParserException($"Table expected.", _lexer.Line, _lexer.Character); } var indexes = new List <ASTExpressionBase>(); while (!Match(TokenType.RIGHT_BRACKET)) { indexes.Add(ParseExpression1()); if (Match(TokenType.COMMA)) { Consume(); } } Require(TokenType.RIGHT_BRACKET); expression = new ASTTableGet(expression, indexes); } break; case TokenType.LEFT_PARENTHESIS: { Consume(); if (expression.Type != ExpressionType.IDENTIFIER) { throw new ParserException($"Function call expected.", _lexer.Line, _lexer.Character); } List <ASTExpressionBase> arguments = new List <ASTExpressionBase>(); while (!Match(TokenType.RIGHT_PARENTHESIS)) { arguments.Add(ParseExpression1()); if (Match(TokenType.COMMA)) { Consume(); } } Require(TokenType.RIGHT_PARENTHESIS); expression = new ASTGlobalFunctionCall((expression as ASTIdentifier).Name, arguments); } break; case TokenType.ARROW: { Consume(); if (expression.Type != ExpressionType.IDENTIFIER) { throw new ParserException($"class object expected.", _lexer.Line, _lexer.Character); } string memberName = Require(TokenType.IDENTIFIER).Text; if (!Match(TokenType.LEFT_PARENTHESIS)) { // return class variable expression = new ASTMemberAccess(memberName, (expression as ASTIdentifier).Name); break; } Require(TokenType.LEFT_PARENTHESIS); List <ASTExpressionBase> arguments = new List <ASTExpressionBase>(); while (!Match(TokenType.RIGHT_PARENTHESIS)) { arguments.Add(ParseExpression1()); if (Match(TokenType.COMMA)) { Consume(); } } Require(TokenType.RIGHT_PARENTHESIS); expression = new ASTMemberFunctionCall(memberName, (expression as ASTIdentifier).Name, arguments); } break; } } return(expression); }