解决简单 Instaparse 语法中的歧义
Resolving ambiguity in simple Instaparse grammar
[也发布在 Instaparse mailing list 上,但也发布在这里,因为我猜这是一个相当普遍的问题]
考虑语法
D = (B|S)*
S = 'S' B*
B = 'B'
(这是 Instaparse 的 BNF 版本...)
B可以单独出现,也可以出现在S之后;如果是后者,它应该被认为是,呃,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 中,并删除其他选项。需要对我的解析器做些什么才能进行此更改?
this gist 中显示了更多示例表达式。
您可以使用否定前瞻来假设 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"]]])
这也适用于您的要点(的当前版本)中的所有示例。
[也发布在 Instaparse mailing list 上,但也发布在这里,因为我猜这是一个相当普遍的问题]
考虑语法
D = (B|S)*
S = 'S' B*
B = 'B'
(这是 Instaparse 的 BNF 版本...)
B可以单独出现,也可以出现在S之后;如果是后者,它应该被认为是,呃,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 中,并删除其他选项。需要对我的解析器做些什么才能进行此更改?
this gist 中显示了更多示例表达式。
您可以使用否定前瞻来假设 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"]]])
这也适用于您的要点(的当前版本)中的所有示例。