【发布时间】:2017-06-05 19:41:51
【问题描述】:
我正在尝试调整 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 的解决方案都值得赞赏。
【问题讨论】:
-
不就是
(<IS_GOOD>) ?吗? -
在这种情况下不起作用。但是,我现在只需将括号更改为方括号即可得到答案。该部分将如下所示>>
[LOOKAHEAD(2) <IS_GOOD>]。此代码指出“如果有则访问它,否则跳过它。感谢您的帮助,我会将这个问题留给其他人。无论如何,我仍然不太确定 LOOKAHEAD 是如何工作的。 -
在这种情况下,您不需要前瞻规范。只需使用
...[ <IS_GOOD> ] <RIGHT_BRACKET>或...( <IS_GOOD> )? <RIGHT_BRACKET>。 -
@lexicore 抱歉,您是对的,该代码有效。我刚刚注意到您的代码后面有 `?`。