我正在尝试调整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的任何解决方案都是值得赞赏的。
答案 0 :(得分:2)
在这种情况下,您不需要超前规范。只需使用
<LEFT_BRACKET>
<NODE>
[ <IS_GOOD> ]
<RIGHT_BRACKET>
或
<LEFT_BRACKET>
<NODE>
( <IS_GOOD> )?
<RIGHT_BRACKET>
或
<LEFT_BRACKET>
<NODE>
( <IS_GOOD> | {} )
<RIGHT_BRACKET>
他们的意思相同。