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 閱讀(574) 評論(0)  編輯  收藏 所屬分類: 工作日志
          主站蜘蛛池模板: 陆河县| 苍梧县| 鹰潭市| 杭锦后旗| 玉环县| 信丰县| 阿荣旗| 尼玛县| 河池市| 句容市| 兰考县| 新蔡县| 搜索| 洪泽县| 汝南县| 电白县| 松滋市| 垦利县| 巴彦县| 手游| 密云县| 南涧| 三都| 耒阳市| 汾阳市| 康定县| 婺源县| 两当县| 奉化市| 陇西县| 阜南县| 临夏县| 龙井市| 榕江县| 松桃| 绥滨县| 沙洋县| 平远县| 余庆县| 图木舒克市| 连州市|