2

如何在 JavaCC 中定义 Epsilon?我正在尝试类似的东西

< EPSILON: "">

但它不起作用。

4

2 回答 2

1

由于我也在寻找一种使用空词epsilon的方法,所以我想出了以下方法。

我只是使用了一个空的生产规则,例如:

void Empty () : { } { System.out.prntln("epsilon"); }

希望它有效 - 至少现在看起来如此......

附录:

它工作得很好:)

于 2014-05-26T20:54:50.857 回答
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空字符串就不能立即匹配。EOFEOF

于 2012-11-08T22:32:10.380 回答