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

📄 u_c_sql_parser.pas

📁 delphi实现的sql解析器
💻 PAS
字号:
// 002 u_c_sql_parser
// 04 feb 2005
(*$r+*)
// -- (C) Felix John COLIBRI 2004
// -- documentation: http://www.felix-colibri.com


unit u_c_sql_parser;
  interface
    uses Classes, u_c_basic_object
        , u_sql_symbol_types
        , u_c_sql_scanner
        ;

    type c_sql_parser= Class(c_basic_object)
                         m_trace_parser: Boolean;
                         m_c_sql_scanner_ref: c_sql_scanner;
                         m_pure_parsing: Boolean;

                         constructor create_sql_parser(p_name: String);

                         procedure display_trace(p_text: String);
                         procedure display_error(p_text: string);

                           function f_symbol_type: t_sql_symbol_type;
                           function f_symbol_string: String;
                           procedure read_symbol;
                           procedure check(p_sql_symbol_type: t_sql_symbol_type);
                           procedure check_set(p_sql_symbol_type_set: t_sql_symbol_type_set);
                           procedure start_parsing;
                         procedure parse_sql;
                       end; // c_sql_parser

  implementation
    uses SysUtils, u_c_display, u_strings;

    constructor c_sql_parser.create_sql_parser(p_name: String);
      begin
        Inherited create_basic_object(p_name);
      end; // create_sql_parser

    procedure c_sql_parser.display_trace(p_text: String);
      var l_start, l_text: String;
      begin
        if m_trace_parser
          then begin
              l_start:= Copy(p_text, 1, 2);
              l_text:= p_text;
              Delete(l_text, 1, 2);
              with m_c_sql_scanner_ref do
                // display(l_start+ Format('%7d %-15s %-10s ',
                display(l_start+ Format('%3d %-7s ',
                    [m_buffer_index, m_symbol_string])
                  + f_sql_symbol_type_name(m_sql_symbol_type)
                  + ' | '+ l_text);
            end;
      end; // display_trace

    procedure c_sql_parser.display_error(p_text: string);
      begin
        display_bug_halt(p_text);
      end; // display_error

    function c_sql_parser.f_symbol_type: t_sql_symbol_type;
      begin
        Result:= m_c_sql_scanner_ref.m_sql_symbol_type;
      end; // f_symbol_type

    function c_sql_parser.f_symbol_string: String;
      begin
        Result:= m_c_sql_scanner_ref.m_symbol_string;
      end; // f_symbol_string

    procedure c_sql_parser.read_symbol;
      begin
        m_c_sql_scanner_ref.f_read_symbol;
      end; // read_symbol

    procedure c_sql_parser.check(p_sql_symbol_type: t_sql_symbol_type);
      begin
        if f_symbol_type= p_sql_symbol_type
          then
          else display_error('expected '+ f_sql_symbol_type_name(p_sql_symbol_type)
            + '  but_found '+ f_sql_symbol_type_name(f_symbol_type));
      end; // check

    procedure c_sql_parser.check_set(p_sql_symbol_type_set: t_sql_symbol_type_set);
      begin
        if f_symbol_type in p_sql_symbol_type_set
          then
          else display_error('expected '+ f_sql_symbol_type_set_name(p_sql_symbol_type_set)
            + '  but_found '+ f_sql_symbol_type_name(f_symbol_type));
      end; // c_sql_parser.

    procedure c_sql_parser.start_parsing;
      begin
        if not m_c_sql_scanner_ref.f_initialized
          then display_bug_halt('could_not_initialize_scanner');
      end; // start_parsing

    procedure c_sql_parser.parse_sql;

      (*$i i_sql_parser.pas *)
      (* $i i_pure_sql_parser.pas *)

      begin // parse_sql
        start_parsing;
        read_symbol;

        display('parse');
        if m_pure_parsing
          then begin
              repeat
                parse_sql;
              until f_symbol_type= e_end_of_parse_symbol;  
            end
          else ; // parse_sql;
      end; // parse_sql

  begin // u_c_sql_parser
  end. // u_c_sql_parser

⌨️ 快捷键说明

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