Bison:如何在sql中检测重复的关键字?

时间:2015-11-02 18:52:00

标签: sql parsing bison

我正在阅读本书的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; }

1 个答案:

答案 0 :(得分:0)

请注意,在if (condition) statement1; statement2;中,statement2;不以condition为条件。

在行尾,您会看到$$ = $1 | 01;(或02 / 04)。如果看到ALL关键字(或DISTINCT / DISTINCTROW),无论之前是否已经看过,都会执行此操作。

由于这会在第一次看到时跟踪值为1的位中的ALL关键字,在稍后出现该关键字时,提取值为1的位可以告诉您之前是否已经看过它。