这个语法是否(对Lua的一个小子集)是有二义性的?

我有以下语法,它是 [“Lua完整语法”] (https://www.lua.org/manual/5.1/manual.html#8) 的一个小子集:

chunk -> | chunk stat.
stat ->  var `=´ exp.
var ->  Name | exp `[´ exp `]´.
exp -> var | exp `(´ exp `)´ | `(´ exp `)´.

根据[上下文无关语法工具](http://mdaines.github.io/grammophone/),这个语法不是`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:感谢Michal Bohuslávek提供了关于第二个语法二义性的示例。不幸的是,该句子并不能直接导致第一个语法的二义性。

但是,如果第二个语法的第一条规则更改为stat -> exp var.,那么一个模棱两可的句子将导致第一个语法的模棱两可。Michal的想法可以扩展为生成这样的句子:exp'('exp')''('exp')' '['exp']'

点赞
用户6568347
用户6568347

例如,这个序列在我看来是有歧义的:

exp '(' exp ')' '[' exp ']'

它可以被解析为:

    exp '[' exp ']'
   /   \
 exp  '(' exp ')'

或:

    exp     var
          /    \
        exp  '[' exp ']'
         |
    '(' exp ')'
2016-07-17 11:05:39