这个语法(对于一小部分Lua)是不明确的?

时间:2016-07-17 09:35:39

标签: parsing lua compiler-construction context-free-grammar lr

我有以下语法,它是"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 ']'

1 个答案:

答案 0 :(得分:1)

例如,这个序列是IMO不明确的:

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

它是:

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

或者:

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