树评估

时间:2014-06-11 12:13:44

标签: c# antlr antlr4

我在antlr4中为类似json的语言构建了一个语法。

Gramar文件:https://github.com/antlr/grammars-v4/tree/master/json

如何使用Visit功能遍历树?到目前为止,我有代码流,它输出令牌流,但我必须用正则表达规则再次解析它,以获得成员和值。

public void Visit(IParseTree tree)
    {
        for (int i = 0; i < tree.ChildCount; i++)
        {
            if (tree.GetChild(i).ChildCount > 0)
            {
                Visit(tree.GetChild(i));

            }
            else
            {
                Console.WriteLine(tree.GetChild(i).ToString());
            }
        }
    }

我得到了树:

        GramatikaLexer lexer = new GramatikaLexer(inputStream);
        CommonTokenStream commonTokenStream = new CommonTokenStream(lexer);
        GramatikaParser parser = new GramatikaParser(commonTokenStream);

        IParseTree tree = parser.start(); // start is entry point in .g4 file

1 个答案:

答案 0 :(得分:0)

应该有一个GramatikaParserBaseVisitor<T>可以用作基类。

然后您可以覆盖虚拟函数,例如(此处:T == objectobject VisitStart(StartContext context),其参数的界面比IParseTree更丰富,您可以按名称访问子项,它们也是类型,即类型<Child>Context而不仅仅是IParseTree {{1}}。