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
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
|