問題描述:
由于編譯器中將使用到not、 not in、not exists、not like、is not null等包含英文not的單詞,而ANTLR在進行詞法分析時,無法根據空格進行解析。而且原來用("not"^) search_condition對整個WHERE條件的邏輯非構造語法樹,也與其他地方的not產生沖突,導致無法識別英文的not。
處理過程:
1、對整個WHERE條件的英文邏輯非(not),增加一個SEARCH_NOT_CONDITION TOKEN,用來分辨此為整個WHERE條件,而中文的非仍熱為整個WHERE條件的根節點,語法定義如下:
1 search_condition
2 : bool_exp
3 | ( "not"
4 {#search_condition = #([SEARCH_NOT_CONDITION, "search_not_condition"], search_condition);}
5 | "非"^
6 ) search_condition
7 ;
2、增加LOGICAL_NOT_LIKE、LOGICAL_NULL、LOGICAL_NOT_NULL、LOGICAL_IN、LOGICAL_NOT_IN TOKEN,用來針對這些英文的關鍵字進行分析,語法定義如下:
1 equation
2 : expression (
3
4 //關系運算符(+ - * /) 表達式
5 ("=" | compare_op) expression
6 {#equation=#([COMPARE_OP, "comp_op"], #equation);}
7
8 //關系運算符NOT LIKE 表達式
9 | ("not" "like") expression
10 {#equation=#([LOGICAL_NOT_LIKE, "logic_not_like"], #equation);}
11
12 //關系運算符IS NULL/IS NOT NULL
13 | ( "is" "null"
14 {#equation = #([LOGICAL_NULL, "logic_null"], #equation);}
15 | "is" "not" "null"
16 {#equation = #([LOGICAL_NOT_NULL, "logic_not_null"], #equation);}
17 | "為空"^ | "非空"^
18 )
19
20 //關系運算符BETWEEN AND
21 | ("between"^ | "范圍"^) expression ("and"!)? expression
22
23 //關系運算符IN/NOT IN
24 | ( "in"
25 {#equation = #([LOGICAL_IN, "logic_in"], #equation);}
26 | "not" "in"
27 {#equation = #([LOGICAL_NOT_IN, "logic_not_in"], #equation);}
28 | "在于"^ | "不在于"^
29 ) exp_set
30 )
31 ;
語法樹遍歷代碼如下:
1 equation returns [EquationModel model]
2 {
3 ExpressionModel e1, e2, e3;
4 EquationModel equation;
5 model=new EquationModel();
6 String nullStr = "";
7 }
8 : #(COMPARE_OP e1=expression op:compare_op e2=expression)
9 {model.addExpression(e1); model.addOperator(op.getText()); model.addExpression(e2);}
10
11 | #(LOGICAL_NOT_LIKE e1=expression "not" "like" e2=expression)
12 {model.addExpression(e1); model.addOperator("not like"); model.addExpression(e2);}
13
14 | #(LOGICAL_NULL e1=expression "is" "null")
15 {model.addExpression(e1); model.addOperator("is null");}
16 | #(n:"為空" e1=expression)
17 {model.addExpression(e1); model.addOperator(n.getText());}
18 | #(LOGICAL_NOT_NULL e1=expression "is" "not" "null")
19 {model.addExpression(e1); model.addOperator("is not null");}
20 | #(nn:"非空" e1=expression)
21 {model.addExpression(e1); model.addOperator(nn.getText());}
22 | #("between" e1=expression e2=expression e3=expression)
23 {model.addExpression(e1); model.addOperator("between");
24 model.addExpression(e2); model.addExpression(e3);}
25 | #(btw:"范圍" e1=expression e2=expression e3=expression)
26 {model.addExpression(e1); model.addOperator(btw.getText());
27 model.addExpression(e2); model.addExpression(e3);
28 }
29
30 | #(LOGICAL_IN e1=expression "in" e2=exp_set)
31 {model.addExpression(e1); model.addOperator("in"); model.addExpression(e2);}
32 | #(ct1:"在于" e1=expression e2=exp_set)
33 {model.addExpression(e1); model.addOperator(ct1.getText()); model.addExpression(e2);}
34 | #(LOGICAL_NOT_IN e1=expression "not" "in" e2=exp_set)
35 {model.addExpression(e1); model.addOperator("not in"); model.addExpression(e2);}
36 | #(ct2:"不在于" e1=expression e2=exp_set)
37 {model.addExpression(e1); model.addOperator(ct2.getText()); model.addExpression(e2);}
38 ;
LORD
jiandeh@sina.com
2007-05-22
posted on 2007-05-22 16:44
LORD BLOG 閱讀(232)
評論(0) 編輯 收藏 所屬分類:
工作日志