I\'m writing a converter between some dialects of the same programming language. I\'ve found a grammar on the net - it\'s complex and handles all the cases. Now I\'m trying
The easiest way is to create a rewriter. Set grammar to rewrite, use templates and create a template in-place. Then use TokenRewriteStream and it's ToString() method.
grammar Test;
options {
language = CSharp2;
output = template;
rewrite = true;
}
program
: statement_list
;
//...
statement
: expression_statement
// ...
;
expression_statement
: function_call
// ...
;
function_call
: ID '(' { /* build the object, assign name */
Function function = new Function();
//...
}
(
arg1 = expression { /* add first parameter */ }
( ',' arg2 = expression { /* add the rest of parameters */ }
)*
)?
')' -> { new StringTemplate(Tools.Convert(function)) }
;
And the driver:
string input = "....";
var stream = new ANTLRStringStream(input);
var lexer = new TestLexer(stream);
// need to use TokenRewriteStream
var tokenStream = new TokenRewriteStream(lexer);
var parser = new TestParser(tokenStream);
parser.program();
// original text
Console.WriteLine(tokenStream.ToOriginalString());
// rewritten text
Console.WriteLine(tokenStream.ToString());