是否有算法确定给定的句子是否是语法的子句?

时间:2013-08-12 12:16:10

标签: algorithm parsing

例如,给定语法

Expr -> Number | Number '+' Expr
Number -> [1-9][0-9]*

我们看到,对于+ 1,存在一个句子(例如1 + 1),该句子由语法解析,+ 1是子句。这是一般的算法吗?我认为如果我们可以在解析器中放置某种标志,我们应该能够告诉它在解析时跳过一些初始和一些最终的令牌,但我不确定这是否会起作用。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

我确信有更好的方法,但是这个论点表明,通过对Chomsky法线形式语法的线性时间转换,在这个操作下关闭了无上下文语言类。

这个想法是为每个非终结符号A引入另外三个符号Apre,Asuf,Asub,它们匹配由A匹配的字符串的前缀,后缀和子串。

对于过渡A - >; s,添加

Apre ->
Apre -> s
Asuf ->
Asuf -> s
Asub ->
Asub -> s.

对于过渡A - >; B C,添加

Apre -> Bpre
Apre -> B Cpre
Asuf -> Csuf
Asuf -> Bsuf C
Asub -> Bsub
Asub -> Csub
Asub -> Bsuf Cpre.

将起始符号从S更改为Ssub。