ANTLR 4 построение дерева синтаксического анализа неправильно

Я делаю грамматику для подмножества SQL, которое я вставил ниже:

grammar Sql;

sel_stmt : SEL QUANT? col_list FROM tab_list;
as_stmt : 'as' ID;
col_list : '*' | col_spec (',' col_spec | ',' col_group)*;
    col_spec : (ID | ID '.' ID) as_stmt?;
    col_group : ID '.' '*';
tab_list : (tab_spec | join_tab) (',' tab_spec | ',' join_tab)*;
tab_spec : (ID | sub_query) as_stmt?;
sub_query : '(' sel_stmt ')';

join_tab : tab_spec (join_type? 'join' tab_spec 'on' cond_list)+;
    join_type : 'inner' | 'full' | 'left' | 'right';
cond_list : cond_term (BOOL_OP cond_term)*;
cond_term : col_spec (COMP_OP val | between | like);
    val : INT | FLT | SQ_STR | DQ_STR;
    between : ('not')? 'between' val 'and' val;
    like : ('not')? 'like' (SQ_STR | DQ_STR);

WS : (' ' | 't' | 'n')+ -> skip;
INT : ('0'..'9')+;
FLT : INT '.' INT;
SQ_STR : ''' ~(''|''')* ''';
DQ_STR : '"' ~(''|'"')* '"';
BOOL_OP : ',' | 'or' | 'and';
COMP_OP : '=' | '<>' | '<' | '>' | '<=' | '>=';

SEL : 'select' | 'SELECT';
QUANT: 'distinct' | 'DISTINCT' | 'all' | 'ALL';
FROM: 'from' | 'FROM';
ID : ('A'..'Z' | 'a'..'z')('A'..'Z' | 'a'..'z' | '0'..'9')*;

Входные данные, которые я тестирую select distinct test.col1 as col, test2.* from test join test2 on col='something', test2.col1=1.4. Выходное дерево синтаксического анализа соответствует последнему виду test2 как a и, таким образом, не знает, что делать с остальными входными данными. Запятая перед последним маркером ‘ test2 ‘становится дочерним элементом узла, когда он должен быть дочерним.

Мой вопрос в том, что происходит за кулисами, чтобы вызвать это?

1 ответ

  1. По-видимому, ANTLR не нравится, когда вы используете буквальный символ в качестве маркера и имеете его частью другого маркера. В моем случае маркер запятой использовался как литеральный маркер, так и как часть маркера BOOL_OP.

    Будущий вопрос может заключаться в том, как ANTLR расплывается, когда один и тот же символ используется в качестве частей различных токенов, которые применяются только в определенных областях. Однако пока на этот вопрос есть ответ.