我必须编写一个函数来检查输入字符串对于给定的语言规范是否有效。我认为这将是一个标准的 CFG -> Chomsky Normal Form,然后是 CYK 解析,但是语言中的一条规则是防止这种情况发生。
有些规则很简单,如果我们定义了 terminal {a,b,c,d,e,f,P,Q,R,S}
,那么有效的字符串就是
1) 任何孤立的小写终端
2) 如果 'x' 是一个有效的字符串,那么 Sx 也是
但是第三条规则是
3) 如果 X 和 Y 是有效的输入字符串,那么 PXY、QXY、RXY 也是
其中{P,Q,R}
是剩余的大写终结符,X 和 Y 是非终结符。
这个的生产规则是什么样的?我以为会是这样的
XY -> PXY (and QXY, RXY)
但这有两个问题。首先,这不是 CFG 规则——这是否意味着该语言定义了 CSG?
第二个是这行不通,因为
XY -> PXY -> PPXY
在所有情况下都不是有效的消息。