⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i_sql_parser.pas

📁 delphi实现的sql解析器
💻 PAS
📖 第 1 页 / 共 2 页
字号:
// 001 i_sql_parser
// 05 feb 2005

// -- (C) Felix John COLIBRI 2004
// -- documentation: http://www.felix-colibri.com

(*$r+*)

PROCEDURE parse_sql;

  PROCEDURE parse_value_litteral;
    BEGIN
      display_trace('> value_litteral');
      check_set([e_integer_litteral_symbol,
          e_double_litteral_symbol, e_string_litteral_symbol, e_identifier_symbol, e_colon_symbol]);
      if f_symbol_type= e_colon_symbol
        then read_symbol;
            
      read_symbol;

      if f_symbol_type= e_point_symbol
        then begin
            read_symbol;
            read_symbol;
          end;
      display_trace('< value_litteral');
    END; // parse_value_litteral
  
  PROCEDURE parse_integer_litteral;
    BEGIN
      display_trace('> integer_litteral');
      check(e_INTEGER_symbol);
      read_symbol;
      display_trace('< integer_litteral');
    END; // parse_integer_litteral
  
  PROCEDURE parse_table_or_view_name;
    BEGIN
      display_trace('> table_or_view_name');
      check(e_IDENTIFIER_symbol);
      read_symbol;
      display_trace('< table_or_view_name');
    END; // parse_table_or_view_name
  
  PROCEDURE parse_name_view_procedure;
    BEGIN
      display_trace('> name_view_procedure');
      check(e_IDENTIFIER_symbol);
      read_symbol;
      display_trace('< name_view_procedure');
    END; // parse_name_view_procedure
  
  PROCEDURE parse_column_name;
    BEGIN
      display_trace('> column_name');
      check(e_IDENTIFIER_symbol);
      read_symbol;
      display_trace('< column_name');
    END; // parse_column_name
  
  PROCEDURE parse_collation_name;
    BEGIN
      display_trace('> collation_name');
      check(e_IDENTIFIER_symbol);
      read_symbol;
      display_trace('< collation_name');
    END; // parse_collation_name
  
  PROCEDURE parse_alias_name;
    BEGIN
      display_trace('> alias_name');
      check(e_IDENTIFIER_symbol);
      read_symbol;
      display_trace('< alias_name');
    END; // parse_alias_name
  
  PROCEDURE parse_select; FORWARD;
  
  PROCEDURE parse_select_expression;
    BEGIN
      display_trace('> select_expression');
      parse_select;
      display_trace('< select_expression');
    END; // parse_select_expression
  
  PROCEDURE parse_functions;
    
    PROCEDURE parse_average;
      BEGIN
        display_trace('> average');
        check(e_AVG_symbol);
        read_symbol;
        check(e_opening_parenthesis_symbol);
        read_symbol;
        IF f_symbol_type IN [e_ALL_symbol, e_DISTINCT_symbol]
          THEN BEGIN
              IF f_symbol_type IN [e_ALL_symbol, e_DISTINCT_symbol]
                THEN read_symbol
                ELSE display_error('ALL, DISTINCT');
            END; // IF [
        parse_value_litteral;
        check(e_closing_parenthesis_symbol);
        read_symbol;
        display_trace('< average');
      END; // parse_average
    
    PROCEDURE parse_count;
      BEGIN
        display_trace('> count');
        IF f_symbol_type= e_COUNT_symbol
          THEN BEGIN
              read_symbol;
              check(e_opening_parenthesis_symbol);
              read_symbol;
              check(e_multiply_symbol);
              read_symbol;
            END // 2
          ELSE // e_1
            IF f_symbol_type IN (k_sql_litteral_and_identifier_symbol_set+ [e_ALL_symbol, e_DISTINCT_symbol])
              THEN BEGIN
                  IF f_symbol_type IN [e_ALL_symbol, e_DISTINCT_symbol]
                    THEN BEGIN
                        IF f_symbol_type IN [e_ALL_symbol, e_DISTINCT_symbol]
                          THEN read_symbol
                          ELSE display_error('ALL, DISTINCT');
                      END; // IF [
                  parse_value_litteral;
                  check(e_closing_parenthesis_symbol);
                  read_symbol;
                END // 2_3
              ELSE display_error('COUNT, ALL, DISTINCT, VALUE_LITTERAL, NAME');
        display_trace('< count');
      END; // parse_count
    
    PROCEDURE parse_max;
      BEGIN
        display_trace('> max');
        check(e_MAX_symbol);
        read_symbol;
        check(e_opening_parenthesis_symbol);
        read_symbol;
        IF f_symbol_type IN [e_ALL_symbol, e_DISTINCT_symbol]
          THEN BEGIN
              IF f_symbol_type IN [e_ALL_symbol, e_DISTINCT_symbol]
                THEN read_symbol
                ELSE display_error('ALL, DISTINCT');
            END; // IF [
        parse_value_litteral;
        check(e_closing_parenthesis_symbol);
        read_symbol;
        display_trace('< max');
      END; // parse_max
    
    PROCEDURE parse_min;
      BEGIN
        display_trace('> min');
        check(e_MIN_symbol);
        read_symbol;
        check(e_opening_parenthesis_symbol);
        read_symbol;
        IF f_symbol_type IN [e_ALL_symbol, e_DISTINCT_symbol]
          THEN BEGIN
              IF f_symbol_type IN [e_ALL_symbol, e_DISTINCT_symbol]
                THEN read_symbol
                ELSE display_error('ALL, DISTINCT');
            END; // IF [
        parse_value_litteral;
        check(e_closing_parenthesis_symbol);
        read_symbol;
        display_trace('< min');
      END; // parse_min
    
    PROCEDURE parse_sum;
      BEGIN
        display_trace('> sum');
        check(e_SUM_symbol);
        read_symbol;
        check(e_opening_parenthesis_symbol);
        read_symbol;
        IF f_symbol_type IN [e_ALL_symbol, e_DISTINCT_symbol]
          THEN BEGIN
              IF f_symbol_type IN [e_ALL_symbol, e_DISTINCT_symbol]
                THEN read_symbol
                ELSE display_error('ALL, DISTINCT');
            END; // IF [
        parse_value_litteral;
        check(e_closing_parenthesis_symbol);
        read_symbol;
        display_trace('< sum');
      END; // parse_sum
    
    PROCEDURE parse_upper;
      BEGIN
        display_trace('> upper');
        check(e_UPPER_symbol);
        read_symbol;
        check(e_opening_parenthesis_symbol);
        read_symbol;
        parse_value_litteral;
        check(e_closing_parenthesis_symbol);
        read_symbol;
        display_trace('< upper');
      END; // parse_upper
  
    BEGIN // parse_functions
      display_trace('> functions');
      CASE f_symbol_type OF
        e_AVG_symbol : 
            parse_average;
        e_COUNT_symbol :
            parse_count;
        e_MAX_symbol : 
            parse_max;
        e_MIN_symbol : 
            parse_min;
        e_SUM_symbol :
            parse_sum;
        e_UPPER_symbol : 
            parse_upper;
        ELSE display_error('AVG, COUNT, ALL, DISTINCT, VALUE_LITTERAL, NAME, MAX, MIN, SUM, UPPER');
      END; // case   
      display_trace('< functions');
    END; // parse_functions
  
  PROCEDURE parse_insert;
    BEGIN
      display_trace('> insert');
      check(e_INSERT_symbol);
      read_symbol;
      check(e_INTO_symbol);
      read_symbol;
      parse_table_or_view_name;

      IF f_symbol_type= e_opening_parenthesis_symbol
        THEN BEGIN
            read_symbol;
            parse_column_name;
            WHILE f_symbol_type= e_comma_symbol DO
            BEGIN
              read_symbol;
              parse_column_name;
            END; // WHILE {
            check(e_closing_parenthesis_symbol);
            read_symbol;
          END; // IF [

      IF f_symbol_type= e_VALUES_symbol
        THEN BEGIN
            read_symbol;
            check(e_opening_parenthesis_symbol);
            read_symbol;
            parse_value_litteral;
            WHILE f_symbol_type= e_comma_symbol DO
            BEGIN
              read_symbol;
              parse_value_litteral;
            END; // WHILE {
            check(e_closing_parenthesis_symbol);
            read_symbol;
          END // 2
        ELSE // e_1
          IF f_symbol_type= e_SELECT_symbol
            THEN
              parse_select_expression 
            ELSE display_error('VALUES, SELECT');
      display_trace('< insert');
    END; // parse_insert
  
  PROCEDURE parse_search_condition;
    
    PROCEDURE parse_search_value;
      
      PROCEDURE parse_select_one_column;
        BEGIN
          display_trace('> select_one_column');
          parse_select;
          display_trace('< select_one_column');
        END; // parse_select_one_column
      
      PROCEDURE parse_select_column_list;
        BEGIN
          display_trace('> select_column_list');
          parse_select;
          display_trace('< select_column_list');
        END; // parse_select_column_list
      
      PROCEDURE parse_between;
        BEGIN
          display_trace('> between');
          check(e_BETWEEN_symbol);
          read_symbol;
          parse_value_litteral;
          check(e_AND_symbol);
          read_symbol;
          parse_value_litteral;
          display_trace('< between');
        END; // parse_between
      
      PROCEDURE parse_like;
        BEGIN
          display_trace('> like');
          check(e_LIKE_symbol);
          read_symbol;
          parse_value_litteral;
          IF f_symbol_type= e_ESCAPE_symbol
            THEN BEGIN
                read_symbol;
                parse_value_litteral;
              END; // IF [
          display_trace('< like');
        END; // parse_like
      
      PROCEDURE parse_in;
        BEGIN
          display_trace('> in');
          IF f_symbol_type= e_IN_symbol
            THEN BEGIN
                read_symbol;
                check(e_opening_parenthesis_symbol);
                read_symbol;
                parse_value_litteral;
                WHILE f_symbol_type= e_comma_symbol DO
                BEGIN
                  read_symbol;
                  parse_value_litteral;
                END; // WHILE {
              END // 2
            ELSE // e_1
              IF f_symbol_type= e_SELECT_symbol
                THEN BEGIN
                    parse_select_column_list;
                    check(e_closing_parenthesis_symbol);
                    read_symbol;
                  END // 2_3
                ELSE display_error('IN, SELECT');
          display_trace('< in');
        END; // parse_in
      
      PROCEDURE parse_compare;

        PROCEDURE parse_operator;
          BEGIN
            display_trace('> operator');
            IF f_symbol_type IN [e_equal_symbol, e_lower_symbol, e_greater_symbol,
                e_lower_or_equal_symbol, e_greater_or_equal_symbol, e_different_symbol]
              THEN read_symbol
              ELSE display_error('=, <, >, <=, >=, <>');
            display_trace('< operator');
          END; // parse_operator
      
        BEGIN // parse_compare
          display_trace('> compare');
          parse_operator;
          IF f_symbol_type in k_sql_litteral_and_identifier_symbol_set
            THEN
              parse_value_litteral 
            ELSE // e_1
              IF f_symbol_type= e_opening_parenthesis_symbol
                THEN BEGIN
                    read_symbol;
                    parse_select_one_column;
                    check(e_closing_parenthesis_symbol);
                    read_symbol;
                  END // 2_3
                ELSE display_error('VALUE_LITTERAL, (');
          display_trace('< compare');
        END; // parse_compare
      
      PROCEDURE parse_containing;
        BEGIN
          display_trace('> containing');
          check(e_CONTAINING_symbol);
          read_symbol;
          parse_value_litteral;
          display_trace('< containing');
        END; // parse_containing
      
      PROCEDURE parse_starting;
        BEGIN
          display_trace('> starting');
          check(e_STARTING_symbol);
          read_symbol;
          IF f_symbol_type= e_WITH_symbol
            THEN
              read_symbol;
          parse_value_litteral;
          display_trace('< starting');
        END; // parse_starting

      BEGIN // parse_search_value
        display_trace('> search_value');

        CASE f_symbol_type OF
          e_colon_symbol :
              begin
                read_symbol;
                check(e_identifier_symbol);
                read_symbol;
              end;

          e_integer_litteral_symbol..e_string_litteral_symbol, e_identifier_symbol :
              BEGIN
                parse_value_litteral;
                IF f_symbol_type IN [e_NOT_symbol, e_BETWEEN_symbol, e_LIKE_symbol,
                    e_IN_symbol, e_SELECT_symbol, e_equal_symbol, e_lower_symbol, e_greater_symbol,
                    e_lower_or_equal_symbol, e_greater_or_equal_symbol, e_different_symbol,
                    e_CONTAINING_symbol, e_STARTING_symbol]
                  THEN BEGIN
                      IF f_symbol_type= e_NOT_symbol
                        THEN
                          read_symbol;
                      CASE f_symbol_type OF
                        e_BETWEEN_symbol : 
                            parse_between;
                        e_LIKE_symbol : 
                            parse_like;
                        e_IN_symbol, e_SELECT_symbol : 
                            parse_in;
                        e_equal_symbol, e_lower_symbol, e_greater_symbol, e_lower_or_equal_symbol,
                            e_greater_or_equal_symbol, e_different_symbol :
                            parse_compare;
                        e_CONTAINING_symbol : 
                            parse_containing;
                        e_STARTING_symbol : 
                            parse_starting;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -