#!/usr/bin/ruby # encoding: utf-8 require 'antlr3/test/functional' class TestEmptyAlternative < ANTLR3::Test::Functional inline_grammar( <<-'END' ) grammar EmptyAlt; options { language = Ruby; } r : NAME ( WS+ NAME | ) EOF ; NAME: ('a'..'z') ('a'..'z' | '0'..'9')+; NUMBER: ('0'..'9')+; WS: ' '+; END example "rule with empty alternative" do lexer = EmptyAlt::Lexer.new( 'foo' ) parser = EmptyAlt::Parser.new lexer events = parser.r end end class TestSubrulePrediction < ANTLR3::Test::Functional inline_grammar( <<-'END' ) grammar Subrule; options { language = Ruby; } @parser::members { def emit_error_message(msg) # do nothing end def report_error(error) raise error end } a: 'BEGIN' b WS+ 'END'; b: ( WS+ 'A' )+; WS: ' '; END example "make correct predictions involving subrules" do lexer = Subrule::Lexer.new( 'BEGIN A END' ) parser = Subrule::Parser.new lexer events = parser.a end end class TestSpecialStates < ANTLR3::Test::Functional inline_grammar( <<-'END' ) grammar SpecialStates; options { language = Ruby; } @init { @cond = true } @members { attr_accessor :cond def recover(re) raise re end } r : ( { @cond }? NAME | {!@cond }? NAME WS+ NAME ) ( WS+ NAME )? EOF ; NAME: ('a'..'z') ('a'..'z' | '0'..'9')+; NUMBER: ('0'..'9')+; WS: ' '+; END example "parsing 'foo'" do lexer = SpecialStates::Lexer.new 'foo' parser = SpecialStates::Parser.new lexer parser.r end example "parsing 'foo name1'" do lexer = SpecialStates::Lexer.new 'foo name1' parser = SpecialStates::Parser.new lexer parser.r end example "parsing 'bar name1'" do lexer = SpecialStates::Lexer.new 'bar name1' parser = SpecialStates::Parser.new lexer parser.cond = false parser.r end example "parsing 'bar name1 name2'" do lexer = SpecialStates::Lexer.new 'bar name1 name2' parser = SpecialStates::Parser.new lexer parser.cond = false parser.r end end class TestDFABug < ANTLR3::Test::Functional inline_grammar( <<-'END' ) grammar DFABug; options { language = Ruby; output = AST; } // this rule used to generate an infinite loop in DFA.predict r options { backtrack=true; } : (modifier+ INT)=> modifier+ expression | modifier+ statement ; expression : INT '+' INT ; statement : 'fooze' | 'fooze2' ; modifier : 'public' | 'private' ; ID : 'a'..'z' + ; INT : '0'..'9' +; WS: (' ' | '\n' | '\t')+ {$channel = HIDDEN;}; END example "testing for DFA-based decision bug" do lexer = DFABug::Lexer.new 'public fooze' parser = DFABug::Parser.new lexer parser.r end end