我正在阅读本书的sql解析 - https://www.safaribooksonline.com/library/view/flex-bison/9780596805418/ch04.html。在下面检测ALL,DISTINCT的副本,我不明白的是按位AND如何检测重复ALL,DISTINCT等。为什么在01,02和04中对于ALL,DISTINCT和DISTINCTROW进行按位比较?
select_opts: { $$ = 0; }
| select_opts ALL
{ if($1 & 01) yyerror("duplicate ALL option"); $$ = $1 | 01; }
| select_opts DISTINCT
{ if($1 & 02) yyerror("duplicate DISTINCT option"); $$ = $1 | 02; }
| select_opts DISTINCTROW
{ if($1 & 04) yyerror("duplicate DISTINCTROW option"); $$ = $1 | 04; }
答案 0 :(得分:0)
请注意,在if (condition) statement1; statement2;
中,statement2;
不以condition
为条件。
在行尾,您会看到$$ = $1 | 01;
(或02
/ 04
)。如果看到ALL
关键字(或DISTINCT
/ DISTINCTROW
),无论之前是否已经看过,都会执行此操作。
由于这会在第一次看到时跟踪值为1的位中的ALL
关键字,在稍后出现该关键字时,提取值为1的位可以告诉您之前是否已经看过它。