如何解析上下文敏感的语法?

时间:2015-04-07 02:22:15

标签: parsing context-free-grammar context-sensitive-grammar

CSG类似于CFG,但减少符号是多个。

那么,我可以使用CFG解析器解析CSG,减少生产到多个终端或非终端吗?

1. S → a bc
2. S → a S B c
3. c B → W B
4. W B → W X
5. W X → B X
6. B X → B c
7. b B → b b

当我们见到W X时,我们可以将W X缩减为W B吗?

当我们见到W B时,我们可以将W B缩减为c B吗?

因此,如果CSG解析器基于CFG解析器,那么写起来并不难,是真的吗?

但是当我检查维基时,它说要解析CSG,我们应该使用linear bounded automaton

什么是linear bounded automaton

2 个答案:

答案 0 :(得分:6)

上下文敏感语法非确定性。所以你不能假设减少会发生,只是因为RHS恰好在推导中的某个点可见。

LBA(线性有界自动机)也是非确定性的,因此它们实际上并不是一种实用的算法。 (您可以使用回溯模拟一个,但是执行解析可能花费的时间没有方便的限制。)它们是CSG的接受者这一事实对于解析理论很有意义,但对于解析练习并不是真的。

与CFG一样,有不同类别的CSG。一些受限制的CSG子类更易于解析(例如,CFG是一个子类),但我不相信对实际应用的调查很多;在实践中,CSG难以编写,并且没有明显类似的解析树可以从派生构造。

要获得更多阅读,您可以从wikipedia entry on LBAs开始,然后继续关注其引用。祝你好运。

答案 1 :(得分:0)

Nearley解析器生成器能够使用postprocessors解析一些简单的上下文相关模式。

可以编写与to be or not to beto do or not to do而不是to be or not to do匹配的上下文相关规则:

# "_" is whitespace, "word" is a single word
example_rule -> "to" _ word _ "or" _ "not" _ "to" _ word {%
    function(d,l, reject) {
        if (d[2] !== d[10]) {
            return reject;
        } else {
            return {d.join(" ")};
        }
    }
%}
相关问题