1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#!/usr/bin/ruby 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# encoding: utf-8 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrequire 'antlr3/test/functional' 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestImportedGrammars < ANTLR3::Test::Functional 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def load( grammar ) 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar.compile 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $:.unshift( grammar.output_directory ) unless $:.include?( grammar.output_directory ) 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for file in grammar.target_files( false ) 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver require File.basename( file, '.rb' ) 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example 'delegator invokes delegate rule' do 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser grammar DIDRSlave; 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { language=Ruby; } 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def capture(t) 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @didr_master.capture(t) 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : B { capture("S.a") } ; 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver load inline_grammar( <<-'END' ) 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar DIDRMaster; 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { language=Ruby; } 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver import DIDRSlave; 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { include ANTLR3::Test::CaptureOutput } 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver s : a ; 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver B : 'b' ; 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') { skip() } ; 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = DIDRMaster::Lexer.new( 'b' ) 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens = ANTLR3::CommonTokenStream.new( lexer ) 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = DIDRMaster::Parser.new( tokens ) 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser.s 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser.output.should == 'S.a' 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example 'delegator invokes delegate rule with args' do 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser grammar Slave2; 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def capture(t) 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @master_2.capture(t) 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a[x] returns [y] : B {capture("S.a"); $y="1000";} ; 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver load inline_grammar( <<-'END' ) 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar Master2; 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;} 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver import Slave2; 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { include ANTLR3::Test::CaptureOutput } 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver s : label=a[3] {capture($label.y)} ; 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver B : 'b' ; 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {skip} ; 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = Master2::Lexer.new( 'b' ) 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens = ANTLR3::CommonTokenStream.new( lexer ) 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = Master2::Parser.new( tokens ) 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser.s 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser.output.should == 'S.a1000' 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "delegator accesses delegate members" do 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser grammar Slave3; 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def capture(t) 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @master_3.capture(t) 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def whatevs 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver capture("whatevs") 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : B ; 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver load inline_grammar( <<-'END' ) 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar Master3; 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver import Slave3; 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { include ANTLR3::Test::CaptureOutput } 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver s : 'b' {@slave_3.whatevs} ; 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {skip()} ; 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = Master3::Parser.new( Master3::Lexer.new( 'b' ) ) 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser.s 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser.output.should == 'whatevs' 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "delegator invokes first version of delegate rule" do 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser grammar Slave4A; 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def capture(t) 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @master_4.capture(t) 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : b {capture("S.a")} ; 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : B ; 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser grammar Slave4B; 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def capture(t) 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @master_4.capture(t) 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : B {capture("T.a")} ; 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver load inline_grammar( <<-'END' ) 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar Master4; 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver import Slave4A, Slave4B; 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { include ANTLR3::Test::CaptureOutput } 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver s : a ; 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver B : 'b' ; 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {skip} ; 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = Master4::Parser.new( Master4::Lexer.new( 'b' ) ) 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser.s 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser.output.should == 'S.a' 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "delegates see same token type" do 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser grammar Slave5A; // A, B, C token type order 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens { A; B; C; } 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def capture(t) 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @master_5.capture(t) 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver x : A {capture("S.x ")} ; 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser grammar Slave5B; 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens { C; B; A; } /// reverse order 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def capture(t) 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @master_5.capture(t) 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver y : A {capture("T.y")} ; 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver load inline_grammar( <<-'END' ) 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar Master5; 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver import Slave5A, Slave5B; 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { include ANTLR3::Test::CaptureOutput } 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver s : x y ; // matches AA, which should be "aa" 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver B : 'b' ; // another order: B, A, C 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver A : 'a' ; 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver C : 'c' ; 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {skip} ; 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = Master5::Lexer.new( 'aa' ) 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens = ANTLR3::CommonTokenStream.new( lexer ) 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = Master5::Parser.new( tokens ) 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser.s 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser.output.should == 'S.x T.y' 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "delegator rule overrides delegate" do 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser grammar Slave6; 205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { 209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def capture(t) 210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @master_6.capture(t) 211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : b {capture("S.a")} ; 214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : B ; 215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver load inline_grammar( <<-'END' ) 217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar Master6; 218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { language=Ruby; } 219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver import Slave6; 220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { include ANTLR3::Test::CaptureOutput } 221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : 'b'|'c' ; 222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {skip} ; 223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = Master6::Parser.new( Master6::Lexer.new( 'c' ) ) 226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser.a 227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser.output.should == 'S.a' 228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "lexer delegator invokes delegate rule" do 231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer grammar Slave7; 233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { 237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def capture(t) 238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @master_7.capture(t) 239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver A : 'a' {capture("S.A ")} ; 242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver C : 'c' ; 243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver load inline_grammar( <<-'END' ) 245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer grammar Master7; 246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language=Ruby; 248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver import Slave7; 250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { include ANTLR3::Test::CaptureOutput } 251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver B : 'b' ; 252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {skip} ; 253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = Master7::Lexer.new( 'abc' ) 256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer.map { |tk| lexer.capture( tk.text ) } 257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer.output.should == 'S.A abc' 258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "lexer delegator rule overrides delegate" do 261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer grammar Slave8; 263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;} 264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { 265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def capture(t) 266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @master_8.capture(t) 267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver A : 'a' {capture("S.A")} ; 270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver load inline_grammar( <<-'END' ) 272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer grammar Master8; 273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;} 274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver import Slave8; 275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { include ANTLR3::Test::CaptureOutput } 276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver A : 'a' {capture("M.A ")} ; 277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {skip} ; 278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = Master8::Lexer.new( 'a' ) 281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer.map { |tk| lexer.capture( tk.text ) } 282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer.output.should == 'M.A a' 283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "delegator rule with syntactic predicates" do 286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser grammar Slave9; 288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { language=Ruby; } 289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { 290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def capture(t) 291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @master_9.capture(t) 292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a : b c; 295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver c : ('c' 'b')=> 'c' 'b' { capture("(cb)") } 296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | ('c' 'c')=> 'c' 297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver load inline_grammar( <<-'END' ) 300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar Master9; 301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { language=Ruby; } 302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver import Slave9; 303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { include ANTLR3::Test::CaptureOutput } 304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b : ('b' 'b')=> 'b' 'b' 305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | ('b' 'c')=> 'b' {capture("(bc)")} 306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : (' '|'\n') {skip} ; 308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = Master9::Parser.new( Master9::Lexer.new( 'bcb' ) ) 311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser.a 312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser.output.should == '(bc)(cb)' 313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "lots of imported lexers" do 316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer grammar SlaveOfSlaves; 318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { language=Ruby; } 319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INTEGER: ('+'|'-')? DIGITS; 321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FLOAT: INTEGER '.' DIGITS (('e'|'E') INTEGER)?; 322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver fragment DIGITS: ('0'..'9')+; 323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer grammar FirstSlave; 326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { language=Ruby; } 327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver import SlaveOfSlaves; 329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID: ('A'..'Z')+; 331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver OPS: '+' | '-' | '*' | '/'; 332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer grammar SecondSlave; 335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { language=Ruby; } 336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT: ('0'..'9')+; 338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID: ('a'..'z'|'A'..'Z'|'_')+; 339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver load inline_grammar( <<-'END' ) 341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer grammar MasterOfAll; 342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { language=Ruby; } 343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver import FirstSlave, SecondSlave; 345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID: ('a'..'z'|'A'..'Z'|'_')+; 347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS: ' '+ { $channel=HIDDEN }; 348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver MasterOfAll::Lexer.master_grammars.should == [] 351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver MasterOfAll::Lexer.imported_grammars.should == Set[ :FirstSlave, :SecondSlave ] 352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver MasterOfAll::Lexer.master.should be_nil 353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver MasterOfAll::FirstSlave.master_grammars.should == [ :MasterOfAll ] 355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver MasterOfAll::FirstSlave.imported_grammars.should == Set[ :SlaveOfSlaves ] 356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver MasterOfAll::FirstSlave.master.should == :MasterOfAll 357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver MasterOfAll::SecondSlave.master_grammars.should == [ :MasterOfAll ] 359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver MasterOfAll::SecondSlave.imported_grammars.should == Set[ ] 360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver MasterOfAll::SecondSlave.master.should == :MasterOfAll 361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver MasterOfAll::FirstSlave::SlaveOfSlaves.master_grammars.should == [ :MasterOfAll, :FirstSlave ] 363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver MasterOfAll::FirstSlave::SlaveOfSlaves.imported_grammars.should == Set[ ] 364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver MasterOfAll::FirstSlave::SlaveOfSlaves.master.should == :FirstSlave 365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver master = MasterOfAll::Lexer.new( 'blah de blah' ) 367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver master.should respond_to :first_slave 368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver master.should respond_to :second_slave 369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver master.first_slave.should respond_to :slave_of_slaves 370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver master.first_slave.should respond_to :master_of_all 371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver master.first_slave.slave_of_slaves.should respond_to :first_slave 372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver master.first_slave.slave_of_slaves.should respond_to :master_of_all 373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dels = master.each_delegate.map { |d| d } 374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dels.should have( 2 ).things 375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dels.should include master.first_slave 376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dels.should include master.second_slave 377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend 380