示例#1
0
        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()
            });
        }
示例#2
0
 private void EvaluateNode(ObjectPathPartNode path, Context context)
 {
     throw new NotImplementedException();
 }
示例#3
0
文件: Parser.cs 项目: PRGfx/Prgfx.Eel
        // 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()
            });
        }