Antlr AST构造

时间:2012-04-30 04:55:56

标签: java antlr abstract-syntax-tree bnf antlrworks

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

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

对于上面我如何根据输入在NOT IN或IN构建一个root树?还是有更好的方法吗?

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

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

我尝试了几种带有标签和树重写的替代品,但是一个总是抱怨的

任何帮助将不胜感激

1 个答案:

答案 0 :(得分: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)
 ;

// ...