1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#!/usr/bin/ruby 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# encoding: utf-8 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrequire 'antlr3/test/functional' 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestPredicateHoist < ANTLR3::Test::Functional 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar TestHoist; 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language = Ruby; 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* With this true, enum is seen as a keyword. False, it's an identifier */ 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @parser::init { 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @enable_enum = false 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver attr_accessor :enable_enum 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver stat returns [enumIs] 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : identifier {$enumIs = "ID"} 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | enumAsKeyword {$enumIs = "keyword"} 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver identifier 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : ID 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | enumAsID 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver enumAsKeyword : {@enable_enum}? 'enum' ; 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver enumAsID : {!@enable_enum}? 'enum' ; 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : ('0'..'9')+ 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS : ( ' ' 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | '\t' 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | '\r' 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | '\n' 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver )+ 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver {$channel=HIDDEN} 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "'enum' is a keyword" do 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = TestHoist::Lexer.new 'enum' 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = TestHoist::Parser.new lexer 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser.enable_enum = true 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser.stat.should == 'keyword' 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "'enum' is an ID" do 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = TestHoist::Lexer.new 'enum' 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = TestHoist::Parser.new lexer 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser.enable_enum = false 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser.stat.should == 'ID' 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestSyntacticPredicate < ANTLR3::Test::Functional 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar SyntacticPredicate; 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language = Ruby; 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @parser::members { 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def emit_error_message(msg) 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # do nothing 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def report_error(error) 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver raise error 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a: ((s+ P)=> s+ b)? E; 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b: P 'foo'; 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver s: S; 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver S: ' '; 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver P: '+'; 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver E: '>'; 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "rule with syntactic predicate" do 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = SyntacticPredicate::Lexer.new( ' +foo>' ) 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = SyntacticPredicate::Parser.new lexer 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver events = parser.a 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend 103