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