posts - 18,  comments - 0,  trackbacks - 0

             在目前的WHERE條件中,針對where ((a > 0) and (c = 'hjd'))之間的邏輯表達式無法識別,參考oracle的語法文件,我修改了語法文件,語法已可以驗證,但在遍歷語法樹時,TOKEN下面的子TOKEN內容無法獲取,語法定義的內容如下:

          /*==================================================================//
          //                                                                  //
          //      Where Condition Begin                                       //
          //                                                                  //
          //==================================================================*/
          where_condition
           : condition
                  { #where_condition = #([WHERE_CONDITION, "where_condition"], #where_condition); }
              ;

          condition
           :  logical_term ( ("or"^ | "或者"^) logical_term )*
           ;

          logical_term
           : logical_factor ( ("and"^ | "并且"^) logical_factor )*
           ;

          logical_factor
           : ( exp_simple compare_op exp_simple ) => (exp_simple compare_op exp_simple )
            {#logical_factor = #([COMPARE_OP, "comp_op"], #logical_factor);}
           |  ( exp_simple ( "in" | "在于" ) ) => exp_simple ( "in" | "在于" ) exp_set
            { #logical_factor = #([LOGICAL_CONTAIN, "logic_contain"], #logical_factor); }
           | ( exp_simple ( "not in" | "不在于" ) ) => exp_simple ( "not in" | "不在于" ) exp_set
            { #logical_factor = #([LOGICAL_CONTAIN, "logic_contain"], #logical_factor); }
           |  ( exp_simple ( "like" | "包含" ) ) => exp_simple ("like" | "包含" ) where_expression ( "escape" QUOTED_STRING )?
            { #logical_factor = #([LOGICAL_LIKE, "logic_like"], #logical_factor); }
           |  ( exp_simple ( "not like" | "不包含" ) ) => exp_simple ("not like" | "不包含" ) where_expression ( "escape" QUOTED_STRING )?
            { #logical_factor = #([LOGICAL_LIKE, "logic_like"], #logical_factor); }
           |  ( exp_simple ( "between"| "范圍" ) ) => exp_simple ( "between" | "范圍" ) exp_simple exp_simple
            { #logical_factor = #([LOGICAL_BETWEEN, "logic_between"], #logical_factor); }
           |  ( exp_simple ( "not between"| "不在范圍" ) ) => exp_simple ( "not between" | "不在范圍" ) exp_simple exp_simple
            { #logical_factor = #([LOGICAL_BETWEEN, "logic_between"], #logical_factor); }
           |  ( exp_simple ( "is null" | "為空" ) ) => exp_simple ( "is null" | "為空" )
            { #logical_factor = #([LOGICAL_NULL, "logic_null"], #logical_factor); }
           |  ( exp_simple ( "is not null" | "非空" ) ) => exp_simple ( "is not null" | "非空" )
            { #logical_factor = #([LOGICAL_NULL, "logic_null"], #logical_factor); }
           |  ( quantified_factor ) => quantified_factor
            { #logical_factor = #([LOGICAL_EXISTS, "logic_exists"], #logical_factor); }
           |  ( ( "not" | "非" ) condition ) => ( "not" | "非" ) condition
            { #logical_factor = #([COND_NOT, "cond_not"], #logical_factor); }
           |  ( LPAREN condition RPAREN )
            { #logical_factor = #([COND_PAREN, "cond_paren"], #logical_factor); }
              ;

          quantified_factor
           : ( exp_simple compare_op ( "all" | "any" )? subquery ) => exp_simple compare_op ( "all" | "any" )? subquery
              |  ( ( "not" )? "exists" subquery ) => ( "not" )? "exists" subquery
              |  subquery
              ;

          exp_simple
           :  where_expression
           ;

          where_expression
           :  term ( ( PLUS^ | MINUS^ | "加"^ | "減"^) term )*
              ;

          term
           :  factor ( ( MUL^ | DIVIDE^ | "乘"^ | "除"^) factor )*
              ;
           
          multiply
           : MUL | "乘"
                  { #multiply = #([MULTIPLY, "multiply"], #multiply); }
              ;

          factor
           : ( sql_literal ) => sql_literal
           | ( ( PLUS | MINUS ) where_expression ) => ( PLUS | MINUS ) where_expression
           | ( function_name ( LPAREN where_expression ( COMMA where_expression )* RPAREN ) ) => function_name ( LPAREN where_expression ( COMMA where_expression )* RPAREN )
            { #factor = #([NORMAL_FUNCTION, "normal_function"], #factor); }
           |  ( aggregate_func_name LPAREN ( STAR | "all" | "distinct" )? (where_expression)? RPAREN ) => aggregate_func_name LPAREN ( STAR | "all" | "distinct" )? (where_expression)? RPAREN
                  { #factor = #([GROUP_FUNCTION, "group_function"], #factor); }
           | ( LPAREN where_expression RPAREN ) => LPAREN where_expression RPAREN
            { #factor = #([EXPRESSION_PAREN, "expression_paren"], #factor); }
           ;

          sql_literal
           : constant
           | field_name
           ;

          where_expression_list
           : LPAREN where_expression ( COMMA where_expression )+ RPAREN
           ;

          exp_set
           :  LPAREN constexpset RPAREN
           {#exp_set = #([SUBCONTAIN_OP, "subcontain_op"], #exp_set);}
          // | subquery
           ;

          constexpset
           : constant (COMMA^ constant)*
          // {#constexpset = #([SUBCONTAIN_CONTENT, "subcontain_content"], #constexpset);}
           ;
          /*==================================================================//
          //                                                                 //
          //      Where Condition End                                        //
          //                                                                 //
          //==================================================================*/

          posted on 2007-04-12 10:50 LORD BLOG 閱讀(570) 評論(0)  編輯  收藏 所屬分類: 工作日志
          主站蜘蛛池模板: 富阳市| 尤溪县| 宜宾市| 安顺市| 罗江县| 嘉荫县| 伊金霍洛旗| 永年县| 沙洋县| 沐川县| 吴忠市| 浑源县| 北宁市| 高碑店市| 沙坪坝区| 玉溪市| 屏山县| 泗水县| 都昌县| 锡林郭勒盟| 太和县| 兴安盟| 杭锦旗| 云林县| 盐源县| 太仓市| 玛多县| 东兰县| 泰来县| 龙陵县| 鄂托克前旗| 万源市| 青州市| 文水县| 山阳县| 临城县| 嵊州市| 绩溪县| 新宁县| 玉门市| 温宿县|