我有一个使用lemon parser generator构建的SQL grammar。解析命令的正常入口点是一条语句(如SELECT ...),因此在语法中,该语句是我的%start非终结点。到目前为止,一切运行正常。
现在我想做一个“部分解析”,比如只解析一个表达式,或者一个WHERE子句。基本上,这意味着我希望在运行时更改%start非终结符。我在文档中找不到任何关于这方面的东西。在lemon中这是可能的吗?
如果没有,我正在考虑做一些事情,比如让解析在我的自定义起始点失败。这感觉像是一次黑客攻击,有没有更干净的方法?
发布于 2013-03-18 04:54:48
标准的LALR解析器生成器(如LEMON)不会(实际上不能)让您做您想做的事情。
为此,您必须创建一个start状态,该状态愿意接受您感兴趣的任何非终端(例如,SELECT_clause、WHERE_clause)。您可以通过有效地更改语法来实现这一点:
GOAL = TOP ;
RULEn = ... ;
SG = .... ;其中SG是进入的次要目标(例如,where子句
GOAL = TOP | SG ;
RULEn = ... ;
SG = ... ;这样做的坏消息是,LALR状态生成的可接受条件通常会被违反(例如,前视集不再区分缩减),现在您的解析器生成器不再工作。
有了GLR解析器生成器,这就容易多了,它可以处理任何上下文无关的语法。(实际上,我们对DMS软件再工程工具包的非终结点定义的模式正是这样做的。事实上,我们有点过了头,把每个非终结点放在目标产品中。虽然这听起来很疯狂,但它允许我们从语言中识别任何格式良好的(非终结式)短语。
https://stackoverflow.com/questions/15463571
复制相似问题