1#!/usr/bin/ruby 2# encoding: utf-8 3 4require 'antlr3/test/functional' 5 6class TestImportedGrammars < ANTLR3::Test::Functional 7 8 def load( grammar ) 9 grammar.compile 10 $:.unshift( grammar.output_directory ) unless $:.include?( grammar.output_directory ) 11 for file in grammar.target_files( false ) 12 require File.basename( file, '.rb' ) 13 end 14 end 15 16 example 'delegator invokes delegate rule' do 17 inline_grammar( <<-'END' ) 18 parser grammar DIDRSlave; 19 options { language=Ruby; } 20 @members { 21 def capture(t) 22 @didr_master.capture(t) 23 end 24 } 25 a : B { capture("S.a") } ; 26 END 27 load inline_grammar( <<-'END' ) 28 grammar DIDRMaster; 29 options { language=Ruby; } 30 import DIDRSlave; 31 32 @members { include ANTLR3::Test::CaptureOutput } 33 34 s : a ; 35 B : 'b' ; 36 WS : (' '|'\n') { skip() } ; 37 END 38 39 lexer = DIDRMaster::Lexer.new( 'b' ) 40 tokens = ANTLR3::CommonTokenStream.new( lexer ) 41 parser = DIDRMaster::Parser.new( tokens ) 42 parser.s 43 parser.output.should == 'S.a' 44 end 45 46 example 'delegator invokes delegate rule with args' do 47 inline_grammar( <<-'END' ) 48 parser grammar Slave2; 49 options { 50 language=Ruby; 51 } 52 @members { 53 def capture(t) 54 @master_2.capture(t) 55 end 56 } 57 a[x] returns [y] : B {capture("S.a"); $y="1000";} ; 58 END 59 load inline_grammar( <<-'END' ) 60 grammar Master2; 61 options {language=Ruby;} 62 import Slave2; 63 64 @members { include ANTLR3::Test::CaptureOutput } 65 66 s : label=a[3] {capture($label.y)} ; 67 B : 'b' ; 68 WS : (' '|'\n') {skip} ; 69 END 70 lexer = Master2::Lexer.new( 'b' ) 71 tokens = ANTLR3::CommonTokenStream.new( lexer ) 72 parser = Master2::Parser.new( tokens ) 73 parser.s 74 parser.output.should == 'S.a1000' 75 end 76 77 example "delegator accesses delegate members" do 78 inline_grammar( <<-'END' ) 79 parser grammar Slave3; 80 options { 81 language=Ruby; 82 } 83 @members { 84 def capture(t) 85 @master_3.capture(t) 86 end 87 88 def whatevs 89 capture("whatevs") 90 end 91 } 92 a : B ; 93 END 94 load inline_grammar( <<-'END' ) 95 grammar Master3; 96 options { 97 language=Ruby; 98 } 99 import Slave3; 100 @members { include ANTLR3::Test::CaptureOutput } 101 102 s : 'b' {@slave_3.whatevs} ; 103 WS : (' '|'\n') {skip()} ; 104 END 105 106 parser = Master3::Parser.new( Master3::Lexer.new( 'b' ) ) 107 parser.s 108 parser.output.should == 'whatevs' 109 end 110 111 example "delegator invokes first version of delegate rule" do 112 inline_grammar( <<-'END' ) 113 parser grammar Slave4A; 114 options { 115 language=Ruby; 116 } 117 @members { 118 def capture(t) 119 @master_4.capture(t) 120 end 121 } 122 a : b {capture("S.a")} ; 123 b : B ; 124 END 125 inline_grammar( <<-'END' ) 126 parser grammar Slave4B; 127 options { 128 language=Ruby; 129 } 130 @members { 131 def capture(t) 132 @master_4.capture(t) 133 end 134 } 135 a : B {capture("T.a")} ; 136 END 137 load inline_grammar( <<-'END' ) 138 grammar Master4; 139 options { 140 language=Ruby; 141 } 142 import Slave4A, Slave4B; 143 @members { include ANTLR3::Test::CaptureOutput } 144 s : a ; 145 B : 'b' ; 146 WS : (' '|'\n') {skip} ; 147 END 148 149 parser = Master4::Parser.new( Master4::Lexer.new( 'b' ) ) 150 parser.s 151 parser.output.should == 'S.a' 152 end 153 154 example "delegates see same token type" do 155 inline_grammar( <<-'END' ) 156 parser grammar Slave5A; // A, B, C token type order 157 options { 158 language=Ruby; 159 } 160 tokens { A; B; C; } 161 @members { 162 def capture(t) 163 @master_5.capture(t) 164 end 165 } 166 x : A {capture("S.x ")} ; 167 END 168 inline_grammar( <<-'END' ) 169 parser grammar Slave5B; 170 options { 171 language=Ruby; 172 } 173 tokens { C; B; A; } /// reverse order 174 @members { 175 def capture(t) 176 @master_5.capture(t) 177 end 178 } 179 y : A {capture("T.y")} ; 180 END 181 load inline_grammar( <<-'END' ) 182 grammar Master5; 183 options { 184 language=Ruby; 185 } 186 import Slave5A, Slave5B; 187 @members { include ANTLR3::Test::CaptureOutput } 188 s : x y ; // matches AA, which should be "aa" 189 B : 'b' ; // another order: B, A, C 190 A : 'a' ; 191 C : 'c' ; 192 WS : (' '|'\n') {skip} ; 193 END 194 195 lexer = Master5::Lexer.new( 'aa' ) 196 tokens = ANTLR3::CommonTokenStream.new( lexer ) 197 parser = Master5::Parser.new( tokens ) 198 parser.s 199 parser.output.should == 'S.x T.y' 200 end 201 202 example "delegator rule overrides delegate" do 203 inline_grammar( <<-'END' ) 204 parser grammar Slave6; 205 options { 206 language=Ruby; 207 } 208 @members { 209 def capture(t) 210 @master_6.capture(t) 211 end 212 } 213 a : b {capture("S.a")} ; 214 b : B ; 215 END 216 load inline_grammar( <<-'END' ) 217 grammar Master6; 218 options { language=Ruby; } 219 import Slave6; 220 @members { include ANTLR3::Test::CaptureOutput } 221 b : 'b'|'c' ; 222 WS : (' '|'\n') {skip} ; 223 END 224 225 parser = Master6::Parser.new( Master6::Lexer.new( 'c' ) ) 226 parser.a 227 parser.output.should == 'S.a' 228 end 229 230 example "lexer delegator invokes delegate rule" do 231 inline_grammar( <<-'END' ) 232 lexer grammar Slave7; 233 options { 234 language=Ruby; 235 } 236 @members { 237 def capture(t) 238 @master_7.capture(t) 239 end 240 } 241 A : 'a' {capture("S.A ")} ; 242 C : 'c' ; 243 END 244 load inline_grammar( <<-'END' ) 245 lexer grammar Master7; 246 options { 247 language=Ruby; 248 } 249 import Slave7; 250 @members { include ANTLR3::Test::CaptureOutput } 251 B : 'b' ; 252 WS : (' '|'\n') {skip} ; 253 END 254 255 lexer = Master7::Lexer.new( 'abc' ) 256 lexer.map { |tk| lexer.capture( tk.text ) } 257 lexer.output.should == 'S.A abc' 258 end 259 260 example "lexer delegator rule overrides delegate" do 261 inline_grammar( <<-'END' ) 262 lexer grammar Slave8; 263 options {language=Ruby;} 264 @members { 265 def capture(t) 266 @master_8.capture(t) 267 end 268 } 269 A : 'a' {capture("S.A")} ; 270 END 271 load inline_grammar( <<-'END' ) 272 lexer grammar Master8; 273 options {language=Ruby;} 274 import Slave8; 275 @members { include ANTLR3::Test::CaptureOutput } 276 A : 'a' {capture("M.A ")} ; 277 WS : (' '|'\n') {skip} ; 278 END 279 280 lexer = Master8::Lexer.new( 'a' ) 281 lexer.map { |tk| lexer.capture( tk.text ) } 282 lexer.output.should == 'M.A a' 283 end 284 285 example "delegator rule with syntactic predicates" do 286 inline_grammar( <<-'END' ) 287 parser grammar Slave9; 288 options { language=Ruby; } 289 @members { 290 def capture(t) 291 @master_9.capture(t) 292 end 293 } 294 a : b c; 295 c : ('c' 'b')=> 'c' 'b' { capture("(cb)") } 296 | ('c' 'c')=> 'c' 297 ; 298 END 299 load inline_grammar( <<-'END' ) 300 grammar Master9; 301 options { language=Ruby; } 302 import Slave9; 303 @members { include ANTLR3::Test::CaptureOutput } 304 b : ('b' 'b')=> 'b' 'b' 305 | ('b' 'c')=> 'b' {capture("(bc)")} 306 ; 307 WS : (' '|'\n') {skip} ; 308 END 309 310 parser = Master9::Parser.new( Master9::Lexer.new( 'bcb' ) ) 311 parser.a 312 parser.output.should == '(bc)(cb)' 313 end 314 315 example "lots of imported lexers" do 316 inline_grammar( <<-'END' ) 317 lexer grammar SlaveOfSlaves; 318 options { language=Ruby; } 319 320 INTEGER: ('+'|'-')? DIGITS; 321 FLOAT: INTEGER '.' DIGITS (('e'|'E') INTEGER)?; 322 fragment DIGITS: ('0'..'9')+; 323 END 324 inline_grammar( <<-'END' ) 325 lexer grammar FirstSlave; 326 options { language=Ruby; } 327 328 import SlaveOfSlaves; 329 330 ID: ('A'..'Z')+; 331 OPS: '+' | '-' | '*' | '/'; 332 END 333 inline_grammar( <<-'END' ) 334 lexer grammar SecondSlave; 335 options { language=Ruby; } 336 337 INT: ('0'..'9')+; 338 ID: ('a'..'z'|'A'..'Z'|'_')+; 339 END 340 load inline_grammar( <<-'END' ) 341 lexer grammar MasterOfAll; 342 options { language=Ruby; } 343 344 import FirstSlave, SecondSlave; 345 346 ID: ('a'..'z'|'A'..'Z'|'_')+; 347 WS: ' '+ { $channel=HIDDEN }; 348 END 349 350 MasterOfAll::Lexer.master_grammars.should == [] 351 MasterOfAll::Lexer.imported_grammars.should == Set[ :FirstSlave, :SecondSlave ] 352 MasterOfAll::Lexer.master.should be_nil 353 354 MasterOfAll::FirstSlave.master_grammars.should == [ :MasterOfAll ] 355 MasterOfAll::FirstSlave.imported_grammars.should == Set[ :SlaveOfSlaves ] 356 MasterOfAll::FirstSlave.master.should == :MasterOfAll 357 358 MasterOfAll::SecondSlave.master_grammars.should == [ :MasterOfAll ] 359 MasterOfAll::SecondSlave.imported_grammars.should == Set[ ] 360 MasterOfAll::SecondSlave.master.should == :MasterOfAll 361 362 MasterOfAll::FirstSlave::SlaveOfSlaves.master_grammars.should == [ :MasterOfAll, :FirstSlave ] 363 MasterOfAll::FirstSlave::SlaveOfSlaves.imported_grammars.should == Set[ ] 364 MasterOfAll::FirstSlave::SlaveOfSlaves.master.should == :FirstSlave 365 366 master = MasterOfAll::Lexer.new( 'blah de blah' ) 367 master.should respond_to :first_slave 368 master.should respond_to :second_slave 369 master.first_slave.should respond_to :slave_of_slaves 370 master.first_slave.should respond_to :master_of_all 371 master.first_slave.slave_of_slaves.should respond_to :first_slave 372 master.first_slave.slave_of_slaves.should respond_to :master_of_all 373 dels = master.each_delegate.map { |d| d } 374 dels.should have( 2 ).things 375 dels.should include master.first_slave 376 dels.should include master.second_slave 377 end 378 379end 380