private MemberExpressionNode MemberReference() { MemberExpressionNode itsAST; SourceCodePosition itsPos = _currentToken.SourcePosition; IdentifierNode itsName = new IdentifierNode(_currentToken); Accept(Token.TokenType.Identifier); MemberNode itsMember = new SimpleMemberNode(itsName, itsPos); if (_currentToken.Type == Token.TokenType.LeftParen) { CallExpressionNode itsCall = Call(itsName); // add the associated identifier to the call itsMember = new CalledMemberNode(itsMember, itsCall, itsPos); if (_currentToken.Type == Token.TokenType.LeftBracket) { ExpressionNode itsIndex = ArrayExpression(); itsMember = new CalledAndIndexedMemberNode(itsMember, itsCall, itsIndex, itsPos); } } else if (_currentToken.Type == Token.TokenType.LeftBracket) { ExpressionNode itsIndex = ArrayExpression(); itsMember = new IndexedMemberNode(itsMember, itsIndex, itsPos); } while (_currentToken.Type == Token.TokenType.Dot) { Accept(Token.TokenType.Dot); itsName = new IdentifierNode(_currentToken); Accept(Token.TokenType.Identifier); itsMember = new DotMemberNode(itsMember, itsName, itsPos); if (_currentToken.Type == Token.TokenType.LeftParen) { CallExpressionNode itsCall = Call(itsName); // add the associated identifier to the call itsMember = new CalledMemberNode(itsMember, itsCall, itsPos); if (_currentToken.Type == Token.TokenType.LeftBracket) { ExpressionNode itsIndex = ArrayExpression(); itsMember = new CalledAndIndexedMemberNode(itsMember, itsCall, itsIndex, itsPos); } } else if (_currentToken.Type == Token.TokenType.LeftBracket) { ExpressionNode itsIndex = ArrayExpression(); itsMember = new IndexedMemberNode(itsMember, itsIndex, itsPos); } } itsAST = new MemberExpressionNode(itsMember, itsPos); return(itsAST); }
public object Visit(SimpleMemberNode n, object o) { switch (n.Identifier.Value) { case "print": Append("StandardLibrary.Print"); break; case "printLine": Append("StandardLibrary.PrintLine"); break; case "length": Append("StandardLibrary.Length"); break; case "exponential": Append("StandardLibrary.Exponential"); break; case "normal": Append("StandardLibrary.Normal"); break; case "discreteUniform": Append("StandardLibrary.DiscreteUniform"); break; case "continuousUniform": Append("StandardLibrary.ContinuousUniform"); break; default: Append(n.Identifier.Value); break; } return(null); }
public object Visit(SimpleMemberNode n, object o) { return(null); }