1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#!/usr/bin/ruby 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# encoding: utf-8 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrequire 'antlr3/test/functional' 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestTreeParser1 < ANTLR3::Test::Functional 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "flat list" do 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver compile_and_load inline_grammar( <<-'END' ) 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar FlatList; 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID INT; 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver compile_and_load inline_grammar( <<-'END' ) 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree grammar FlatListWalker; 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ASTLabelType=CommonTree; 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { include ANTLR3::Test::CaptureOutput } 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID INT 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver {self.capture("\%s, \%s" \% [$ID, $INT])} 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = FlatList::Lexer.new( "abc 34" ) 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens = ANTLR3::CommonTokenStream.new( lexer ) 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = FlatList::Parser.new( tokens ) 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parser.a 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes = ANTLR3::AST::CommonTreeNodeStream.new( result.tree ) 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes.token_stream = tokens 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker = FlatListWalker::TreeParser.new( nodes ) 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker.a 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker.output.should == "abc, 34" 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "simple tree" do 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver compile_and_load inline_grammar( <<-'END' ) 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar SimpleTree; 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID INT -> ^(ID INT); 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\\n') {$channel=HIDDEN;} ; 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver compile_and_load inline_grammar( <<-'END' ) 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree grammar SimpleTreeWalker; 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ASTLabelType=CommonTree; 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { include ANTLR3::Test::CaptureOutput } 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ^(ID INT) 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver {capture('\%s, \%s' \% [$ID, $INT])} 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = SimpleTree::Lexer.new( "abc 34" ) 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens = ANTLR3::CommonTokenStream.new( lexer ) 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = SimpleTree::Parser.new( tokens ) 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parser.a 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes = ANTLR3::AST::CommonTreeNodeStream.new( result.tree ) 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes.token_stream = tokens 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker = SimpleTreeWalker::TreeParser.new( nodes ) 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker.a 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker.output.should == "abc, 34" 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "flat vs tree decision" do 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver compile_and_load inline_grammar( <<-'END' ) 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar FlatVsTreeDecision; 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : b c ; 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : ID INT -> ^(ID INT); 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver c : ID INT; 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\\n') {$channel=HIDDEN;} ; 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver compile_and_load inline_grammar( <<-'END' ) 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree grammar FlatVsTreeDecisionWalker; 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ASTLabelType=CommonTree; 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { include ANTLR3::Test::CaptureOutput } 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : b b ; 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : ID INT {capture("\%s \%s\n" \% [$ID, $INT])} 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | ^(ID INT) {capture("^(\%s \%s)" \% [$ID, $INT])} 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = FlatVsTreeDecision::Lexer.new( "a 1 b 2" ) 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens = ANTLR3::CommonTokenStream.new( lexer ) 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = FlatVsTreeDecision::Parser.new( tokens ) 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parser.a 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes = ANTLR3::AST::CommonTreeNodeStream.new( result.tree ) 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes.token_stream = tokens 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker = FlatVsTreeDecisionWalker::TreeParser.new( nodes ) 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker.a 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker.output.should == "^(a 1)b 2\n" 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "flat vs tree decision2" do 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver compile_and_load inline_grammar( <<-'END' ) 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar FlatVsTreeDecision2; 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : b c ; 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : ID INT+ -> ^(ID INT+); 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver c : ID INT+; 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver compile_and_load inline_grammar( <<-'END' ) 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree grammar FlatVsTreeDecision2Walker; 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ASTLabelType=CommonTree; 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { include ANTLR3::Test::CaptureOutput } 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : b b ; 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : ID INT+ {say("#{$ID} #{$INT}")} 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | ^(x=ID (y=INT)+) {capture("^(#{$x} #{$y})")} 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = FlatVsTreeDecision2::Lexer.new( "a 1 2 3 b 4 5" ) 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens = ANTLR3::CommonTokenStream.new( lexer ) 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = FlatVsTreeDecision2::Parser.new( tokens ) 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parser.a 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes = ANTLR3::AST::CommonTreeNodeStream.new( result.tree ) 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes.token_stream = tokens 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker = FlatVsTreeDecision2Walker::TreeParser.new( nodes ) 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker.a 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker.output.should == "^(a 3)b 5\n" 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "cyclic dfa lookahead" do 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver compile_and_load inline_grammar( <<-'END' ) 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar CyclicDFALookahead; 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID INT+ PERIOD; 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver SEMI : ';' ; 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver PERIOD : '.' ; 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver compile_and_load inline_grammar( <<-'END' ) 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree grammar CyclicDFALookaheadWalker; 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ASTLabelType=CommonTree; 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { include ANTLR3::Test::CaptureOutput } 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID INT+ PERIOD {capture("alt 1")} 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | ID INT+ SEMI {capture("alt 2")} 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = CyclicDFALookahead::Lexer.new( "a 1 2 3." ) 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens = ANTLR3::CommonTokenStream.new( lexer ) 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = CyclicDFALookahead::Parser.new( tokens ) 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parser.a 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes = ANTLR3::AST::CommonTreeNodeStream.new( result.tree ) 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes.token_stream = tokens 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker = CyclicDFALookaheadWalker::TreeParser.new( nodes ) 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker.a 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker.output.should == "alt 1" 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "nullable child list" do 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver compile_and_load inline_grammar( <<-'END' ) 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar NullableChildList; 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID INT? -> ^(ID INT?); 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\\n') {$channel=HIDDEN;} ; 205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver compile_and_load inline_grammar( <<-'END' ) 207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree grammar NullableChildListWalker; 208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ASTLabelType=CommonTree; 211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { include ANTLR3::Test::CaptureOutput } 213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ^(ID INT?) 214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver {capture($ID.to_s)} 215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = NullableChildList::Lexer.new( "abc" ) 218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens = ANTLR3::CommonTokenStream.new( lexer ) 219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = NullableChildList::Parser.new( tokens ) 220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parser.a 222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes = ANTLR3::AST::CommonTreeNodeStream.new( result.tree ) 223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes.token_stream = tokens 224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker = NullableChildListWalker::TreeParser.new( nodes ) 225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker.a 226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker.output.should == "abc" 227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "nullable child list2" do 230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver compile_and_load inline_grammar( <<-'END' ) 231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar NullableChildList2; 232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID INT? SEMI -> ^(ID INT?) SEMI ; 237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver SEMI : ';' ; 240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver compile_and_load inline_grammar( <<-'END' ) 243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree grammar NullableChildList2Walker; 244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ASTLabelType=CommonTree; 247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { include ANTLR3::Test::CaptureOutput } 249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ^(ID INT?) SEMI 250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver {capture($ID.to_s)} 251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = NullableChildList2::Lexer.new( "abc;" ) 254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens = ANTLR3::CommonTokenStream.new( lexer ) 255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = NullableChildList2::Parser.new( tokens ) 256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parser.a 258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes = ANTLR3::AST::CommonTreeNodeStream.new( result.tree ) 259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes.token_stream = tokens 260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker = NullableChildList2Walker::TreeParser.new( nodes ) 261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker.a 262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker.output.should == "abc" 263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "nullable child list3" do 266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver compile_and_load inline_grammar( <<-'END' ) 267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar NullableChildList3; 268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : x=ID INT? (y=ID)? SEMI -> ^($x INT? $y?) SEMI ; 273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver SEMI : ';' ; 276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\\n') {$channel=HIDDEN;} ; 277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver compile_and_load inline_grammar( <<-'END' ) 279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree grammar NullableChildList3Walker; 280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ASTLabelType=CommonTree; 283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { include ANTLR3::Test::CaptureOutput } 285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ^(ID INT? b) SEMI 286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver {self.capture($ID.to_s + ", " + $b.text.to_s)} 287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : ID? ; 289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = NullableChildList3::Lexer.new( "abc def;" ) 291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens = ANTLR3::CommonTokenStream.new( lexer ) 292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = NullableChildList3::Parser.new( tokens ) 293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parser.a 295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes = ANTLR3::AST::CommonTreeNodeStream.new( result.tree ) 296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes.token_stream = tokens 297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker = NullableChildList3Walker::TreeParser.new( nodes ) 298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker.a 299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker.output.should == "abc, def" 300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "actions after root" do 303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver compile_and_load inline_grammar( <<-'END' ) 304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar ActionsAfterRoot; 305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : x=ID INT? SEMI -> ^($x INT?) ; 310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver SEMI : ';' ; 313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver compile_and_load inline_grammar( <<-'END' ) 316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree grammar ActionsAfterRootWalker; 317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ASTLabelType=CommonTree; 320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { include ANTLR3::Test::CaptureOutput } 322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a @init {x=0} : ^(ID {x=1} {x=2} INT?) 323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver {say( $ID.to_s + ", " + x.to_s )} 324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = ActionsAfterRoot::Lexer.new( "abc;" ) 327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens = ANTLR3::CommonTokenStream.new( lexer ) 328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = ActionsAfterRoot::Parser.new( tokens ) 329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parser.a 331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes = ANTLR3::AST::CommonTreeNodeStream.new( result.tree ) 332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes.token_stream = tokens 333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker = ActionsAfterRootWalker::TreeParser.new( nodes ) 334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker.a 335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker.output.should == "abc, 2\n" 336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "wildcard lookahead" do 339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver compile_and_load inline_grammar( <<-'END' ) 340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar WildcardLookahead; 341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby; output=AST;} 342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID '+'^ INT; 343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver SEMI : ';' ; 346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver PERIOD : '.' ; 347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver compile_and_load inline_grammar( <<-'END' ) 350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree grammar WildcardLookaheadWalker; 351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby; tokenVocab=WildcardLookahead; ASTLabelType=CommonTree;} 352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { include ANTLR3::Test::CaptureOutput } 353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ^('+' . INT) { capture("alt 1") } 354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = WildcardLookahead::Lexer.new( "a + 2" ) 357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens = ANTLR3::CommonTokenStream.new( lexer ) 358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = WildcardLookahead::Parser.new( tokens ) 359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parser.a 361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes = ANTLR3::AST::CommonTreeNodeStream.new( result.tree ) 362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes.token_stream = tokens 363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker = WildcardLookaheadWalker::TreeParser.new( nodes ) 364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker.a 365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker.output.should == "alt 1" 366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "wildcard lookahead2" do 369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver compile_and_load inline_grammar( <<-'END' ) 370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar WildcardLookahead2; 371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby; output=AST;} 372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID '+'^ INT; 373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver SEMI : ';' ; 376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver PERIOD : '.' ; 377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver compile_and_load inline_grammar( <<-'END' ) 380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree grammar WildcardLookahead2Walker; 381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby; tokenVocab=WildcardLookahead2; ASTLabelType=CommonTree;} 382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { include ANTLR3::Test::CaptureOutput } 383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ^('+' . INT) { capture("alt 1") } 384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | ^('+' . .) { capture("alt 2") } 385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = WildcardLookahead2::Lexer.new( "a + 2" ) 388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens = ANTLR3::CommonTokenStream.new( lexer ) 389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = WildcardLookahead2::Parser.new( tokens ) 390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parser.a 392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes = ANTLR3::AST::CommonTreeNodeStream.new( result.tree ) 393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes.token_stream = tokens 394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker = WildcardLookahead2Walker::TreeParser.new( nodes ) 395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker.a 396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker.output.should == "alt 1" 397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "wildcard lookahead3" do 400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver compile_and_load inline_grammar( <<-'END' ) 401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar WildcardLookahead3; 402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby; output=AST;} 403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID '+'^ INT; 404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver SEMI : ';' ; 407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver PERIOD : '.' ; 408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver compile_and_load inline_grammar( <<-'END' ) 411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree grammar WildcardLookahead3Walker; 412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby; tokenVocab=WildcardLookahead3; ASTLabelType=CommonTree;} 413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { include ANTLR3::Test::CaptureOutput } 414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ^('+' ID INT) { capture("alt 1") } 415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | ^('+' . .) { capture("alt 2") } 416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = WildcardLookahead3::Lexer.new( "a + 2" ) 419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens = ANTLR3::CommonTokenStream.new( lexer ) 420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = WildcardLookahead3::Parser.new( tokens ) 421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parser.a 423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes = ANTLR3::AST::CommonTreeNodeStream.new( result.tree ) 424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes.token_stream = tokens 425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker = WildcardLookahead3Walker::TreeParser.new( nodes ) 426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker.a 427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker.output.should == "alt 1" 428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "wildcard plus lookahead" do 431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver compile_and_load inline_grammar( <<-'END' ) 432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar WildcardPlusLookahead; 433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby; output=AST;} 434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ID '+'^ INT; 435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z'+ ; 436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9'+; 437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver SEMI : ';' ; 438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver PERIOD : '.' ; 439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {$channel=HIDDEN;} ; 440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver compile_and_load inline_grammar( <<-'END' ) 442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree grammar WildcardPlusLookaheadWalker; 443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby; tokenVocab=WildcardPlusLookahead; ASTLabelType=CommonTree;} 444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { include ANTLR3::Test::CaptureOutput } 445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : ^('+' INT INT ) { capture("alt 1") } 446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | ^('+' .+) { capture("alt 2") } 447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = WildcardPlusLookahead::Lexer.new( "a + 2" ) 450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens = ANTLR3::CommonTokenStream.new( lexer ) 451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = WildcardPlusLookahead::Parser.new( tokens ) 452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parser.a 454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes = ANTLR3::AST::CommonTreeNodeStream.new( result.tree ) 455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes.token_stream = tokens 456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker = WildcardPlusLookaheadWalker::TreeParser.new( nodes ) 457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker.a 458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker.output.should == "alt 2" 459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend 462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestTreeParser2 < ANTLR3::Test::Functional 465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar GenericLanguage; 467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language = Ruby; 469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output=AST; 470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens { 473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver VAR_DEF; 474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ARG_DEF; 475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FUNC_HDR; 476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FUNC_DECL; 477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FUNC_DEF; 478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver BLOCK; 479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver program 482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : declaration+ 483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver declaration 486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : variable 487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | functionHeader ';' -> ^(FUNC_DECL functionHeader) 488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | functionHeader block -> ^(FUNC_DEF functionHeader block) 489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver variable 492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : type declarator ';' -> ^(VAR_DEF type declarator) 493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver declarator 496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : ID 497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver functionHeader 500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : type ID '(' ( formalParameter ( ',' formalParameter )* )? ')' 501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver -> ^(FUNC_HDR type ID formalParameter+) 502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver formalParameter 505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : type declarator -> ^(ARG_DEF type declarator) 506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver type 509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : 'int' 510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | 'char' 511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | 'void' 512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | ID 513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver block 516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : lc='{' 517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver variable* 518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver stat* 519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver '}' 520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver -> ^(BLOCK[$lc,"BLOCK"] variable* stat*) 521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver stat: forStat 524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | expr ';'! 525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | block 526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | assignStat ';'! 527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | ';'! 528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver forStat 531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : 'for' '(' start=assignStat ';' expr ';' next=assignStat ')' block 532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver -> ^('for' $start expr $next block) 533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assignStat 536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : ID EQ expr -> ^(EQ ID expr) 537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver expr: condExpr 540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver condExpr 543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : aexpr ( ('=='^ | '<'^) aexpr )? 544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver aexpr 547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : atom ( '+'^ atom )* 548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver atom 551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : ID 552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | INT 553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | '(' expr ')' -> expr 554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FOR : 'for' ; 557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT_TYPE : 'int' ; 558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver CHAR: 'char'; 559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver VOID: 'void'; 560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* 562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : ('0'..'9')+ 565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver EQ : '=' ; 568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver EQEQ : '==' ; 569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver LT : '<' ; 570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver PLUS : '+' ; 571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : ( ' ' 573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | '\t' 574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | '\r' 575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | '\n' 576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver )+ 577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { $channel=HIDDEN } 578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree grammar GenericLanguageWalker; 583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language = Ruby; 585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokenVocab = GenericLanguage; 586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ASTLabelType = CommonTree; 587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @init { @traces = [] } 590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { 591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver attr_reader :traces 592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def trace_in(rule_name, rule_index) 594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @traces << ">#{rule_name}" 595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def trace_out(rule_name, rule_index) 598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @traces << "<#{rule_name}" 599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver program 603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : declaration+ 604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver declaration 607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : variable 608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | ^(FUNC_DECL functionHeader) 609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | ^(FUNC_DEF functionHeader block) 610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver variable returns [res] 613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : ^(VAR_DEF type declarator) 614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $res = $declarator.text; 616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver declarator 620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : ID 621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver functionHeader 624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : ^(FUNC_HDR type ID formalParameter+) 625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver formalParameter 628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : ^(ARG_DEF type declarator) 629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver type 632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : 'int' 633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | 'char' 634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | 'void' 635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | ID 636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver block 639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : ^(BLOCK variable* stat*) 640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver stat: forStat 643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | expr 644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | block 645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver forStat 648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : ^('for' expr expr expr block) 649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver expr: ^(EQEQ expr expr) 652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | ^(LT expr expr) 653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | ^(PLUS expr expr) 654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | ^(EQ ID expr) 655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | atom 656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver atom 659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : ID 660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | INT 661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver compile_options :trace => true 665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "processing AST output from a parser with a tree parser" do 667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver input_source = <<-END.fixed_indent( 0 ) 668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver char c; 669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int x; 670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void bar(int x); 672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int foo(int y, char d) { 674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int i; 675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (i=0; i<3; i=i+1) { 676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver x=3; 677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver y=5; 678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = GenericLanguage::Lexer.new( input_source ) 683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = GenericLanguage::Parser.new( lexer ) 684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver expected_tree = <<-END.strip!.gsub!( /\s+/, ' ' ) 686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (VAR_DEF char c) 687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (VAR_DEF int x) 688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (FUNC_DECL (FUNC_HDR void bar (ARG_DEF int x))) 689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (FUNC_DEF 690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (FUNC_HDR int foo (ARG_DEF int y) (ARG_DEF char d)) 691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (BLOCK 692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (VAR_DEF int i) 693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (for (= i 0) (< i 3) (= i (+ i 1)) 694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (BLOCK (= x 3) (= y 5))))) 695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parser.program 698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result.tree.inspect.should == expected_tree 699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes = ANTLR3::AST::CommonTreeNodeStream.new( result.tree ) 701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes.token_stream = parser.input 702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree_parser = GenericLanguageWalker::TreeParser.new( nodes ) 703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree_parser.program 705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree_parser.traces.should == %w( 706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver >program >declaration >variable >type 707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <type >declarator <declarator <variable 708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <declaration >declaration >variable >type 709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <type >declarator <declarator <variable 710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <declaration >declaration >functionHeader >type 711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <type >formalParameter >type <type 712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver >declarator <declarator <formalParameter <functionHeader 713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <declaration >declaration >functionHeader >type 714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <type >formalParameter >type <type 715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver >declarator <declarator <formalParameter >formalParameter 716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver >type <type >declarator <declarator 717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <formalParameter <functionHeader >block >variable 718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver >type <type >declarator <declarator 719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <variable >stat >forStat >expr 720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver >expr >atom <atom <expr 721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <expr >expr >expr >atom 722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <atom <expr >expr >atom 723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <atom <expr <expr >expr 724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver >expr >expr >atom <atom 725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <expr >expr >atom <atom 726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <expr <expr <expr >block 727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver >stat >expr >expr >atom 728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <atom <expr <expr <stat 729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver >stat >expr >expr >atom 730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <atom <expr <expr <stat 731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <block <forStat <stat <block 732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver <declaration <program 733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example 'tree parser rule label property references' do 737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver input = "char c;\n" 738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = GenericLanguage::Lexer.new( "char c;\n" ) 739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = GenericLanguage::Parser.new( lexer ) 740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver result = parser.variable 742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes = ANTLR3::AST::CommonTreeNodeStream.new( result.tree ) 743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes.token_stream = parser.input 744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree_parser = GenericLanguageWalker::TreeParser.new( nodes ) 746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree_parser.variable.should == 'c' 747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend 750