1#!/usr/bin/ruby 2# encoding: utf-8 3 4require 'antlr3/test/functional' 5 6class TestPredicateHoist < ANTLR3::Test::Functional 7 8 inline_grammar( <<-'END' ) 9 grammar TestHoist; 10 options { 11 language = Ruby; 12 } 13 14 /* With this true, enum is seen as a keyword. False, it's an identifier */ 15 @parser::init { 16 @enable_enum = false 17 } 18 @members { 19 attr_accessor :enable_enum 20 } 21 22 stat returns [enumIs] 23 : identifier {$enumIs = "ID"} 24 | enumAsKeyword {$enumIs = "keyword"} 25 ; 26 27 identifier 28 : ID 29 | enumAsID 30 ; 31 32 enumAsKeyword : {@enable_enum}? 'enum' ; 33 34 enumAsID : {!@enable_enum}? 'enum' ; 35 36 ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* 37 ; 38 39 INT : ('0'..'9')+ 40 ; 41 42 WS : ( ' ' 43 | '\t' 44 | '\r' 45 | '\n' 46 )+ 47 {$channel=HIDDEN} 48 ; 49 END 50 51 52 example "'enum' is a keyword" do 53 lexer = TestHoist::Lexer.new 'enum' 54 parser = TestHoist::Parser.new lexer 55 parser.enable_enum = true 56 parser.stat.should == 'keyword' 57 end 58 59 example "'enum' is an ID" do 60 lexer = TestHoist::Lexer.new 'enum' 61 parser = TestHoist::Parser.new lexer 62 parser.enable_enum = false 63 parser.stat.should == 'ID' 64 end 65 66end 67 68 69class TestSyntacticPredicate < ANTLR3::Test::Functional 70 71 inline_grammar( <<-'END' ) 72 grammar SyntacticPredicate; 73 options { 74 language = Ruby; 75 } 76 77 @parser::members { 78 def emit_error_message(msg) 79 # do nothing 80 end 81 def report_error(error) 82 raise error 83 end 84 } 85 86 a: ((s+ P)=> s+ b)? E; 87 b: P 'foo'; 88 89 s: S; 90 91 92 S: ' '; 93 P: '+'; 94 E: '>'; 95 END 96 97 example "rule with syntactic predicate" do 98 lexer = SyntacticPredicate::Lexer.new( ' +foo>' ) 99 parser = SyntacticPredicate::Parser.new lexer 100 events = parser.a 101 end 102end 103