JavaCC:如何解析可能不存在的字符?

JavaCC: How to parse characters that may not be exist?

我正在尝试调整 PDDL 解析器,并且有一个标记是可选的。假设这些是我想阅读的 2 个选项。 (图1)

(node1)
(node1 :isGood)               // :isGood is optional to be exist

为了支持这两种情况,我在 .jj 中开发了代码,如下图 2 所示。它工作正常;但是,这样写是不合适的。 (图2)

<LEFT_BRACKET>
<NODE>
(LOOKAHEAD(2) <IS_GOOD> <RIGHT_BRACKET> | <RIGHT_BRACKET>)

.jj 中我真正想要的代码应该如下图 3 所示。从图 3 中,它从 .jj 成功解析,但无法解析图 1 中的脚本,我从中收到了 unexpected token ")"。 (图3)

<LEFT_BRACKET>
<NODE>
(LOOKAHEAD(2) <IS_GOOD>)      // this is where it should support an optional token
<RIGHT_BRACKET>

问题:如何在.jj中编写代码以支持图1中的两种情况?换句话说,如何让它支持可选的令牌:isGood,而通过适当的编程方法可能不存在。

我可能不知道 LOOKAHEAD 是如何工作的。任何阅读图 1 的解决方案都是值得赞赏的。

在这种情况下,您不需要先行规范。只需使用

<LEFT_BRACKET>
<NODE>
[ <IS_GOOD> ]
<RIGHT_BRACKET>

<LEFT_BRACKET>
<NODE>
( <IS_GOOD> )?
<RIGHT_BRACKET>

<LEFT_BRACKET>
<NODE>
( <IS_GOOD> | {} )
<RIGHT_BRACKET>

他们的意思是一样的。