首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简单Instaparse语法中歧义的消解

简单Instaparse语法中歧义的消解
EN

Stack Overflow用户
提问于 2015-03-21 16:41:01
回答 1查看 107关注 0票数 1

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

考虑语法

代码语言:javascript
复制
 D = (B|S)*
 S = 'S' B*
 B = 'B'

(这是英斯塔帕斯的BNF版本.)

B可以自己发生,也可以发生在S之后;如果是S,则应该被认为是,呃,S表达式的一部分(没有双关意)。

示例:

代码语言:javascript
复制
(-> "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中,并删除其他选项。需要对我的解析器做些什么才能做出这种更改?

这个要旨中显示的更多示例表达式。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-21 18:26:20

您可以使用负前瞻来假设S的匹配不能后面跟着有效的B

代码语言:javascript
复制
(-> "

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29185227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档