使用JavaCC和JJTree创建解析器时,如果这些解析器有一代或多代子节点,则会出现迭代非终结符的问题。
尝试类似
的内容A A() :
{}
{
"a" ( B() )* ["c" C() ]
<EOF>
{return jjtThis; }
}
void B() :
{}
{
"b" { jjtThis.value += "b"; }
}
void C() :
{}
{
( <CTOKEN> { jjtThis.value += token.image; } )*
{ jjtThis.value += token.image; }
}
完美无缺。但是,只要其中一个重复的非终结符有子项,结果语法树就会忘记&#34;第一个孩子,只保留最后一个。例如,使用以下语法
void ClassBody() :
{}
{
"{"
(
ClassBodyDeclaration()
)*
"}"
}
void ClassBodyDeclaration()
{}
{ /* contains a whole chain of further grammar rules...
只保留最后一个ClassBodyDeclaration节点并忘记之前的节点。
查看JJTree生成的代码(特别是JJTMyGrammarState.java和SimpleNode.java),在我看来,这段代码并没有包含任何内容。在关于JJTree的文档中,以及在网络上我无法找到关于此主题的任何内容。很可能你应该在(...)*中插入一些JJTree调用,但open / closeNodeScope并不能解决问题。
是否有人遇到同样的问题,是否已有解决方案?
迪特