如何在JavaCC中定义Epsilon? 我正在尝试像
这样的东西< EPSILON: "">
但它不起作用。
答案 0 :(得分:1)
如果令牌管理器然后切换到词法状态,您可以定义一个令牌以匹配空字符串,在该状态中,在返回到匹配空字符串的状态之前,将消耗至少一个字符。所以:
TOKEN : {
< EMPTY : "" >
: MATCH_NON_EMPTY // change state, or infinite matches of the empty string could result
}
<MATCH_NON_EMPTY>
TOKEN : {
< NON_EMPTY : ~[] >
}
void Start() : { } {
<EMPTY> <NON_EMPTY>
}
对于任何单字符输入,这都可以正常工作。
但是,我应该提一个警告。似乎EOF
的匹配被认为比空字符串的匹配“更长”,因此在EOF
之前,如果EOF
没有一些词法动作魔法,则无法立即匹配空字符串匹配。
答案 1 :(得分:1)
由于我也在寻找一种方法来使用空字 epsilon ,我想出了以下方法。
我只是使用了一个空的生产规则,例如:
void Empty () : { } { System.out.prntln("epsilon"); }
希望它有效 - 至少现在似乎是这样......
<强>附录:强>
它工作得很好:)。