posts - 18,  comments - 0,  trackbacks - 0

          class P extends Parser;

          options {
           k=5;
           buildAST = true;
           defaultErrorHandler = false;
          }

          tokens {
           SELECT_STATEMENT;
           GROUP_BY; ORDER_BY;
           ALIAS_EQU;
           FUNCTION;
           LOGIC_OP;
           ALL_FIELDS;
          }

          segment
           : (COLUMN column
           | WHERE search_condition)
           EOF!
           ;

          statements
           : statement (SEMI^ statement)* EOF!;

          statement
           : tableUnion
           | tableCompare
           | select_statement
           {#statement=#([SELECT_STATEMENT], #statement);}
           ;

          tableUnion
           : ("t_union"^|"表合并"^) table_name COMMA! table_name
           ;

          tableCompare
           : ("t_compare"^|"表比較"^) table_name COMMA! table_name ("where"!|"條件"!) comparemethod_name search_condition
           ;

          select_statement
           : ("select"^|"查詢"^) ("distinct"^|"唯一"^)? select_list
            (("from"^|"來自"^) table_list)?
            (("where"^|"條件"^) search_condition)?
            (("group"^ "by"!|"分組"^) aggregate_expression_list)?
            (("order"^ "by"!|"排序"^) order_expression_list)?
           ;

          select_list
           : column (COMMA^ column)*
           ;

          table_list
           : table_name (COMMA^ table_name)*
           ;
          search_condition
           : equation
            (logic_op search_condition {#search_condition=#([LOGIC_OP, "logic_op"], #search_condition);})?
           ;

          aggregate_expression_list
           : aggregate_expr (COMMA^ aggregate_expr)*
           ;

          order_expression_list
           : order_expression (COMMA^ order_expression)*
           ;

          column
           : expression_with_aggr_func (("as"^|"作為"^) alias)?
           | alias ("="|"等于")! expression_with_aggr_func {#column=#([ALIAS_EQU, "="], #column);}
           | all:"所有" {#column=#([ALL_FIELDS, all.getText()]);}
           | STAR {#column=#([ALL_FIELDS, "*"]);}
           ;
          aggregate_expr
           : (field_name|function) (
            two_arg_op aggregate_expr {#aggregate_expr=#([TWO_ARG_OP, "two_arg_op"], #aggregate_expr);})?
           ;
          order_expression
           : (alias|field_name|aggregate_func|function) ("升序"^|"降序"^|"asc"^|"desc"^)?
           ;
          expression
           : (field_name|constant|function|param_equ)
            (two_arg_op expression {#expression=#([TWO_ARG_OP, "two_arg_op"], #expression);})?
           | LPAREN expression RPAREN
            (two_arg_op expression {#expression=#([TWO_ARG_OP, "two_arg_op"], #expression);})?
           | one_arg_op expression {#expression=#([ONE_ARG_OP, "one_arg_op"], #expression);}
           ;
          expression_with_aggr_func
           : (field_name|constant|function|aggregate_func)
            (two_arg_op expression_with_aggr_func
            {#expression_with_aggr_func=#([TWO_ARG_OP, "two_arg_op"], #expression_with_aggr_func);})?
           | LPAREN expression_with_aggr_func RPAREN
            (two_arg_op expression_with_aggr_func
            {#expression_with_aggr_func=#([TWO_ARG_OP, "two_arg_op"], #expression_with_aggr_func);})?
           | one_arg_op expression_with_aggr_func
            {#expression_with_aggr_func=#([ONE_ARG_OP, "one_arg_op"], #expression_with_aggr_func);}
           ;

          equation
           : expression (("="|compare_op) expression
            {#equation=#([COMPARE_OP, "comp_op"], #equation);}
           |  ("is"! "null"^|"is"! "not"^ "null"!|"為空"^|"非空"^)
           |  ("between"^|"范圍"^) expression ("and"!)? expression)
           ;

          //param_equ
          // : PARAM_LPAREN ID^ PARAM_RPAREN
          // ;

          param_equ
           : PARAM_ID
           ;

          alias
           : ID | QUOTED_STRING;
          field_name
           : ID POINT^ ID;
          //field_name
          // : ID
          // | ID POINT^ ID;
          constant
           : REAL_NUM
           | QUOTED_STRING
           | "null"
           ;

          function
           : function_name LPAREN! parameters RPAREN!
           ;
          aggregate_func
           : aggregate_func_name LPAREN! ("all"^|"全部"^|"distinct"^|"唯一"^)? parameters RPAREN!
           ;

          parameters
           : expression (COMMA^ expression)*
           ;
          table_name
           : ID (("as"^|"作為"^) alias)?
           ;

          function_name
           : "sqrt"   |  "求平方根"
           | "getdate"  |  "求當前日期時間"
           | "abs"   |  "求絕對值"
           | "substring" |  "字符串截取"
           | "round"  | "格式化數(shù)值"
           | "right"  |  "字符串右截"
           | "ltrim"  | "去掉左空格"
           | "rtrim"  | "去掉右空格"
           | "char_length" | "求字符串的長度"
           | "floor"  | "求四舍后的整數(shù)"
           | "ceiling" | "求五入后的整數(shù)"
           | "lower"  |  "將字符串轉(zhuǎn)為小寫"
           | "charindex" | "存在于"
           | "str"   |  "數(shù)值轉(zhuǎn)字符串"
           ;


          aggregate_func_name
           : "sum"  | "求和"
           | "avg"  | "求平均數(shù)"
           | "max"  | "求最大值"
           | "min"  | "求最小值"
           | "count" | "求記錄數(shù)"
           ;

          one_arg_op
           : ONE_ARG_OP | "非";
          two_arg_op
           : TWO_ARG_OP | STAR
           | "與" | "或" | "異或" | "加" | "減" | "乘" | "除" | "求模";
          compare_op
           : COMPARE_OP | "等于" | "like"
           | "大于等于" | "小于等于" | "大于" | "小于" | "不等于"
           | "包含" | "不包含";
          logic_op
           : "and" | "or" | "并且" | "或者";

          comparemethod_name
           : "not exist" | "不存在"
           | "exist" | "存在";

          posted on 2007-04-03 18:00 LORD BLOG 閱讀(386) 評論(0)  編輯  收藏 所屬分類: 項目筆記
          主站蜘蛛池模板: 庆元县| 英吉沙县| 孟连| 衢州市| 漯河市| 磴口县| 曲阜市| 澜沧| 南城县| 大化| 莲花县| 北碚区| 安图县| 广宗县| 肥东县| 榆社县| 万荣县| 镇雄县| 丹棱县| 广安市| 南靖县| 呼图壁县| 锦州市| 乳源| 南岸区| 沈阳市| 改则县| 儋州市| 集贤县| 襄城县| 彰化县| 青阳县| 阳泉市| 恩施市| 湟源县| 北京市| 嘉定区| 巨野县| 桂林市| 宾川县| 达尔|