JavaCC中的Epsilon定义

时间:2012-06-23 17:20:46

标签: java compiler-construction javacc

如何在JavaCC中定义Epsilon? 我正在尝试像

这样的东西
< EPSILON: "">

但它不起作用。

2 个答案:

答案 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"); }

希望它有效 - 至少现在似乎是这样......

<强>附录:

它工作得很好:)。