ANTLR如何区分相同类型的输入参数

时间:2014-05-07 11:32:31

标签: antlr antlr3 abstract-syntax-tree

如果我有输入消息:

名称 IS (Jon,Ted)(彼得);

我想要这个AST:

      name
       |
    |-----|
   IS   IS NOT
    |     |
    |    Peter
 |----|
Jon  Ted

但我收到了:

                name
                  |
        |-----------------|
       IS              IS NOT
        |                 |
        |                 |
   |----|-----|      |----|-----|
  Jon  Ted  Peter   Jon  Ted  Peter 

我的语法文件有:

...

expression
    |   NAME 'IS' OParen Identifier (Comma Identifier)* CParen 'IS NOT' OParen 
Identifier (Comma Identifier)* CParen
    ->  ^(NAME ^('IS' ^(Identifier)*) ^('IS NOT' ^(Identifier)*))
    ;

...

NAME
    :   'name'
    ;

Identifier
    :   ('a'..'z' | 'A'..'Z' | '_' | '.' | Digit)*
    ;

如何区分“属于”“IS”和属于“IS NOT”的内容?

1 个答案:

答案 0 :(得分:1)

这样的事情应该这样做:

expression
 : NAME IS left=id_list IS NOT right=id_list -> ^(NAME ^(IS $left) ^(NOT $right))
 ;

id_list
 : '(' ID (',' ID)* ')' -> ID+
 ;

IS : 'IS';
NOT : 'NOT'; // not a single token that is 'IS NOT'

ID
 : ('a'..'z' | 'A'..'Z' | '_' | '.' | Digit)+ 
   // Not `(...)*`: it should always match a single char!
 ;