简体   繁体   中英

Recursive rule in ANTLR

I need an idea how to express a statement like the following:

Int<Double<Float>>

So, in an abstract form we should have:

1.(easiest case):  a<b>
2. case: a<a<b>> 
3. case: a<a<a<b>>>
4. ....and so on...

The thing is that I should enable the possibility to embed a statement of the form a < b > within the < .. > - signs such that I have a nested statement. In other words: I should replace the b with a< b > . The 2nd thing is that the number of the opening and closed <>-signs should be equal.

How can I do that in ANTLR ?

A rule can refer to itself without any problem¹. Let's say we have a rule type which describes your case, in a minimalist approach:

type: typeLiteral ('<' type '>')?;
typeLiteral: 'Int' | 'Double' | 'Float';

Note the ('<' type '>') is optional, denoted by the ? symbol, so using only a typeLiteral is a valid type . Here are the synta trees generated by these rules in your example Int<Double<Float>> :

Int <Double <Float >>的语法树

¹: As long some terminals (like '<' or '>') can diferentiate when the recursion stop.

Image generated by http://ironcreek.net/phpsyntaxtree/

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