private Node Variable() { // VARIABLE_DEF VARIABLE ASSIGN Token variable = Match(TokenType.VARIABLE); VariableNode varNode = new VariableNode(variable.Position, variable.Text); TokenType next = LookAhead(1); if (next == TokenType.LBRACKET) { SourcePosition pos = Match(TokenType.LBRACKET).Position; Node key = Expression(); Match(TokenType.RBRACKET); return new LookupNode(pos, varNode, key); } else if (LookAhead(1) == TokenType.PERIOD) { Match(TokenType.PERIOD); PropertyTreeNode propertyTree = new PropertyTreeNode(varNode.Position, varNode, Property()); if (LookAhead(1) == TokenType.END_STATEMENT) { Match(TokenType.END_STATEMENT); } return propertyTree; } else if (LookAhead(1) == TokenType.COLON) { PropertyNode property = new PropertyNode(variable.Position, variable.Text); Match(TokenType.COLON); Node value = Expression(); if (LookAhead(1) == TokenType.COMMA) Match(TokenType.COMMA); return new AssignNode(property.Position, property, value, true); } else { return varNode; } }
private Node Property() { if (LookAhead(2) == TokenType.LPAREN) { return FunctionCall(); } else { Token varToken = Match(TokenType.VARIABLE); if (LookAhead(1) == TokenType.PERIOD) { Match(TokenType.PERIOD); Node propNode = new PropertyNode(varToken.Position, varToken.Text); return new PropertyTreeNode(propNode.Position, propNode, Property()); } else if (LookAhead(1) == TokenType.ASSIGN) { Match(TokenType.ASSIGN); Node value = Expression(); PropertyNode propNode = new PropertyNode(varToken.Position, varToken.Text); return new AssignNode(propNode.Position, propNode, value, true); } else { return new PropertyNode(varToken.Position, varToken.Text); } } }