Если вы посмотрите на класс SimpleNode, вы заметите, что его экземпляры автоматически хранят ссылки на их родительские и дочерние узлы (если их создание не было подавлено с помощью #void).Например, ваш корневой узел будет содержать ссылки на 0..1 узлы Section1, 0..1 узлы Section2 и 0 .. * узлы Section3, и к ним можно получить доступ с помощью метода jjtGetChild (), который возвращает объект Node.Чтобы определить, является ли этот дочерний узел узлом Section1, Section2 или Section3, вы можете вызвать его метод toString () (как это делает dump ()).
В качестве альтернативы, если вам надоест этот стиль наивной итерации Nodeи для проверки toString вы можете определить свои собственные типы узлов вместо того, чтобы полагаться на реализацию SimpleNode.В моем примере ниже, Start () теперь возвращает собственный RootNode вместо простого SimpleNode.RootNode содержит конкретные ссылки на свои дочерние узлы (определите для них методы getter, как вам удобно).Обратите внимание, что мой краткий фрагмент предполагает, что Section1 / 2/3 () возвращает все пользовательские узлы, но это не имеет , как в случае ... из того, что вы сказали, вы бы хотели, чтобы пользовательский узелSection3 (), но если Section1 / 2 тривиальны, вы можете оставить их как SimpleNodes.
RootNode Start() :
{
Section1Node s1Node = null;
Section2Node s2Node = null;
List s3Nodes = new LinkedList();
Section3Node s3Node = null;
}
{
(
( s1Node = Section1() )?
( s2Node = Section2() )?
( s3Node = Section3() {s3Nodes.add(s3Node); } )*
) {
return new RootNode(s1Node, s2Node, s3Nodes);
}
}
Если вы пересекаете дерево разбора и выполняете сложные операции с вашими узлами, это может быть хорошей идеей дляпереместите часть этого в класс посетителя , чтобы то, что вы делаете со своими узлами, было отделено от самих классов узлов.Вы можете получить несколько классов посетителей, каждый из которых выполняет функцию в дереве синтаксического анализа и имеет перегрузки метода посещения для каждого типа узла.
Дайте мне знать, если что-то вы не понимаете.Я не эксперт по JavaCC (я использовал его в универе один раз), но я должен быть в состоянии помочь вам:)