Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 平衡同时赋值的上下文无关文法_Parsing_Variable Assignment_Grammar_Context Free Grammar - Fatal编程技术网

Parsing 平衡同时赋值的上下文无关文法

Parsing 平衡同时赋值的上下文无关文法,parsing,variable-assignment,grammar,context-free-grammar,Parsing,Variable Assignment,Grammar,Context Free Grammar,我知道像Python这样的语言有同时(或“多路”)赋值。今天在一次考试中,我遇到了一个大致相同的问题 写一个语法的结果,以便同时赋值,如果a,b=1,1+0,它将可以很好地解析,但是a,b,c=1,1+0将返回一个错误(也就是说id的数量需要与表达式相同)?错误应该是语法错误 我明白这一点: 您不需要为语法编写属性(因为它只是语法) 我已经试着到处寻找可能对我有帮助的提示,但我仍然看不到用教我如何写语法的方法来解决这个问题的方法。这就是我到目前为止所做的: P -> id Id_Tail

我知道像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

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

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

ids = id
    | id ',' ids
在这种情况下,您需要采取更类似于平衡标点符号的方法,例如

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

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

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

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

ids = id
    | id ',' ids
在这种情况下,您需要采取更类似于平衡标点符号的方法,例如

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

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

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

对于可以使用哪种语法有任何限制?这在上下文无关语法(如我在中所述)中是可能的,但在常规语法中是不可能的?这在上下文无关语法(如我在中所述)中是可能的,但在常规语法中是不可能的。