Я построил грамматику в antlr4 для json-подобного языка.
Файл Gramar: https://github.com/antlr/grammars-v4/tree/master/json
Как мне пересечь дерево с помощью функции "Посещение"? До сих пор у меня есть код ниже, который выводит поток токенов, но мне придется снова проанализировать его с помощью правил регулярного выражения, чтобы получить элементы и значения.
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
Там должен быть GramatikaParserBaseVisitor<T>
где-то вокруг которого можно использовать как базовый класс.
Затем вы можете переопределить виртуальные функции, такие как (здесь: T == object
) object VisitStart(StartContext context)
, аргумент которого имеет более богатый интерфейс, чем IParseTree
и вы можете получить доступ к IParseTree
по имени, и они также печатаются, т.е. типа <Child>Context
вместо простого IParseTree
.