如何使用空字JavaCC的作为令牌?

问题描述 投票:0回答:2

我设置了使用JavaCC的解析器,我想用一句空话作为令牌(ε - 字)

我试图用一个非终端

    void Empty() : 
     {}
     {
     } 

但我得到一个错误

我尝试了令牌<EMPTY:“”>毫无效果

我想一个标记来表示一个空字

compiler-construction javacc
2个回答
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 }

0
投票

读了许多问题和文章后,我发现我用{}和它工作得很好

© www.soinside.com 2019 - 2024. All rights reserved.