1

[也张贴在Instaparse 邮件列表上,但也张贴在这里,因为我猜这是一个相当普遍的问题]

考虑语法

 D = (B|S)*
 S = 'S' B*
 B = 'B'

(这是Instaparse的 BNF 版本...)

B 可以单独出现,也可以在 S 之后出现;如果是后者,则应将其视为 er, S 表达式的一部分(不是双关语)。

例子:

(-> "D = (B|S)*
     S = 'S' B*
     B = 'B'"
    parser
    (parses "BSBB"))

;;=>
([:D [:B "B"] [:S "S"] [:B "B"] [:B "B"]]
 [:D [:B "B"] [:S "S" [:B "B"] [:B "B"]]]    ;; <------
 [:D [:B "B"] [:S "S" [:B "B"]] [:B "B"]])

我只希望匹配第二个结果 - 以便在可能的情况下将 B 包含在 S 中,并删除其他选项。需要对我的解析器做什么才能进行此更改?

此要点中显示的更多示例表达式。

4

1 回答 1

2

您可以使用否定前瞻来假设匹配的S后面不能跟有效B的 s:

(-> "

D = (B|S)*
S = 'S' B* !B
B = 'B'

"
insta/parser
(insta/parses "BSBB"))
;= ([:D [:B "B"] [:S "S" [:B "B"] [:B "B"]]])

这也适用于您的要点(当前版本)中的所有示例。

于 2015-03-21T18:26:20.823 回答