【问题标题】:"Partial parsing" with lemon用柠檬“部分解析”
【发布时间】:2013-03-17 17:04:42
【问题描述】:

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

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

如果不是,我正在考虑做一些事情,比如让解析在我的自定义起点失败。这感觉就像一个 hack,有没有更清洁的方法?

【问题讨论】:

    标签: sql parsing lemon


    【解决方案1】:

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

    要完成这项工作,您必须创建一个开始状态,该状态愿意接受您感兴趣的任何非终结符(例如,SELECT_clause、WHERE_clause)。你可以通过有效地改变语法来做到这一点:

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

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

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

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

    使用 GLR 解析器生成器要容易得多,它可以处理任何上下文无关语法。 (事实上​​,对于我们的 DMS 软件再工程工具包的非终结符定义的模式,我们确实做到了这一点。事实上,我们有点过头了,并将 每个 非终结符都放在了目标生成中。虽然这听起来太疯狂了,它允许我们从语言中识别任何格式良好的(非终结符)短语。

    【讨论】:

    • 感谢您的详细解答!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    相关资源
    最近更新 更多