66 lines
1.6 KiB
Plaintext
66 lines
1.6 KiB
Plaintext
/** Convert the simple input to be java code; wrap in a class,
|
|
* convert method with "public void", add decls. This shows how to insert
|
|
* extra text into a stream of tokens and how to replace a token
|
|
* with some text. Calling toString() on the TokenRewriteStream
|
|
* in Main will print out the original input stream.
|
|
*
|
|
* Note that you can do the instructions in any order as the
|
|
* rewrite instructions just get queued up and executed upon toString().
|
|
*/
|
|
grammar T;
|
|
options { language = Perl5; }
|
|
|
|
program
|
|
: method+
|
|
{
|
|
$input->insert_before($input->LT(1), "public class Wrapper {\n");
|
|
// note the reference to the last token matched for method:
|
|
$input->insert_after($method.stop, "\n}\n");
|
|
}
|
|
;
|
|
|
|
method
|
|
: m='method' ID '(' ')' body
|
|
{ $input->replace($m, "public void"); }
|
|
;
|
|
|
|
body
|
|
scope {
|
|
// decls is on body's local variable stack but is visible to
|
|
// any rule that body calls such as stat. From other rules
|
|
// it is referenced as $body::decls
|
|
// From within rule body, you can use $decls shorthand
|
|
decls;
|
|
}
|
|
@init {
|
|
$body::decls = [];
|
|
}
|
|
: lcurly='{' stat* '}'
|
|
{
|
|
// dump declarations for all identifiers seen in statement list
|
|
foreach my $id ($body::decls) {
|
|
$tokens->insert_after($lcurly, "\nint $id;");
|
|
}
|
|
}
|
|
;
|
|
|
|
stat: ID '=' expr ';' { $body::decls->add($ID.text); } // track left-hand-sides
|
|
;
|
|
|
|
expr: mul ('+' mul)*
|
|
;
|
|
|
|
mul : atom ('*' atom)*
|
|
;
|
|
|
|
atom: ID
|
|
| INT
|
|
;
|
|
|
|
ID : ('a'..'z'|'A'..'Z')+ ;
|
|
|
|
INT : ('0'..'9')+ ;
|
|
|
|
WS : (' '|'\t'|'\n')+ { $channel = $self->HIDDEN; }
|
|
;
|