【问题标题】:JavaCC: How to parse characters that may not be exist?JavaCC:如何解析可能不存在的字符?
【发布时间】: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 的解决方案都值得赞赏。

【问题讨论】:

  • 不就是(&lt;IS_GOOD&gt;) ?吗?
  • 在这种情况下不起作用。但是,我现在只需将括号更改为方括号即可得到答案。该部分将如下所示>>[LOOKAHEAD(2) &lt;IS_GOOD&gt;]。此代码指出“如果有 则访问它,否则跳过它。感谢您的帮助,我会将这个问题留给其他人。无论如何,我仍然不太确定 LOOKAHEAD 是如何工作的。
  • 在这种情况下,您不需要前瞻规范。只需使用...[ &lt;IS_GOOD&gt; ] &lt;RIGHT_BRACKET&gt;...( &lt;IS_GOOD&gt; )? &lt;RIGHT_BRACKET&gt;
  • @lexicore 抱歉,您是对的,该代码有效。我刚刚注意到您的代码后面有 `?`。

标签: parsing javacc


【解决方案1】:

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

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

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

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

它们的意思是一样的。

【讨论】:

  • 但是,这些很难找到,我尝试了很多解决方案来学习 LOOKAHEAD ......仍然不太确定。请您解释一下 LOOKAHEAD 对我的示例有何影响?
  • 我认为如果你添加一个 LOOKAHEAD(2) 规范,这意味着解析器应该使用最多 2 个标记的前瞻。由于这个例子只需要 1 个令牌,我怀疑在这种情况下添加 LOOKAHEAD(2) 不会有任何区别。为什么不尝试一个实验。生成带有和不带有前瞻规范的代码并比较生成的 java 代码。我的猜测是这两种情况都是一样的。
  • 至于“难找”,前两个在“语法文件”文档中。最后一个在常见问题解答中。
猜你喜欢
  • 2012-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-03
  • 2014-06-12
  • 2021-02-23
相关资源
最近更新 更多