private ObjectPathNode ParseObjectPath(Lexer lexer) { var parts = new List <ObjectPathPartNode>(); ObjectPathPartNode first = null; var methodCall = ReturnOrBacktrack <MethodCallNode>(ParseMethodCall, lexer); if (methodCall == null) { var identifier = ParseIdentifier(lexer); first = new StaticObjectPathPartNode() { name = identifier }; } else { first = methodCall; } parts.Add(first); while (lexer.Is('.')) { ObjectPathPartNode part = null; part = ReturnOrBacktrack <MethodCallNode>(ParseMethodCall, lexer); if (part != null) { parts.Add(part); } if (part == null) { part = new StaticObjectPathPartNode() { name = ParseIdentifier(lexer) }; parts.Add(part); } part = ReturnOrBacktrack <OffsetAccessNode>(ParseOffsetAccess, lexer); } return(new ObjectPathNode() { path = parts.ToArray() }); }
// PathPart: [<identifier>(<arrayAccess>)(<methodArguments>)] // ^- is this correct? can we call a function from array access? // PathPart(.PathPart)* protected ObjectPathNode ParseObjectPath() { var parts = new List <ObjectPathPartNode>(); while (true) { ObjectPathPartNode part = ReturnOrBacktrack(ParseMethodCall); if (part == null) { if (PeekToken().Type == TokenType.IDENTIFIER) { part = new StaticObjectPathPartNode() { name = (string)NextToken().Payload }; } } if (part == null) { throw new ParserException("Could not parse object path, unexpected Token " + PeekToken().Type); } else { parts.Add(part); } var offsetAccess = ParseOffsetAccess(); if (offsetAccess != null) { parts.Add(offsetAccess); } if (PeekToken().Type == TokenType.DOT) { NextToken(); continue; } break; } /* ObjectPathPartNode first = ReturnOrBacktrack(ParseMethodCall); * if (first == null) * { * if (PeekToken().Type == TokenType.IDENTIFIER) * { * first = new StaticObjectPathPartNode() { name = (string)NextToken().Payload }; * } * // else * // { * // throw new ParserException("Could not parse object path, unexpected Token " + PeekToken().Type); * // } * } * if (first == null) * { * throw new ParserException("Could not parse object path, unexpected Token " + PeekToken().Type); * } * else * { * parts.Add(first); * } * while (PeekToken().Type == TokenType.DOT) * { * NextToken(); * var methodCall = ParseMethodCall(); * if (methodCall == null) * { * if (PeekToken().Type == TokenType.IDENTIFIER) * { * var part = new StaticObjectPathPartNode() { name = (string)NextToken().Payload }; * parts.Add(part); * } * } * else * { * parts.Add(methodCall); * } * var objectAccess = ParseOffsetAccess(); * if (objectAccess != null) * { * parts.Add(objectAccess); * } * } */ return(new ObjectPathNode() { path = parts.ToArray() }); }