用柠檬“部分解析”

时间:2013-03-17 17:04:42

标签: sql parsing lemon

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

现在我想做一个“部分解析”,例如仅解析表达式或WHERE子句。基本上这意味着我希望%start非终端在运行时更改。我在文档中找不到任何相关内容。柠檬可以吗?

如果不是,我正在考虑做一些让我的自定义起点失败的解析。这感觉就像一个黑客,有更清洁的方式吗?

1 个答案:

答案 0 :(得分:2)

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

为了使这项工作,您必须创建一个愿意接受您感兴趣的任何非终结符的开始状态(例如,SELECT_clause,WHERE_clause)。您可以通过以下方式有效地更改语法来实现此目的:

   GOAL = TOP ;
   RULEn = ... ;
   SG = .... ;

其中SG是次要目标(例如,您的WHERE子句)到

   GOAL = TOP | SG ;
   RULEn = ... ;
   SG = ... ;

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

使用GLR解析器生成器可以轻松实现,它可以处理任何无上下文语法。 (事实上​​,对于我们的DMS软件再造工具包的非终端定义的模式,我们确实这样做了。事实上,我们稍微超过顶部并将每个非终结符号放入目标生成中。疯狂,它允许我们识别语言中任何格式良好(非终结)的短语。