📄 i_sql_parser.pas
字号:
// 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 + -