1

我知道像 Python 这样的语言有同时(或“多路”)分配。今天在考试中遇到了一个类似的问题

为同时赋值编写一个语法的产生式,这样如果a,b = 1, 1+0;通过,它会很好地解析但a,b,c = 1, 1+0会返回错误(也就是说ids的数量需要与表达式相同)?错误应该是语法错误。

我是这样理解的:

您不需要为语法编写属性(因为它只是语法)。

我已经尝试并到处寻找可能对我有帮助的提示,但我仍然看不出用我被教导如何编写语法的方式来解决它。这是我到目前为止所拥有的:

P -> id Id_Tail = exp exp_Tail
Id_Tail -> , id Id_Tail
Id_Tail -> ε
exp_Tail -> , exp exp_Tail
exp_Tail -> ε
exp -> //assume this is is defined well enough to allow for all type of expressions that will generate/have a num (value) that is allowed to be assigned to the respective id

但是,这绝不会产生所需的语法错误(它可能会继续生成比 id 更多的表达式)。

4

1 回答 1

1

这是一个简单的正则文法无法处理但上下文无关文法可以处理的文法示例。虽然标识符列表通常由一些类似于

ids = id
    | id ',' ids

在这种情况下,您需要采取一种更像平衡标点符号的方法,例如,

expr = ... 
     | '(' expr ')'

由于在规则的每次扩展处都添加了左右括号,因此实现了适当的平衡。您可以对多重赋值表达式执行类似的操作:

multiway-assignment = lvalue '=' rvalue                         
                    | lvalue ',' multiway-assignment ',' rvalue

在这里,基本的多路赋值只是在赋值运算符的任一侧都有一个左值和右值。中心递归确保左侧左值上的每个值都必须与右侧的右值匹配,因此左值的数量始终等于右值的数量。

于 2013-08-27T18:44:47.943 回答