[antlr-interest] How to duplicate nodes using a subrule when doing AST rewriting?
Stefan Mätje
Stefan.Maetje at esd-electronics.com
Tue Dec 20 07:47:05 PST 2011
Hi,
I would like to duplicate AST nodes as it is described in chapter 7 of the
ANTLR
reference book.
The following simplified rules are part of my grammar. The "oneIdOrList" rule
collects one or multiple identifiers into one list. At some points in my
grammar
I want to generate/duplicate a subtree for each identifier found. But using the
"oneIdOrList" rule does not work (see NOT WORKING variant of "structComponent"
below).
To get the "structComponent" rule working I have to write the
"( ID | '(' ID (',' ID )* ')' )" directly into the "structComponent" rule.
Is there a way to use (and or change) the "oneIdOrList" rule in the
"structComponent" rule and still get the wanted node and tree duplication?
Or to I have to replace the "oneIdOrList" rule anywhere in my grammar with the
direct code to get the duplication working.
Anybody there to give me a hint to solve this problem?
Thanks,
Stefan
-------------8<-------------8<-------------8<-------------8<-------------8<----
/** "OneIdentifierOrList"
*/
oneIdOrList:
( ID | '(' ID (',' ID )* ')' ) -> ID+
;
/** "TypeStructure"
*/
typeStruct
: 'STRUCT'^ LBRACK! structComponent ( ','! structComponent )*
RBRACK!
;
/** "StructureComponent"
*/
// WORKING variant
structComponent
: ( ID | '(' ID (',' ID )* ')' ) oneIdOrList simpleType
-> ^(FIELD_DCL ID simpleType)+
;
// NOT WORKING variant
structComponent
: oneIdOrList simpleType
-> ^(FIELD_DCL oneIdOrList simpleType)+
;
-------------8<-------------8<-------------8<-------------8<-------------8<----
Example input
-------------8<-------------8<-------------8<-------------8<-------------8<----
MODULE ( structsmpl );
PROBLEM;
DCL toast STRUCT [
(zing, zang, zong) FIXED,
(ring, rang) CLOCK
] GLOBAL;
MODEND;
-------------8<-------------8<-------------8<-------------8<-------------8<----
Pretty printed AST result of NOT WORKING variant using the "oneIdOrList" rule:
-------------8<-------------8<-------------8<-------------8<-------------8<----
(MODULE structsmpl
(PROBLEM
(VAR_DCL
(STRUCT
(FIELD_DCL zing zang zong FIXED 15)
(FIELD_DCL ring rang CLOCK)
)
(MOD_LIST GLOBAL)
toast
)
)
)
-------------8<-------------8<-------------8<-------------8<-------------8<----
Pretty printed AST result of the WORKING variant using "ID" directly in the
"structComponent" rule:
-------------8<-------------8<-------------8<-------------8<-------------8<----
(MODULE structsmpl
(PROBLEM
(VAR_DCL
(STRUCT
(FIELD_DCL zing FIXED 15)
(FIELD_DCL zang FIXED 15)
(FIELD_DCL zong FIXED 15)
(FIELD_DCL ring CLOCK)
(FIELD_DCL rang CLOCK)
)
(MOD_LIST GLOBAL)
toast
)
)
)
-------------8<-------------8<-------------8<-------------8<-------------8<----
More information about the antlr-interest
mailing list