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>
他们的意思是一样的。
我正在尝试调整 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>
他们的意思是一样的。