1#!/usr/bin/ruby 2# encoding: utf-8 3 4require 'antlr3/test/functional' 5 6class TestRulePropertyReference < ANTLR3::Test::Functional 7 8 inline_grammar( <<-'END' ) 9 grammar RuleProperties; 10 options { language = Ruby; } 11 12 @parser::members { 13 def emit_error_message(msg) 14 # do nothing 15 end 16 def report_error(error) 17 raise error 18 end 19 } 20 21 @lexer::members { 22 def emit_error_message(msg) 23 # do nothing 24 end 25 def report_error(error) 26 raise error 27 end 28 } 29 30 a returns [bla] 31 @after { $bla = [$start, $stop, $text] } 32 : A+ 33 ; 34 35 A: 'a'..'z'; 36 37 WS: ' '+ { $channel = HIDDEN }; 38 END 39 40 example "accessing rule properties" do 41 lexer = RuleProperties::Lexer.new( ' a a a a ' ) 42 parser = RuleProperties::Parser.new lexer 43 start, stop, text = parser.a.bla 44 45 start.index.should == 1 46 stop.index.should == 7 47 text.should == 'a a a a' 48 end 49 50 51end 52 53class TestLabels < ANTLR3::Test::Functional 54 55 inline_grammar( <<-'END' ) 56 grammar Labels; 57 options { language = Ruby; } 58 59 @parser::members { 60 def recover(e) 61 raise e 62 end 63 } 64 65 @lexer::members { 66 def recover(e) 67 raise e 68 end 69 } 70 71 a returns [l] 72 : ids+=A ( ',' ids+=(A|B) )* C D w=. ids+=. F EOF 73 { $l = [$ids, $w] } 74 ; 75 76 A: 'a'..'z'; 77 B: '0'..'9'; 78 C: a='A' { $a }; 79 D: a='FOOBAR' { $a }; 80 E: 'GNU' a=. { $a }; 81 F: 'BLARZ' a=EOF { $a }; 82 83 WS: ' '+ { $channel = HIDDEN }; 84 END 85 86 example "parsing 'a, b, c, 1, 2 A FOOBAR GNU1 A BLARZ'" do 87 lexer = Labels::Lexer.new 'a, b, c, 1, 2 A FOOBAR GNU1 A BLARZ' 88 parser = Labels::Parser.new lexer 89 ids, w = parser.a 90 91 ids.should have( 6 ).things 92 ids[ 0 ].text.should == 'a' 93 ids[ 1 ].text.should == 'b' 94 ids[ 2 ].text.should == 'c' 95 ids[ 3 ].text.should == '1' 96 ids[ 4 ].text.should == '2' 97 ids[ 5 ].text.should == 'A' 98 99 w.text.should == 'GNU1' 100 end 101 102 103end 104 105 106class TestTokenLabelReference < ANTLR3::Test::Functional 107 108 inline_grammar( <<-'END' ) 109 grammar TokenLabels; 110 options { 111 language = Ruby; 112 } 113 114 @parser::members { 115 def emit_error_message(msg) 116 # do nothing 117 end 118 def report_error(error) 119 raise error 120 end 121 } 122 123 @lexer::members { 124 def emit_error_message(msg) 125 # do nothing 126 end 127 def report_error(error) 128 raise error 129 end 130 } 131 132 a returns [$tk] 133 : t=A 134 { 135 $tk = [ 136 $t.text, 137 $t.type, 138 $t.name, 139 $t.line, 140 $t.pos, 141 $t.index, 142 $t.channel 143 ] 144 } 145 ; 146 147 A: 'a'..'z'; 148 149 WS : 150 ( ' ' 151 | '\t' 152 | ( '\n' 153 | '\r\n' 154 | '\r' 155 ) 156 )+ 157 { $channel = HIDDEN } 158 ; 159 END 160 161 example "accessing tokens with labels" do 162 lexer = TokenLabels::Lexer.new( ' a' ) 163 parser = TokenLabels::Parser.new lexer 164 tk = parser.a 165 tk.should == [ 166 'a', TokenLabels::TokenData::A, 'A', 167 1, 3, 1, :default 168 ] 169 end 170 171 172end 173 174class TestRuleLabelReference < ANTLR3::Test::Functional 175 176 inline_grammar( <<-'END' ) 177 grammar RuleLabelReference; 178 options {language = Ruby;} 179 180 @parser::members { 181 def emit_error_message(msg) 182 # do nothing 183 end 184 def report_error(error) 185 raise error 186 end 187 } 188 189 @lexer::members { 190 def emit_error_message(msg) 191 # do nothing 192 end 193 def report_error(error) 194 raise error 195 end 196 } 197 198 a returns [bla]: t=b 199 { 200 $bla = [$t.start, $t.stop, $t.text] 201 } 202 ; 203 204 b: A+; 205 206 A: 'a'..'z'; 207 208 WS: ' '+ { $channel = HIDDEN }; 209 END 210 211 example "referencing rule properties using rule labels" do 212 lexer = RuleLabelReference::Lexer.new( ' a a a a ' ) 213 parser = RuleLabelReference::Parser.new lexer 214 start, stop, text = parser.a 215 216 start.index.should == 1 217 stop.index.should == 7 218 text.should == 'a a a a' 219 end 220 221end 222 223 224 225class TestReferenceDoesntSetChannel < ANTLR3::Test::Functional 226 227 inline_grammar( <<-'END' ) 228 grammar ReferenceSetChannel; 229 options {language=Ruby;} 230 a returns [foo]: A EOF { $foo = '\%s, channel=\%p' \% [$A.text, $A.channel]; } ; 231 A : '-' WS I ; 232 I : '0'..'9'+ ; 233 WS: ' ' | '\t'; 234 END 235 236 example 'verifying that a token reference does not set its channel' do 237 lexer = ReferenceSetChannel::Lexer.new( "- 34" ) 238 parser = ReferenceSetChannel::Parser.new lexer 239 parser.a.should == "- 34, channel=:default" 240 end 241 242end 243