用于平衡同时分配的上下文无关语法

时间:2013-03-13 23:45:51

标签: parsing variable-assignment grammar context-free-grammar

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

  

为同时分配编写语法的产生,这样如果a,b = 1, 1+0;被传递,它将解析正常,但a,b,c = 1, 1+0将返回错误(也就是说需要的id数量)和表达一样)?错误应该是语法错误。

我明白这一点:

  

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

我已经尝试并寻找可能对我有帮助的提示,但是我仍然没有办法按照我教会如何编写语法的方式来解决这个问题。这就是我到目前为止所做的:

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

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

1 个答案:

答案 0 :(得分:1)

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

的产品处理
ids = id
    | id ',' ids

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

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

完成适当的平衡是因为在规则的每次扩展时添加了左右括号。您可以为多重赋值表达式执行类似的操作:

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

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