posts - 18,  comments - 0,  trackbacks - 0
          問題描述:
             由于編譯器中將使用到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 閱讀(241) 評論(0)  編輯  收藏 所屬分類: 工作日志
          主站蜘蛛池模板: 宜兴市| 汾西县| 南通市| 涞源县| 托克逊县| 邹城市| 宿迁市| 马公市| 贞丰县| 军事| 襄汾县| 永泰县| 水城县| 资阳市| 札达县| 肃南| 南皮县| 镇江市| 龙南县| 阜新市| 青河县| 曲松县| 濮阳市| 广德县| 白城市| 定边县| 封丘县| 望都县| 新和县| 辰溪县| 永春县| 新源县| 肥西县| 喀什市| 抚远县| 苍山县| 新邵县| 永仁县| 定边县| 米脂县| 保亭|