例如,给定语法
Expr -> Number | Number '+' Expr
Number -> [1-9][0-9]*
我们看到,对于+ 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。