The problem you're looking for is your qualifier rule, which should be (in the rewrite syntax):
qualifier : ':' limits -> limits; When you write ^(limits), it assumes you want the result of the limits rule to be the root of your tree. Since the root of the tree can only be a single node, it discards the children. Hopefully the Tool will get an update that issues a warning when you use a tree as the root of a rewrite rule. That said, here are some other comments: 1. The rewrite syntax is slower than the other syntax. The following rules should be written this way: qualifier : ':'! limits; limit_val : ID; 2. To improve the ability to trace tree nodes back to the source, you should always provide a token when constructing tokens in your AST. This guarantees proper line/column info for every node in the tree. var : ID -> ^(NAME[$ID, "var"] ID); sfield : field_name '-' var qualifier* -> ^(FIELD[$field_name] field_name var qualifier*); limits : first=limit_var '-' second=limit_val -> ^(NAME[$first, "limits"] $first $second); -----Original Message----- From: [email protected] [mailto:[email protected]] On Behalf Of Mike Allbright Sent: Sunday, December 05, 2010 1:20 PM To: [email protected] Subject: [antlr-interest] AST losing leaves in v3.3 With v2.7.7, the AST has all the expected nodes, but with v3.3, the limit_val nodes get dropped. Am I overlooking some obvious mistake here? Regards, --Mike Here's my input: ---------------------- mm-T_minute:bbc-xyzzy And the v3.3 output: ------------------------ (FIELD mm (var T_minute) limits) Here's the grammar --------------------------- grammar sfield; options { output=AST; ASTLabelType=CommonTree; } tokens { NAME; FIELD; } sfield : field_name '-' var qualifier* -> ^(FIELD field_name var qualifier*) ; field_name : ID; var : ID -> ^(NAME["var"] ID); qualifier : ':' limits -> ^(limits); limits : limit_val '-' limit_val -> ^(NAME["limits"] limit_val+); limit_val : ID -> ID; ID: (LETTER|'_')(LETTER|'_'|DIGIT)*; fragment LETTER: LOWER | UPPER; fragment LOWER: 'a'..'z'; fragment UPPER: 'A'..'Z'; fragment DIGIT: '0'..'9'; fragment SPACE: ' ' | '\t'; fragment SIGN: '+' | '-'; NEWLINE: ('\r'? '\n')+ { $channel = HIDDEN; }; WHITESPACE: SPACE+ { $channel = HIDDEN; }; OTHER : . ; List: http://www.antlr.org/mailman/listinfo/antlr-interest Unsubscribe: http://www.antlr.org/mailman/options/antlr-interest/your-email-address -- You received this message because you are subscribed to the Google Groups "il-antlr-interest" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/il-antlr-interest?hl=en.
