我有以下语法,它是"The Complete Syntax of Lua"的一小部分:
chunk -> | chunk stat.
stat -> var `=´ exp.
var -> Name | exp `[´ exp `]´.
exp -> var | exp `(´ exp `)´ | `(´ exp `)´.
根据a context-free grammar tool,此语法不是LR(1)
而且(因此?)不是LALR(1)
,SLR(1)
,LR(0)
或LL(1)
。
这个语法是不明确的?如果是这样,你能举一个含糊不清的句子的例子吗?如果没有,是否有充分理由说明它不是LR(1)
?
编辑:稍微简化的语法,它表现出同样的问题:
stat -> exp | exp var.
var -> Name | exp `[´ exp `]´.
exp -> var | exp `(´ exp `)´ | `(´ exp `)´.
编辑2:感谢MichalBohuslávek提供了一个关于第二语法模糊的句子示例。不幸的是,这句话并没有直接导致第一语法的含糊不清。
但是,如果第二个语法的第一个规则被更改为stat -> exp var.
,则一个含糊不清的句子会导致第一个语法的含糊不清。 Michal的想法可以扩展为生成这样一句话:exp '(' exp ')' '(' exp ')' '[' exp ']'
。
答案 0 :(得分:1)
例如,这个序列是IMO不明确的:
exp '(' exp ')' '[' exp ']'
它是:
exp '[' exp ']'
/ \
exp '(' exp ')'
或者:
exp var
/ \
exp '[' exp ']'
|
'(' exp ')'