首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用lemon进行“部分解析”

使用lemon进行“部分解析”
EN

Stack Overflow用户
提问于 2013-03-18 01:04:42
回答 1查看 406关注 0票数 2

我有一个使用lemon parser generator构建的SQL grammar。解析命令的正常入口点是一条语句(如SELECT ...),因此在语法中,该语句是我的%start非终结点。到目前为止,一切运行正常。

现在我想做一个“部分解析”,比如只解析一个表达式,或者一个WHERE子句。基本上,这意味着我希望在运行时更改%start非终结符。我在文档中找不到任何关于这方面的东西。在lemon中这是可能的吗?

如果没有,我正在考虑做一些事情,比如让解析在我的自定义起始点失败。这感觉像是一次黑客攻击,有没有更干净的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-18 04:54:48

标准的LALR解析器生成器(如LEMON)不会(实际上不能)让您做您想做的事情。

为此,您必须创建一个start状态,该状态愿意接受您感兴趣的任何非终端(例如,SELECT_clause、WHERE_clause)。您可以通过有效地更改语法来实现这一点:

代码语言:javascript
复制
   GOAL = TOP ;
   RULEn = ... ;
   SG = .... ;

其中SG是进入的次要目标(例如,where子句

代码语言:javascript
复制
   GOAL = TOP | SG ;
   RULEn = ... ;
   SG = ... ;

这样做的坏消息是,LALR状态生成的可接受条件通常会被违反(例如,前视集不再区分缩减),现在您的解析器生成器不再工作。

有了GLR解析器生成器,这就容易多了,它可以处理任何上下文无关的语法。(实际上,我们对DMS软件再工程工具包的非终结点定义的模式正是这样做的。事实上,我们有点过了头,把每个非终结点放在目标产品中。虽然这听起来很疯狂,但它允许我们从语言中识别任何格式良好的(非终结式)短语。

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

https://stackoverflow.com/questions/15463571

复制
相关文章

相似问题

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