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

时间:2017-06-05 19:41:52

标签: parsing javacc

我正在尝试调整PDDL解析器,并且存在一个可选的令牌。假设这些是我想要阅读的两个选项。 (图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 ")"。 (figure3)

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

问题:如何在.jj中编写代码以支持图1中的两个条件?换句话说,如何通过适当的编程方法使其支持可能不存在的可选标记:isGood

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

他们的意思相同。