首页 > 解决方案 > 如何使用 JAVACC 中的空词作为标记?

问题描述

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

我尝试使用非终端

    void Empty() : 
     {}
     {
     } 

但我收到一个错误

我尝试了一个令牌 < EMPTY : "" > 没有任何效果

我想要一个标记来代表一个空词

标签: compiler-constructionjavacc

解决方案


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


正如JavaCC FAQ 中所解释的,匹配空标记序列的非终结符将是

void Empty() : {}
{
     {}
} 

JavaCC 语法文件的语法不允许expansion_choices为空。但是您可以像上面那样放置一个空的 Java 块。

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

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

或者我可以写

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

这在逻辑上是一样的。


与空字符序列匹配的标记很容易定义

TOKEN: { <EMPTY : ""> }

然而,这可能是个坏主意。如果该标记匹配,那么它将在词法分析器的下一次迭代中再次匹配,并且您将拥有这些标记的无限序列!

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

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

推荐阅读