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 

然而,这绝不会产生被通缉的语法错误(也可能继续超过IDS产生更多的表情)。

+0

哪里可以使用什么类型的语法?这可以使用上下文无关语法(正如我在[答案](http://stackoverflow.com/a/18473160/1281433)中所述),但不适用于常规语法。 – 2013-08-27 19:18:46

回答

1

这是一个简单的普通语法无法处理的语法的例子,但是一个上下文无关文法可以。虽然标识符列表是由一些生产类似于在这种情况下通常处理,以

ids = id 
    | id ',' ids 

你需要采取的做法更像是在平衡标点符号,例如教,

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

的适当平衡是因为在规则的每次展开时都会添加左括号和右括号。你可以做类似的事情了多个赋值表达式:

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

这里,基本多路,分配正义对赋值运算符两边的左值和右值。中心递归确保左边的左值的每个值必须与右边的右值匹配,所以左值的数量总是等于右值的数量。