Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.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_Conditional Operator - Fatal编程技术网

Parsing 如何解析条件运算符?

Parsing 如何解析条件运算符?,parsing,conditional-operator,Parsing,Conditional Operator,因此,索赔: 介于条件运算符之间的表达式?and:被解析为括号:其相对于?:的优先级被忽略 但是,在我看来,表达式中“:”运算符后面的部分也被解析为括号之间的部分。我尝试在我的编程语言中实现三元运算符,您可以看到解析表达式的结果,我的解析器假装表达式中“:”之后的部分也被括起来。例如,对于表达式1?1:0?2:0-1,我的编程语言的解释器输出0,这似乎与C兼容。例如,C程序: #include <stdio.h> int main() { printf("%d\n",(1?

因此,索赔:

介于条件运算符之间的表达式?and:被解析为括号:其相对于?:的优先级被忽略

但是,在我看来,表达式中“:”运算符后面的部分也被解析为括号之间的部分。我尝试在我的编程语言中实现三元运算符,您可以看到解析表达式的结果,我的解析器假装表达式中“:”之后的部分也被括起来。例如,对于表达式1?1:0?2:0-1,我的编程语言的解释器输出0,这似乎与C兼容。例如,C程序:

#include <stdio.h>

int main() {
    printf("%d\n",(1?1:0?2:0)-1);
}
输出0。 如果我对我的编程语言的解析器进行编程,在解析三元运算符时,只需将“:”之后已解析的第一个节点作为“?:”的第三个操作数,它的输出将与1?1:0?2:0-1相同,即1。
我的问题是,这是否会假装括号中的“:”后面的表达式始终与C兼容?

假装括号中的表达式是对运算符括号的某种描述。当然,这必须根据优先关系来解释,包括结合性。因此,在a-b*c和a*b-c中,减法有效地起作用,就好像它的参数被插入括号一样,在a-b-c中,只有左手参数被这样对待,而正是比较运算符导致了aThanks中的分组!顺便问一下,你知道如何编译d=0吗?0:n/d是否正确,这样就不会导致意外的零除错误?@FlatAssembler:您需要从左侧的条件表达式开始,然后分支到第二个或第三个参数的计算。它们最终都会分支到一个公共连接点。它们都需要在相同的位置结束结果,这样当控制流再次合并时,采用哪个分支就无关紧要了。我不知道您是如何生成代码的,但这应该不难。如果表达式是类型化的,则必须确保这两个备选表达式具有相同的类型,或者转换为公共类型。但我认为这不适用。
d = 0 ? 0 : n / d