如何使用JAVACC中的空词作为令牌?

时间:2019-02-01 11:15:42

标签: compiler-construction javacc

我正在使用JavaCC设置解析器,并且希望将空字用作令牌(epsilon字)

我尝试使用非终端

    void Empty() : 
     {}
     {
     } 

但是我遇到错误

我尝试了令牌                  <空:“”> 没有任何作用

我希望令牌代表一个空词

2 个答案:

答案 0 :(得分:1)

您想要的令牌是一个空字符序列还是一个非终端符,它与令牌的空序列匹配?


the JavaCC FAQ中所述,与空令牌序列匹配的非终结符将是

void Empty() : {}
{
     {}
} 

The syntax of the JavaCC grammar files不允许expansion_choices为空。但是您可以如上所述放置一个空的Java块。

但是,如果您有此非终结符,则Empty(){}相同。例如,我可以写

 void SomeNonterminal() : {}
 {
     A() B() C()
 |
     Empty() 
 }

或者我可以写

 void SomeNonterminal() : {}
 {
     A() B() C()
 |
     {}
 }

在逻辑上是同一件事。


与空字符序列匹配的令牌很容易定义

TOKEN: { <EMPTY : ""> }

但是,这可能不是一个好主意。如果此令牌匹配,则它将在词法分析器的下一次迭代中再次匹配,并且您将有这些令牌的无限序列!

唯一有意义的时间是将词法分析器从一个词法状态带入另一个词法状态。例如。

 <SOMESTATE> TOKEN: { <EMPTY : ""> : DEFAULT }

答案 1 :(得分:0)

阅读许多问题和文章后,我发现了它 我用了  {} 效果很好