简体   繁体   中英

ANTLR: return always the same number of children

I have the following rule:

statement : TOKEN1 opt1=TOKEN2? opt2=TOKEN3 TOKEN4 -> ^(TOKEN1 opt1? opt2);

The AST generated by this rule will have one or two children (depending on if opt1 was defined or not).

I need to have always a fixed number of children (in this case 2). I know that this can be achieved by doing the following ( UNDEFINED is an imaginary token):

statement : TOKEN1 opt1=TOKEN2 TOKEN4 -> ^(TOKEN1 opt1 UNDEFINED)

           | TOKEN1 opt1=TOKEN2 opt2=TOKEN3 TOKEN4 -> ^(TOKEN1 opt1 opt2);

This is fine for just one optional token. The problem is when I have a higher number of optional tokens. A lot of rules must written in order to catch all possible combinations. How can this issue be solved in an elegant way?

I'm using ANTLR 3.4/C target by the way.

Thanks,

T.

You could do this:

grammar G;

tokens {
  CHILD1;
  CHILD2;
  CHILD3;
}

...

statement
 : ROOT t2=TOKEN2? t3=TOKEN3? t4=TOKEN4?
   -> ^(ROOT ^(CHILD1 $t2?) ^(CHILD2 $t3?) ^(CHILD3 $t4?))
 ;

which will cause the AST to always have 3 child nodes (which may or may not have a tokens as child themselves).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM