1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#!/usr/bin/ruby 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# encoding: utf-8 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrequire 'antlr3/test/functional' 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestHeterogeneousNodeTypes < ANTLR3::Test::Functional 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar VToken; 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V < ANTLR3::CommonTree 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def to_s 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return @token.text + "<V>" 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID<V> ; 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar TokenWithQualifiedType; 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V < ANTLR3::CommonTree 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def to_s 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return @token.text + "<V>" 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID<TokenWithQualifiedType.Parser.V> ; 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar TokenWithLabel; 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V < ANTLR3::CommonTree 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def to_s 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return @token.text + "<V>" 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : x=ID<V> ; 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar TokenWithListLabel; 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V < ANTLR3::CommonTree 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def to_s 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return @token.text + "<V>" 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : x+=ID<V> ; 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar TokenRoot; 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V < ANTLR3::CommonTree 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def to_s 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return @token.text + "<V>" 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID<V>^ ; 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar TokenRootWithListLabel; 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V < ANTLR3::CommonTree 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def to_s 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return @token.text + "<V>" 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : x+=ID<V>^ ; 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar FromString; 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V < ANTLR3::CommonTree 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def to_s 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return @token.text + "<V>" 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : 'begin'<V> ; 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar StringRoot; 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V < ANTLR3::CommonTree 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def to_s 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return @token.text + "<V>" 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : 'begin'<V>^ ; 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar RewriteToken; 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V < ANTLR3::CommonTree 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def to_s 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return @token.text + "<V>" 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID -> ID<V> ; 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar RewriteTokenWithArgs; 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V < ANTLR3::CommonTree 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def initialize(*args) 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case args.length 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver when 4 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ttype, @x, @y, @z = args 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token = ANTLR3::CommonToken.new(ttype, nil, '') 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver when 3 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ttype, token, @x = args 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @y = @z = 0 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else raise ArgumentError, "invalid number of arguments: #{args.length} for 3-4" 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver super(token) 204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def to_s 207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (@token.text.to_s rescue '') << "<V>;\%d\%d\%d" \% [@x, @y, @z] 208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID -> ID<V>[42,19,30] ID<V>[$ID,99]; 213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar RewriteTokenRoot; 220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { 225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V < ANTLR3::CommonTree 226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def to_s 227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return @token.text + "<V>" 228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID INT -> ^(ID<V> INT) ; 233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+ ; 235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar RewriteString; 241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { 246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V < ANTLR3::CommonTree 247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def to_s 248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return @token.text + "<V>" 249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : 'begin' -> 'begin'<V> ; 254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar RewriteStringRoot; 261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { 266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V < ANTLR3::CommonTree 267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def to_s 268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return @token.text + "<V>" 269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : 'begin' INT -> ^('begin'<V> INT) ; 274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+ ; 276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar RewriteRuleResults; 282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens {LIST;} 287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { 288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V < ANTLR3::CommonTree 289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def to_s 290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return @token.text + "<V>" 291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class W < ANTLR3::CommonTree 294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def initialize(tok, text) 295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tok.text = text 296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver super(tok) 297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def to_s 299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return @token.text + "<W>" 300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : id (',' id)* -> ^(LIST<W>["LIST"] id+); 305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver id : ID -> ID<V>; 306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar CopySemanticsWithHetero; 313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { 318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V < ANTLR3::CommonTree 319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def dup_node 320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return V.new(self) 321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def to_s 323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return @token.text + "<V>" 324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : type ID (',' ID)* ';' -> ^(type ID)+; 328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver type : 'int'<V> ; 329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\\n') {$channel=HIDDEN;} ; 332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar TreeParserRewriteFlatList; 337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID INT; 342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree grammar TreeParserRewriteFlatListWalker; 350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ASTLabelType=CommonTree; 354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokenVocab=TreeParserRewriteFlatList; 355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { 357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V < ANTLR3::CommonTree 358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def to_s 359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return @token.text + "<V>" 360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class W < ANTLR3::CommonTree 363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def to_s 364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return @token.text + "<W>" 365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID INT -> INT<V> ID<W> 369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar TreeParserRewriteTree; 375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID INT; 380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree grammar TreeParserRewriteTreeWalker; 388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ASTLabelType=CommonTree; 392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokenVocab=TreeParserRewriteTree; 393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { 395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V < ANTLR3::CommonTree 396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def to_s 397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return @token.text + "<V>" 398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class W < ANTLR3::CommonTree 402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def to_s 403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return @token.text + "<W>" 404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID INT -> ^(INT<V> ID<W>) 408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar TreeParserRewriteImaginary; 414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID ; 419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree grammar TreeParserRewriteImaginaryWalker; 427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ASTLabelType=CommonTree; 431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokenVocab=TreeParserRewriteImaginary; 432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens { ROOT; } 434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { 435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V < ANTLR3::CommonTree 436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def to_s 437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return @token.name + "<V>" 438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID -> ROOT<V> ID 442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar TreeParserRewriteImaginaryWithArgs; 448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID ; 453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree grammar TreeParserRewriteImaginaryWithArgsWalker; 461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ASTLabelType=CommonTree; 465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokenVocab=TreeParserRewriteImaginaryWithArgs; 466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens { ROOT; } 468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { 469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V < ANTLR3::CommonTree 470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def initialize(token_type, x) 471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver super(token_type) 472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @x = x 473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def to_s 475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return @token.name + "<V>;#@x" 476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID -> ROOT<V>[42] ID 480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar TreeParserRewriteImaginaryRoot; 486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID ; 491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree grammar TreeParserRewriteImaginaryRootWalker; 499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ASTLabelType=CommonTree; 503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokenVocab=TreeParserRewriteImaginaryRoot; 504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens { ROOT; } 506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { 507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V < ANTLR3::CommonTree 508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def to_s 509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return @token.name + "<V>" 510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID -> ^(ROOT<V> ID) 514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar TreeParserRewriteImaginaryFromReal; 520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID ; 525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree grammar TreeParserRewriteImaginaryFromRealWalker; 533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ASTLabelType=CommonTree; 537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokenVocab=TreeParserRewriteImaginaryFromReal; 538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens { ROOT; } 540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { 541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V < ANTLR3::CommonTree 542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def initialize(token, tree = nil) 543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if tree.nil? then super(token) 544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver super(tree) 546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @token = TokenData::Token.from_token(@token) 547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @token.type = token.type 548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def to_s 551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return @token.name + "<V>@" + @token.line.to_s 552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID -> ROOT<V>[$ID] 556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar TreeParserAutoHeteroAST; 562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID ';' ; 567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree grammar TreeParserAutoHeteroASTWalker; 575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ASTLabelType=CommonTree; 579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokenVocab=TreeParserAutoHeteroAST; 580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens { ROOT; } 582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { 583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class V < ANTLR3::CommonTree 584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def to_s 585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return @token.text + "<V>" 586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID<V> ';'<V>; 591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def parse( grammar_name, grammar_rule, input ) 594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar_module = self.class.const_get( grammar_name.to_s ) 595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = grammar_module::Lexer.new( input ) 596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens = ANTLR3::CommonTokenStream.new( lexer ) 597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = grammar_module::Parser.new( tokens ) 598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r = parser.send( grammar_rule ) 599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return( r.tree.inspect rescue '' ) 601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def tree_parse( grammar_name, grammar_rule, tree_grammar_rule, input ) 604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar_module = self.class.const_get( grammar_name.to_s ) 605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree_grammar_module = self.class.const_get( grammar_name.to_s + 'Walker' ) 606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = grammar_module::Lexer.new( input ) 608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens = ANTLR3::CommonTokenStream.new( lexer ) 609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = grammar_module::Parser.new( tokens ) 610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r = parser.send( grammar_rule ) 611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes = ANTLR3::CommonTreeNodeStream.new( r.tree ) 613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes.token_stream = tokens 614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree_parser = tree_grammar_module::TreeParser.new( nodes ) 615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r = tree_parser.send( tree_grammar_rule ) 616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return( r.tree.inspect rescue '' ) 618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "v token" do 621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( :VToken, :a, 'a' ) 622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'a<V>' 623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "token with qualified type" do 627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( :TokenWithQualifiedType, :a, 'a' ) 628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'a<V>' 629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "token with label" do 633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( :TokenWithLabel, :a, 'a' ) 634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'a<V>' 635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "token with list label" do 639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( :TokenWithListLabel, :a, 'a' ) 640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'a<V>' 641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "token root" do 645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( :TokenRoot, :a, 'a' ) 646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'a<V>' 647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "token root with list label" do 651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( :TokenRootWithListLabel, :a, 'a' ) 652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'a<V>' 653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "string" do 657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( :FromString, :a, 'begin' ) 658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'begin<V>' 659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "string root" do 663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( :StringRoot, :a, 'begin' ) 664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'begin<V>' 665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "rewrite token" do 669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( :RewriteToken, :a, 'a' ) 670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'a<V>' 671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "rewrite token with args" do 675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( :RewriteTokenWithArgs, :a, 'a' ) 676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '<V>;421930 a<V>;9900' 677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "rewrite token root" do 681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( :RewriteTokenRoot, :a, 'a 2' ) 682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '(a<V> 2)' 683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "rewrite string" do 687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( :RewriteString, :a, 'begin' ) 688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'begin<V>' 689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "rewrite string root" do 693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( :RewriteStringRoot, :a, 'begin 2' ) 694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '(begin<V> 2)' 695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "rewrite rule results" do 699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( :RewriteRuleResults, :a, 'a,b,c' ) 700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '(LIST<W> a<V> b<V> c<V>)' 701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "copy semantics with hetero" do 705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parse( :CopySemanticsWithHetero, :a, 'int a, b, c;' ) 706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '(int<V> a) (int<V> b) (int<V> c)' 707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "tree parser rewrite flat list" do 711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = tree_parse( :TreeParserRewriteFlatList, :a, :a, 'abc 34' ) 712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '34<V> abc<W>' 713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "tree parser rewrite tree" do 717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = tree_parse( :TreeParserRewriteTree, :a, :a, 'abc 34' ) 718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '(34<V> abc<W>)' 719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "tree parser rewrite imaginary" do 723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = tree_parse( :TreeParserRewriteImaginary, :a, :a, 'abc' ) 724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'ROOT<V> abc' 725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "tree parser rewrite imaginary with args" do 729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = tree_parse( :TreeParserRewriteImaginaryWithArgs, :a, :a, 'abc' ) 730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'ROOT<V>;42 abc' 731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "tree parser rewrite imaginary root" do 735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = tree_parse( :TreeParserRewriteImaginaryRoot, :a, :a, 'abc' ) 736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == '(ROOT<V> abc)' 737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "tree parser rewrite imaginary from real" do 741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = tree_parse( :TreeParserRewriteImaginaryFromReal, :a, :a, 'abc' ) 742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'ROOT<V>@1' 743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "tree parser auto hetero ast" do 747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = tree_parse( :TreeParserAutoHeteroAST, :a, :a, 'abc;' ) 748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.should == 'abc<V> ;<V>' 749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend 752