posts - 18,  comments - 0,  trackbacks - 0
          問題描述:
             由于編譯器中將使用到not、 not in、not exists、not like、is not null等包含英文not的單詞,而ANTLR在進(jìn)行詞法分析時,無法根據(jù)空格進(jìn)行解析。而且原來用("not"^) search_condition對整個WHERE條件的邏輯非構(gòu)造語法樹,也與其他地方的not產(chǎn)生沖突,導(dǎo)致無法識別英文的not。

          處理過程:
             1、對整個WHERE條件的英文邏輯非(not),增加一個SEARCH_NOT_CONDITION TOKEN,用來分辨此為整個WHERE條件,而中文的非仍熱為整個WHERE條件的根節(jié)點(diǎn),語法定義如下:
             
          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,用來針對這些英文的關(guān)鍵字進(jìn)行分析,語法定義如下:
                
           1 equation
           2     :    expression (
           3         
           4         //關(guān)系運(yùn)算符(+ - * /) 表達(dá)式
           5         ("=" | compare_op) expression
           6           {#equation=#([COMPARE_OP, "comp_op"], #equation);}
           7           
           8         //關(guān)系運(yùn)算符NOT LIKE 表達(dá)式
           9     |    ("not" "like") expression
          10         {#equation=#([LOGICAL_NOT_LIKE, "logic_not_like"], #equation);}    
          11 
          12         //關(guān)系運(yùn)算符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         //關(guān)系運(yùn)算符BETWEEN AND
          21     |     ("between"^ | "范圍"^) expression ("and"!)? expression
          22     
          23         //關(guān)系運(yùn)算符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 閱讀(238) 評論(0)  編輯  收藏 所屬分類: 工作日志
          主站蜘蛛池模板: 台中市| 泾源县| 葫芦岛市| 濉溪县| 辽宁省| 两当县| 龙口市| 营山县| 大安市| 濉溪县| 平阴县| 东安县| 万源市| 柞水县| 海兴县| 溧水县| 阿巴嘎旗| 昭觉县| 梅州市| 诸城市| 黎川县| 宝山区| 南昌县| 定州市| 湟源县| 大余县| 大同县| 白银市| 综艺| 潢川县| 阿拉善左旗| 罗源县| 德江县| 彭泽县| 萨嘎县| 斗六市| 友谊县| 洛阳市| 安化县| 赤水市| 洪雅县|