我使用SQL grammar构建了lemon parser generator。解析命令的正常入口点是语句(如SELECT ...
),因此语句是语法中的%start
非终端。到目前为止一切正常。
现在我想做一个“部分解析”,例如仅解析表达式或WHERE
子句。基本上这意味着我希望%start
非终端在运行时更改。我在文档中找不到任何相关内容。柠檬可以吗?
如果不是,我正在考虑做一些让我的自定义起点失败的解析。这感觉就像一个黑客,有更清洁的方式吗?
答案 0 :(得分:2)
标准的LALR解析器生成器(如LEMON)不会(实际上不能)让你做你想做的事。
为了使这项工作,您必须创建一个愿意接受您感兴趣的任何非终结符的开始状态(例如,SELECT_clause,WHERE_clause)。您可以通过以下方式有效地更改语法来实现此目的:
GOAL = TOP ;
RULEn = ... ;
SG = .... ;
其中SG是次要目标(例如,您的WHERE子句)到
GOAL = TOP | SG ;
RULEn = ... ;
SG = ... ;
这样做的坏消息是LALR状态生成可接受的条件通常会被违反(例如,前瞻设置不再区分缩减),现在您的解析器生成器不再有效。
使用GLR解析器生成器可以轻松实现,它可以处理任何无上下文语法。 (事实上,对于我们的DMS软件再造工具包的非终端定义的模式,我们确实这样做了。事实上,我们稍微超过顶部并将每个非终结符号放入目标生成中。疯狂,它允许我们识别语言中任何格式良好(非终结)的短语。