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.
100 lines
1.9 KiB
100 lines
1.9 KiB
#!/usr/bin/ruby
|
|
# encoding: utf-8
|
|
|
|
require 'antlr3/test/functional'
|
|
|
|
class TestRewritingWhileParsing < ANTLR3::Test::Functional
|
|
|
|
inline_grammar( <<-'END' )
|
|
grammar TokenRewrites;
|
|
options { language = Ruby; }
|
|
|
|
program
|
|
@after {
|
|
@input.insert_before($start,"public class Wrapper {\n")
|
|
@input.insert_after($stop, "\n}\n")
|
|
}
|
|
: method+
|
|
;
|
|
|
|
method
|
|
: m='method' ID '(' ')' body
|
|
{@input.replace($m, "public void");}
|
|
;
|
|
|
|
body
|
|
scope {
|
|
decls
|
|
}
|
|
@init {
|
|
$body::decls = []
|
|
}
|
|
: lcurly='{' stat* '}'
|
|
{
|
|
$body::decls.uniq!
|
|
for it in $body::decls
|
|
@input.insert_after($lcurly, "\nint "+it+";")
|
|
end
|
|
}
|
|
;
|
|
|
|
stat: ID '=' expr ';' {$body::decls << $ID.text.to_s}
|
|
;
|
|
|
|
expr: mul ('+' mul)*
|
|
;
|
|
|
|
mul : atom ('*' atom)*
|
|
;
|
|
|
|
atom: ID
|
|
| INT
|
|
;
|
|
|
|
ID : ('a'..'z'|'A'..'Z')+ ;
|
|
|
|
INT : ('0'..'9')+ ;
|
|
|
|
WS : (' '|'\t'|'\n')+ {$channel=HIDDEN;}
|
|
;
|
|
END
|
|
|
|
example 'using a TokenRewriteStream to rewrite input text while parsing' do
|
|
input = <<-END.fixed_indent( 0 )
|
|
method foo() {
|
|
i = 3;
|
|
k = i;
|
|
i = k*4;
|
|
}
|
|
|
|
method bar() {
|
|
j = i*2;
|
|
}
|
|
END
|
|
expected_output = <<-END.fixed_indent( 0 ).strip!
|
|
public class Wrapper {
|
|
public void foo() {
|
|
int k;
|
|
int i;
|
|
i = 3;
|
|
k = i;
|
|
i = k*4;
|
|
}
|
|
|
|
public void bar() {
|
|
int j;
|
|
j = i*2;
|
|
}
|
|
}
|
|
END
|
|
|
|
lexer = TokenRewrites::Lexer.new( input )
|
|
tokens = ANTLR3::TokenRewriteStream.new( lexer )
|
|
parser = TokenRewrites::Parser.new( tokens )
|
|
parser.program
|
|
|
|
tokens.render.strip.should == expected_output
|
|
end
|
|
|
|
end
|