JJTree似乎无法正常使用(Nonterminal())*

时间:2015-06-23 09:08:01

标签: iteration grammar javacc

使用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并不能解决问题。

是否有人遇到同样的问题,是否已有解决方案?

迪特

0 个答案:

没有答案