1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#!/usr/bin/ruby 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# encoding: utf-8 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrequire 'antlr3/test/functional' 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestRulePropertyReference < ANTLR3::Test::Functional 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar RuleProperties; 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { language = Ruby; } 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @parser::members { 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def emit_error_message(msg) 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # do nothing 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def report_error(error) 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver raise error 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @lexer::members { 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def emit_error_message(msg) 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # do nothing 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def report_error(error) 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver raise error 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a returns [bla] 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @after { $bla = [$start, $stop, $text] } 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : A+ 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver A: 'a'..'z'; 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS: ' '+ { $channel = HIDDEN }; 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "accessing rule properties" do 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = RuleProperties::Lexer.new( ' a a a a ' ) 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = RuleProperties::Parser.new lexer 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver start, stop, text = parser.a.bla 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver start.index.should == 1 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver stop.index.should == 7 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver text.should == 'a a a a' 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestLabels < ANTLR3::Test::Functional 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar Labels; 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { language = Ruby; } 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @parser::members { 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def recover(e) 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver raise e 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @lexer::members { 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def recover(e) 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver raise e 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a returns [l] 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : ids+=A ( ',' ids+=(A|B) )* C D w=. ids+=. F EOF 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { $l = [$ids, $w] } 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver A: 'a'..'z'; 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver B: '0'..'9'; 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver C: a='A' { $a }; 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver D: a='FOOBAR' { $a }; 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver E: 'GNU' a=. { $a }; 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver F: 'BLARZ' a=EOF { $a }; 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS: ' '+ { $channel = HIDDEN }; 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "parsing 'a, b, c, 1, 2 A FOOBAR GNU1 A BLARZ'" do 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = Labels::Lexer.new 'a, b, c, 1, 2 A FOOBAR GNU1 A BLARZ' 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = Labels::Parser.new lexer 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ids, w = parser.a 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ids.should have( 6 ).things 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ids[ 0 ].text.should == 'a' 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ids[ 1 ].text.should == 'b' 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ids[ 2 ].text.should == 'c' 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ids[ 3 ].text.should == '1' 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ids[ 4 ].text.should == '2' 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ids[ 5 ].text.should == 'A' 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver w.text.should == 'GNU1' 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestTokenLabelReference < ANTLR3::Test::Functional 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar TokenLabels; 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language = Ruby; 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @parser::members { 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def emit_error_message(msg) 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # do nothing 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def report_error(error) 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver raise error 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @lexer::members { 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def emit_error_message(msg) 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # do nothing 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def report_error(error) 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver raise error 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a returns [$tk] 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : t=A 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $tk = [ 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $t.text, 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $t.type, 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $t.name, 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $t.line, 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $t.pos, 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $t.index, 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $t.channel 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ] 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver A: 'a'..'z'; 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ( ' ' 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | '\t' 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | ( '\n' 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | '\r\n' 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | '\r' 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver )+ 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { $channel = HIDDEN } 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "accessing tokens with labels" do 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = TokenLabels::Lexer.new( ' a' ) 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = TokenLabels::Parser.new lexer 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tk = parser.a 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tk.should == [ 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 'a', TokenLabels::TokenData::A, 'A', 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1, 3, 1, :default 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ] 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestRuleLabelReference < ANTLR3::Test::Functional 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar RuleLabelReference; 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language = Ruby;} 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @parser::members { 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def emit_error_message(msg) 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # do nothing 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def report_error(error) 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver raise error 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @lexer::members { 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def emit_error_message(msg) 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # do nothing 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def report_error(error) 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver raise error 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a returns [bla]: t=b 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $bla = [$t.start, $t.stop, $t.text] 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b: A+; 205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver A: 'a'..'z'; 207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS: ' '+ { $channel = HIDDEN }; 209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "referencing rule properties using rule labels" do 212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = RuleLabelReference::Lexer.new( ' a a a a ' ) 213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = RuleLabelReference::Parser.new lexer 214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver start, stop, text = parser.a 215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver start.index.should == 1 217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver stop.index.should == 7 218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver text.should == 'a a a a' 219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend 222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestReferenceDoesntSetChannel < ANTLR3::Test::Functional 226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar ReferenceSetChannel; 229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options {language=Ruby;} 230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a returns [foo]: A EOF { $foo = '\%s, channel=\%p' \% [$A.text, $A.channel]; } ; 231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver A : '-' WS I ; 232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver I : '0'..'9'+ ; 233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS: ' ' | '\t'; 234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example 'verifying that a token reference does not set its channel' do 237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = ReferenceSetChannel::Lexer.new( "- 34" ) 238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = ReferenceSetChannel::Parser.new lexer 239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser.a.should == "- 34, channel=:default" 240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend 243