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

📄 i_sql_parser.pas

📁 delphi实现的sql解析器
💻 PAS
📖 第 1 页 / 共 2 页
字号:
                        ELSE display_error('BETWEEN, LIKE, IN, SELECT, =, <, >, <=, >=, <>, CONTAINING, STARTING');
                      END; // case   
                    END // 2
                  ELSE // e_1
                    IF f_symbol_type= e_IS_symbol
                      THEN BEGIN
                          read_symbol;
                          IF f_symbol_type= e_NOT_symbol
                            THEN
                              read_symbol;
                          check(e_NULL_symbol);
                          read_symbol;
                        END // 2_3
                      ELSE display_error('NOT, BETWEEN, LIKE, IN, SELECT, =, <, >, <=, >=, <>, CONTAINING, STARTING, IS');
              END; // n
          e_ALL_symbol, e_SOME_symbol, e_ANY_symbol : 
              BEGIN
                IF f_symbol_type IN [e_ALL_symbol, e_SOME_symbol, e_ANY_symbol]
                  THEN read_symbol
                  ELSE display_error('ALL, SOME, ANY');
                check(e_opening_parenthesis_symbol);
                read_symbol;
                parse_select_column_list;
                check(e_closing_parenthesis_symbol);
                read_symbol;
              END; // n
          e_EXISTS_symbol : 
              BEGIN
                read_symbol;
                check(e_opening_parenthesis_symbol);
                read_symbol;
                parse_select_expression;
                check(e_closing_parenthesis_symbol);
                read_symbol;
              END; // n
          e_SINGULAR_symbol : 
              BEGIN
                read_symbol;
                check(e_opening_parenthesis_symbol);
                read_symbol;
                parse_select_expression;
                check(e_closing_parenthesis_symbol);
                read_symbol;
              END; // n
          e_opening_parenthesis_symbol : 
              BEGIN
                read_symbol;
                parse_search_condition;
                check(e_closing_parenthesis_symbol);
                read_symbol;
              END; // n
          e_NOT_symbol : 
              BEGIN
                read_symbol;
                parse_search_condition;
              END; // n
          ELSE display_error('VALUE_LITTERAL, ALL, SOME, ANY, EXISTS, SINGULAR, (, NOT');
        END; // case   
        display_trace('< search_value');
      END; // parse_search_value
  
    BEGIN // parse_search_condition
      display_trace('> search_condition');
      parse_search_value;
      WHILE f_symbol_type IN [e_OR_symbol, e_AND_symbol] DO
      BEGIN
        IF f_symbol_type IN [e_OR_symbol, e_AND_symbol]
          THEN read_symbol
          ELSE display_error('OR, AND');
        parse_search_condition;
      END; // WHILE {
      display_trace('< search_condition');
    END; // parse_search_condition

  PROCEDURE parse_select;

    procedure parse_select_column_name;
      begin
        display_trace('> select_column_name');
        read_symbol;

        if f_symbol_type= e_point_symbol
          then read_symbol;
        if f_symbol_type<> e_comma_symbol
          then read_symbol;

        display_trace('< select_column_name');
      end; // parse_column_name

    PROCEDURE parse_from_table_reference;

      PROCEDURE parse_procedure_end;
        BEGIN
          display_trace('> procedure_end');
          IF f_symbol_type= e_opening_parenthesis_symbol
            THEN BEGIN
                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; // IF [
          IF f_symbol_type= e_IDENTIFIER_symbol
            THEN
              parse_alias_name;
          display_trace('< procedure_end');
        END; // parse_procedure_end
      
      PROCEDURE parse_joined_table;
        
        PROCEDURE parse_join_on;
          
          PROCEDURE parse_join_type;
            BEGIN
              display_trace('> join_type');
              IF f_symbol_type IN [e_INNER_symbol, e_LEFT_symbol, e_RIGHT_symbol,
                  e_FULL_symbol]
                THEN BEGIN
                    CASE f_symbol_type OF
                      e_INNER_symbol :
                          read_symbol;
                      e_LEFT_symbol : 
                          read_symbol;
                      e_RIGHT_symbol : 
                          read_symbol;
                      e_FULL_symbol : 
                          BEGIN
                            read_symbol;
                            IF f_symbol_type= e_OUTER_symbol
                              THEN
                                read_symbol;
                          END; // n
                      ELSE display_error('INNER, LEFT, RIGHT, FULL');
                    END; // case   
                  END; // IF [
              check(e_JOIN_symbol);
              read_symbol;
              display_trace('< join_type');
            END; // parse_join_type
        
          BEGIN // parse_join_on
            display_trace('> join_on');
            parse_join_type;
            // -- DUPS NAME
            IF f_symbol_type IN [e_opening_parenthesis_symbol, e_IDENTIFIER_symbol]
              THEN
                parse_joined_table 
              ELSE // e_1
                IF f_symbol_type= e_IDENTIFIER_symbol
                  THEN
                    parse_name_view_procedure
                  ELSE display_error('(, NAME, NAME');
            check(e_ON_symbol);
            read_symbol;
            parse_search_condition;
            display_trace('< join_on');
          END; // parse_join_on
      
        BEGIN // parse_joined_table
          display_trace('> joined_table');
          IF f_symbol_type= e_IDENTIFIER_symbol
            THEN BEGIN
                parse_name_view_procedure;
                parse_join_on;
              END // 2
            ELSE // e_1
              IF f_symbol_type= e_opening_parenthesis_symbol
                THEN BEGIN
                    read_symbol;
                    parse_joined_table;
                    check(e_closing_parenthesis_symbol);
                    read_symbol;
                  END // 2_3
                ELSE display_error('NAME, (');
          WHILE f_symbol_type IN [e_INNER_symbol, e_LEFT_symbol, e_RIGHT_symbol,
              e_FULL_symbol, e_JOIN_symbol] DO
            parse_join_on;
          display_trace('< joined_table');
        END; // parse_joined_table

      BEGIN // parse_from_table_reference
        display_trace('> from_table_reference');

        // -- DUPS NAME
        IF f_symbol_type= e_IDENTIFIER_symbol
          THEN BEGIN
              read_symbol;
              parse_procedure_end;
            END // 2
          ELSE // e_1
            IF f_symbol_type IN [e_opening_parenthesis_symbol, e_IDENTIFIER_symbol]
              THEN
                parse_joined_table
              ELSE display_error('NAME, (, NAME');

        display_trace('< table_reference');
      END; // parse_from_table_reference

    PROCEDURE parse_order_list;

      PROCEDURE parse_ascending_or_descending;
        BEGIN
          display_trace('> ascending_or_descending');
          IF f_symbol_type IN [e_ASC_symbol, e_ASCENDING_symbol, e_DESC_symbol,
              e_DESCENDING_symbol]
            THEN read_symbol
            ELSE display_error('ASC, ASCENDING, DESC, DESCENDING');
          display_trace('< ascending_or_descending');
        END; // parse_ascending_or_descending
    
      BEGIN // parse_order_list
        display_trace('> order_list');
        IF f_symbol_type= e_IDENTIFIER_symbol
          THEN
            parse_column_name
          ELSE // e_1
            IF f_symbol_type= e_INTEGER_symbol
              THEN
                parse_integer_litteral
              ELSE display_error('NAME, INTEGER');
        IF f_symbol_type= e_COLLATE_symbol
          THEN BEGIN
              read_symbol;
              parse_collation_name;
            END; // IF [
        IF f_symbol_type IN [e_ASC_symbol, e_ASCENDING_symbol, e_DESC_symbol,
            e_DESCENDING_symbol]
          THEN
            parse_ascending_or_descending;
        WHILE f_symbol_type= e_comma_symbol DO
        BEGIN
          read_symbol;
          parse_order_list;
        END; // WHILE {
        display_trace('< order_list');
      END; // parse_order_list

    BEGIN // parse_select
      display_trace('> select');

      check(e_SELECT_symbol);
      read_symbol;

      IF f_symbol_type IN [e_DISTINCT_symbol, e_ALL_symbol]
        THEN BEGIN
            IF f_symbol_type IN [e_DISTINCT_symbol, e_ALL_symbol]
              THEN read_symbol
              ELSE display_error('DISTINCT, ALL');
          END; // IF [

      CASE f_symbol_type OF
        e_multiply_symbol :
            read_symbol;

        e_ALL_symbol, e_DISTINCT_symbol,
          e_AVG_symbol, e_COUNT_symbol,
          e_MAX_symbol, e_MIN_symbol,
          e_SUM_symbol, e_UPPER_symbol :
            parse_functions;

        e_IDENTIFIER_symbol :
            BEGIN
              parse_select_column_name;

              WHILE f_symbol_type= e_comma_symbol DO
              BEGIN
                read_symbol;
                parse_value_litteral;
              END; // WHILE {
            END; // n
        ELSE display_error('*, AVG, COUNT, ALL, DISTINCT, VALUE_LITTERAL, NAME, MAX, MIN, SUM, UPPER,'
            + 'VALUE_LITTERAL, NAME');
      END; // case

      check(e_FROM_symbol);
      read_symbol;
      parse_from_table_reference;
      WHILE f_symbol_type= e_comma_symbol DO
      BEGIN
        read_symbol;
        parse_from_table_reference;
      END; // WHILE {

      IF f_symbol_type= e_WHERE_symbol
        THEN BEGIN
            read_symbol;
            parse_search_condition;
          END; // IF [

      IF f_symbol_type= e_GROUP_symbol
        THEN BEGIN
            read_symbol;
            check(e_BY_symbol);
            read_symbol;
            parse_column_name;
            IF f_symbol_type= e_COLLATE_symbol
              THEN BEGIN
                  read_symbol;
                  parse_collation_name;
                END; // IF [
            WHILE f_symbol_type= e_comma_symbol DO
            BEGIN
              read_symbol;
              parse_column_name;
              IF f_symbol_type= e_COLLATE_symbol
                THEN BEGIN
                    read_symbol;
                    parse_collation_name;
                  END; // IF [
            END; // WHILE {
          END; // IF [
      IF f_symbol_type= e_HAVING_symbol
        THEN BEGIN
            read_symbol;
            parse_search_condition;
          END; // IF [
      IF f_symbol_type= e_UNION_symbol
        THEN BEGIN
            read_symbol;
            parse_select_expression;
            IF f_symbol_type= e_ALL_symbol
              THEN
                read_symbol;
          END; // IF [
      IF f_symbol_type= e_ORDER_symbol
        THEN BEGIN
            read_symbol;
            check(e_BY_symbol);
            read_symbol;
            parse_order_list;
          END; // IF [
(*
      IF f_symbol_type= e_GROUP_symbol
        THEN BEGIN
            read_symbol;
            check(e_BY_symbol);
            read_symbol;
            parse_column_name;
            IF f_symbol_type= e_COLLATE_symbol
              THEN BEGIN
                  read_symbol;
                  parse_collation_name;
                END; // IF [
            WHILE f_symbol_type= e_comma_symbol DO
            BEGIN
              read_symbol;
              parse_column_name;
              IF f_symbol_type= e_COLLATE_symbol
                THEN BEGIN
                    read_symbol;
                    parse_collation_name;
                  END; // IF [
            END; // WHILE {
            IF f_symbol_type= e_HAVING_symbol
              THEN BEGIN
                  read_symbol;
                  parse_search_condition;
                END; // IF [
            IF f_symbol_type= e_UNION_symbol
              THEN BEGIN
                  read_symbol;
                  parse_select_expression;
                  IF f_symbol_type= e_ALL_symbol
                    THEN
                      read_symbol;
                END; // IF [
            IF f_symbol_type= e_ORDER_symbol
              THEN BEGIN
                  read_symbol;
                  check(e_BY_symbol);
                  read_symbol;
                  parse_order_list;
                END; // IF [
          END; // IF [
*)
      display_trace('< select');
    END; // parse_select

  PROCEDURE parse_update;
    BEGIN
      display_trace('> update');
      check(e_UPDATE_symbol);
      read_symbol;
      parse_table_or_view_name;
      check(e_SET_symbol);
      read_symbol;
      parse_column_name;
      check(e_equal_symbol);
      read_symbol;
      parse_value_litteral;
      WHILE f_symbol_type= e_comma_symbol DO
      BEGIN
        read_symbol;
        parse_column_name;
        check(e_equal_symbol);
        read_symbol;
        parse_value_litteral;
      END; // WHILE {
      IF f_symbol_type= e_WHERE_symbol
        THEN BEGIN
            read_symbol;
            parse_search_condition;
          END; // IF [
      display_trace('< update');
    END; // parse_update

  BEGIN // parse_sql
    display_trace('> sql');
    CASE f_symbol_type OF
      e_INSERT_symbol : 
          parse_insert;
      e_SELECT_symbol : 
          parse_select;
      e_UPDATE_symbol : 
          parse_update;
      ELSE display_error('INSERT, SELECT, UPDATE');
    END; // case   
    display_trace('< sql');
  END; // parse_sql

⌨️ 快捷键说明

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