You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

103 lines
1.9 KiB

#!/usr/bin/ruby
# encoding: utf-8
require 'antlr3/test/functional'
class TestPredicateHoist < ANTLR3::Test::Functional
inline_grammar( <<-'END' )
grammar TestHoist;
options {
language = Ruby;
}
/* With this true, enum is seen as a keyword. False, it's an identifier */
@parser::init {
@enable_enum = false
}
@members {
attr_accessor :enable_enum
}
stat returns [enumIs]
: identifier {$enumIs = "ID"}
| enumAsKeyword {$enumIs = "keyword"}
;
identifier
: ID
| enumAsID
;
enumAsKeyword : {@enable_enum}? 'enum' ;
enumAsID : {!@enable_enum}? 'enum' ;
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
;
INT : ('0'..'9')+
;
WS : ( ' '
| '\t'
| '\r'
| '\n'
)+
{$channel=HIDDEN}
;
END
example "'enum' is a keyword" do
lexer = TestHoist::Lexer.new 'enum'
parser = TestHoist::Parser.new lexer
parser.enable_enum = true
parser.stat.should == 'keyword'
end
example "'enum' is an ID" do
lexer = TestHoist::Lexer.new 'enum'
parser = TestHoist::Parser.new lexer
parser.enable_enum = false
parser.stat.should == 'ID'
end
end
class TestSyntacticPredicate < ANTLR3::Test::Functional
inline_grammar( <<-'END' )
grammar SyntacticPredicate;
options {
language = Ruby;
}
@parser::members {
def emit_error_message(msg)
# do nothing
end
def report_error(error)
raise error
end
}
a: ((s+ P)=> s+ b)? E;
b: P 'foo';
s: S;
S: ' ';
P: '+';
E: '>';
END
example "rule with syntactic predicate" do
lexer = SyntacticPredicate::Lexer.new( ' +foo>' )
parser = SyntacticPredicate::Parser.new lexer
events = parser.a
end
end