Home | History | Annotate | Download | only in delegation
      1 #!/usr/bin/ruby
      2 # encoding: utf-8
      3 
      4 require 'antlr3/test/functional'
      5 
      6 class 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   
    379 end
    380