Parsing JavaCC:如何解析可能不存在的字符?
我正在尝试调整PDDL解析器,并且存在一个可选的令牌。假设这是我想读的两个选项。 (图1) 为了支持这两种情况,我在.jj中开发了如下图2所示的代码。它工作正常;然而,这样写是不合适的。 (图2) 问题:如何在.jj中编写代码以支持图1中的两种条件?换句话说,如何使其支持可选令牌Parsing JavaCC:如何解析可能不存在的字符?,parsing,javacc,Parsing,Javacc,我正在尝试调整PDDL解析器,并且存在一个可选的令牌。假设这是我想读的两个选项。 (图1) 为了支持这两种情况,我在.jj中开发了如下图2所示的代码。它工作正常;然而,这样写是不合适的。 (图2) 问题:如何在.jj中编写代码以支持图1中的两种条件?换句话说,如何使其支持可选令牌:isGood,而这些令牌可能不存在于适当的编程方法中 我可能不知道前瞻是如何运作的。非常感谢阅读图1的任何解决方案。在这种情况下,您不需要前瞻性规范。只用 <LEFT_BRACKET> <NODE&g
:isGood
,而这些令牌可能不存在于适当的编程方法中
我可能不知道前瞻是如何运作的。非常感谢阅读图1的任何解决方案。在这种情况下,您不需要前瞻性规范。只用
<LEFT_BRACKET>
<NODE>
[ <IS_GOOD> ]
<RIGHT_BRACKET>
[ ]
或
( )?
或
( | {} )
它们的意思是一样的。在这种情况下不起作用的不只是
()?
。然而,我现在得到了答案,只是把括号改成了方括号。该部分将如下所示>[LOOKAHEAD(2)]
。此代码声明“如果有访问权限,则跳过它。我感谢您的帮助,我会将此问题留给其他人。无论如何,我仍然不太确定前瞻是如何工作的。在这种情况下,您不需要前瞻规范。只需使用…[]
或…()?
@lexicore抱歉,你是对的,代码是有效的。我只是注意到在你的代码后面有“?”。但是,这些都很难找到,我尝试了很多解决方案来学习前瞻性…仍然不能很好地确定。请你解释一下前瞻性对我的示例有什么影响?我想如果你添加一个前瞻性(2)
规范,这意味着解析器应该使用最多2个令牌的先行。由于本例只需要1个令牌,我怀疑添加先行(2)
在这种情况下不会有任何区别。为什么不尝试一个实验。生成有前瞻性规范和没有前瞻性规范的代码,并比较生成的java代码。我猜这两种情况下都是一样的。至于“难以找到”,前两个在“语法文件”文档中。最后一个在常见问题解答中。
<LEFT_BRACKET>
<NODE>
(LOOKAHEAD(2) <IS_GOOD> <RIGHT_BRACKET> | <RIGHT_BRACKET>)
<LEFT_BRACKET>
<NODE>
(LOOKAHEAD(2) <IS_GOOD>) // this is where it should support an optional token
<RIGHT_BRACKET>
<LEFT_BRACKET>
<NODE>
[ <IS_GOOD> ]
<RIGHT_BRACKET>
<LEFT_BRACKET>
<NODE>
( <IS_GOOD> )?
<RIGHT_BRACKET>
<LEFT_BRACKET>
<NODE>
( <IS_GOOD> | {} )
<RIGHT_BRACKET>