1

我正在尝试使用 ANTLR 为以下语法构建 AST

condition_in
    :   column_identifier ('NOT')? 'IN' (sql_element_list | LPAREN select_stmt RPAREN)
    ;

对于上述内容,我如何根据输入在 NOT IN 或 IN 处构建有根树?还是有更好的方法?

同样对于像dicts这样的python,我如何构造一个ast,树,以MAP为根,每个键都有一个子MAP_PAIR:我猜值应该很棒

map :   '{' collection_element':'collection_element (',' collection_element':'collection_element)* '}'

我尝试了几种带有标签和树重写的替代方案,但 antrlworks 总是抱怨

任何帮助,将不胜感激

4

1 回答 1

1

尝试这样的事情:

grammar T;

options {
  output=AST;
}

tokens {
  NOT_IN;
  MAP_PAIR;
  MAP;
}

condition_in
 : column_identifier ( 'NOT' 'IN' in_end -> ^(NOT_IN column_identifier in_end)
                     | 'IN' in_end       -> ^('IN' column_identifier in_end)
                     )
 ;

in_end
 : sql_element_list 
 | LPAREN select_stmt RPAREN -> select_stmt
 ;

map
 : '{' (entry (',' entry)*)? '}' -> ^(MAP entry*)

entry
 : k=collection_element ':' v=collection_element -> ^(MAP_PAIR $k $v)
 ;

// ...
于 2012-04-30T06:19:50.300 回答