public Node ParseAssignment() { Node left = ParseOr(); if (match(TokenType.EQUAL)) { Node right = ParseAssignment(); if (left is VariableNode) { Token name = ((VariableNode)left).variable; return(new AssignNode(name, right, ((VariableNode)left).is_global)); } else if (left is TableGetNode) { TableGetNode get = (TableGetNode)left; return(new TableSetNode(get.value, get.get_name, right)); } else if (left is TableGetExprNode) { TableGetExprNode get = (TableGetExprNode)left; return(new TableSetExprNode(get.value, get.get_expr, right)); } } return(left); }
public Node ParseGetAndCall() { Node left = ParsePrimary(); while (true) { if (match(TokenType.LEFT_PAREN)) { left = FinishParseCall(left); } else if (match(TokenType.DOT)) { Token name = consume(TokenType.IDENTIFIER, "Expected property name after '.'"); left = new TableGetNode(left, name); } else if (match(TokenType.POINTER_ARROW)) { Token name = consume(TokenType.IDENTIFIER, "Expected function name after '->'"); left = new TableGetNode(left, name, true); } else if (match(TokenType.LEFT_SQR)) { if (match(TokenType.RIGHT_SQR)) { throw error(previous(), "Expected expression inside indexing"); } Node index_expr = ParseExpression(); consume(TokenType.RIGHT_SQR, "Expected ']' after indexing expression"); left = new TableGetExprNode(left, index_expr); } else { break; } } return(left); }