private Node Obj() { Token <TokenType> t = PeekNextToken(); switch (t.TokenType) { case TokenType.Array: return(Array()); case TokenType.Hash: return(Hash()); case TokenType.Regex: return(Regex()); case TokenType.New: return(New()); case TokenType.Left_Parenthesis: GetNextToken(); Node node = Value(); Token <TokenType> rightToken = GetNextToken(); if (rightToken.TokenType != TokenType.Right_Parenthesis) { ExceptionHelper.ThrowExpectToken(TokenType.Right_Parenthesis, t.Position); } return(node); case TokenType.ID: Token <TokenType> idToken = GetNextToken(); Token <TokenType> next = PeekNextToken(); if (next.TokenType == TokenType.ClassQualifier) { List <string> strList = new List <string>(); strList.Add(idToken.TokenValue); while (next.TokenType == TokenType.ClassQualifier) { GetNextToken(); //Note:Get the :: operator idToken = GetNextToken(); if (idToken.TokenType != TokenType.ID) { ExceptionHelper.ThrowExpectToken(TokenType.ID, idToken.Position); } strList.Add(idToken.TokenValue); next = PeekNextToken(); } return(new ClassQualifierNode(strList)); } else { return(new SimpleNode(idToken)); } case TokenType.String: case TokenType.Long: case TokenType.Decimal: case TokenType.Boolean: Token <TokenType> valToken = GetNextToken(); return(new SimpleNode(valToken)); default: ExceptionHelper.ThrowParseError(t.Position); return(null); } }
private Node Factor() { Node node = Obj(); Token <TokenType> t = PeekNextToken(); while (!t.End) { if (t.TokenType == TokenType.Dot) { GetNextToken(); Token <TokenType> idToken = GetNextToken(); if (idToken.TokenType != TokenType.ID) { ExceptionHelper.ThrowExpectToken(TokenType.ID, idToken.Position); } if (PeekNextToken().TokenType == TokenType.Left_Parenthesis)//Note:Method Call { GetNextToken(); ParamListNode method_param_node = ValueList(); Token <TokenType> rightToken = GetNextToken(); if (rightToken.TokenType != TokenType.Right_Parenthesis) { ExceptionHelper.ThrowExpectToken(TokenType.Right_Parenthesis, rightToken.Position); } MethodNode methodNode = new MethodNode(node, new SimpleNode(idToken), method_param_node); node = methodNode; t = PeekNextToken(); continue; } else//Note:Property { PropertyNode propNode = new PropertyNode(node, new SimpleNode(idToken)); node = propNode; } } else if (t.TokenType == TokenType.Left_Square_Bracket) { GetNextToken(); ParamListNode index_param_node = ValueList(); Token <TokenType> rightToken = GetNextToken(); if (rightToken.TokenType != TokenType.Right_Square_Bracket) { ExceptionHelper.ThrowExpectToken(TokenType.Right_Square_Bracket, rightToken.Position); } IndexerNode indexerNode = new IndexerNode(node, index_param_node); node = indexerNode; } else if (t.TokenType == TokenType.Left_Parenthesis) { GetNextToken(); ParamListNode static_method_param_node = ValueList(); Token <TokenType> rightToken = GetNextToken(); if (rightToken.TokenType != TokenType.Right_Parenthesis) { ExceptionHelper.ThrowExpectToken(TokenType.Right_Parenthesis, t.Position); } MethodNode staticMethodNode = new MethodNode(null, node, static_method_param_node); node = staticMethodNode; } else { break; } t = PeekNextToken(); } return(node); }