JAVACC中如何使用空字作为token?

how to use the empty word in JAVACC as a token?

我正在使用 JavaCC 设置解析器,我想使用空词作为标记(epsilon 词)

我尝试使用非终端

    void Empty() : 
     {}
     {
     } 

但我收到一个错误

我尝试了一个令牌 <空:“”> 什么都没用

我想要一个token来表示一个空词

我找到了解决办法 我用了 { } 效果很好

您想要一个空字符序列的标记还是匹配一个空标记序列的非终结符?


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 }