private AST Pointer() { if (currentToken.Type == TokenType.TILDE) { Eat(TokenType.TILDE); StringToken nodeToken = new StringToken(TokenType.ID, "Node", currentToken.Line, currentToken.Column, file); return(new IdAST(nodeToken)); } else if (currentToken.Type == TokenType.AT) { Eat(TokenType.AT); StringToken inputToken = new StringToken(TokenType.ID, "InputMarker", currentToken.Line, currentToken.Column, file); return(new IdAST(inputToken)); } else if (currentToken.Type == TokenType.DOLL) { Eat(TokenType.DOLL); StringToken outputToken = new StringToken(TokenType.ID, "OutputSink", currentToken.Line, currentToken.Column, file); return(new IdAST(outputToken)); } StringToken idToken = Eat(TokenType.ID) as StringToken; AST pointerAST = new IdAST(idToken); while (currentToken.Type == TokenType.DOT) { Eat(TokenType.DOT); idToken = Eat(TokenType.ID) as StringToken; pointerAST = new PointerAST(pointerAST, new IdAST(idToken)); } return(pointerAST); }
private object Visit(IdAST idAST) { Symbol symbol = currentScope.Lookup(idAST.Id); if (symbol == null) { TypeSymbol typeSymbol = currentScope.Lookup("Node") as TypeSymbol; Node node = typeSymbol.GetValue() as Node; node.Name = idAST.Id; ModelSymbol modelSymbol = new ModelSymbol(idAST.Id, typeSymbol, node); currentScope.Insert(modelSymbol); return(node); // throw logger.Error(new SemanticException(idAST.FindToken(), $"Undefined variable {idAST.Id}")); } else { return(symbol.GetValue()); } }