[也在Instaparse邮件列表上发布,但也在这里发布,因为我猜这是一个相当普遍的问题]
考虑语法
D = (B|S)*
S = 'S' B*
B = 'B'(这是英斯塔帕斯的BNF版本.)
B可以自己发生,也可以发生在S之后;如果是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中,并删除其他选项。需要对我的解析器做些什么才能做出这种更改?
这个要旨中显示的更多示例表达式。
发布于 2015-03-21 18:26:20
您可以使用负前瞻来假设S的匹配不能后面跟着有效的B:
(-> "
D = (B|S)*
S = 'S' B* !B
B = 'B'
"
insta/parser
(insta/parses "BSBB"))
;= ([:D [:B "B"] [:S "S" [:B "B"] [:B "B"]]])这也适用于(当前版本的) gist中的所有示例。
https://stackoverflow.com/questions/29185227
复制相似问题