1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#!/usr/bin/ruby 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# encoding: utf-8 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrequire 'antlr3/test/functional' 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestEmptyAlternative < ANTLR3::Test::Functional 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar EmptyAlt; 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language = Ruby; 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : NAME 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ( WS+ NAME 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver EOF 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver NAME: ('a'..'z') ('a'..'z' | '0'..'9')+; 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver NUMBER: ('0'..'9')+; 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS: ' '+; 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "rule with empty alternative" do 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = EmptyAlt::Lexer.new( 'foo' ) 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = EmptyAlt::Parser.new lexer 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver events = parser.r 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestSubrulePrediction < ANTLR3::Test::Functional 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar Subrule; 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language = Ruby; 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @parser::members { 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def emit_error_message(msg) 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # do nothing 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def report_error(error) 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver raise error 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a: 'BEGIN' b WS+ 'END'; 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver b: ( WS+ 'A' )+; 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS: ' '; 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "make correct predictions involving subrules" do 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = Subrule::Lexer.new( 'BEGIN A END' ) 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = Subrule::Parser.new lexer 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver events = parser.a 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestSpecialStates < ANTLR3::Test::Functional 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar SpecialStates; 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { language = Ruby; } 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @init { @cond = true } 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @members { 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver attr_accessor :cond 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def recover(re) 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver raise re 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : ( { @cond }? NAME 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | {!@cond }? NAME WS+ NAME 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ( WS+ NAME )? 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver EOF 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver NAME: ('a'..'z') ('a'..'z' | '0'..'9')+; 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver NUMBER: ('0'..'9')+; 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS: ' '+; 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "parsing 'foo'" do 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = SpecialStates::Lexer.new 'foo' 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = SpecialStates::Parser.new lexer 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser.r 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "parsing 'foo name1'" do 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = SpecialStates::Lexer.new 'foo name1' 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = SpecialStates::Parser.new lexer 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser.r 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "parsing 'bar name1'" do 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = SpecialStates::Lexer.new 'bar name1' 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = SpecialStates::Parser.new lexer 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser.cond = false 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser.r 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "parsing 'bar name1 name2'" do 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = SpecialStates::Lexer.new 'bar name1 name2' 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = SpecialStates::Parser.new lexer 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser.cond = false 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser.r 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestDFABug < ANTLR3::Test::Functional 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inline_grammar( <<-'END' ) 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammar DFABug; 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver language = Ruby; 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver output = AST; 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // this rule used to generate an infinite loop in DFA.predict 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver options { backtrack=true; } 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : (modifier+ INT)=> modifier+ expression 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | modifier+ statement 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver expression 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : INT '+' INT 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver statement 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : 'fooze' 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | 'fooze2' 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver modifier 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : 'public' 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver | 'private' 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ; 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID : 'a'..'z' + ; 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INT : '0'..'9' +; 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WS: (' ' | '\n' | '\t')+ {$channel = HIDDEN;}; 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver END 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver example "testing for DFA-based decision bug" do 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = DFABug::Lexer.new 'public fooze' 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = DFABug::Parser.new lexer 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser.r 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend 165