diff options
Diffstat (limited to 'runtime/Ruby/test/functional/token-rewrite/via-parser.rb')
-rw-r--r-- | runtime/Ruby/test/functional/token-rewrite/via-parser.rb | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/runtime/Ruby/test/functional/token-rewrite/via-parser.rb b/runtime/Ruby/test/functional/token-rewrite/via-parser.rb new file mode 100644 index 0000000..82d0758 --- /dev/null +++ b/runtime/Ruby/test/functional/token-rewrite/via-parser.rb @@ -0,0 +1,99 @@ +#!/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 |