xref: /aosp_15_r20/external/antlr/runtime/Perl5/examples/tweak/T.g (revision 16467b971bd3e2009fad32dd79016f2c7e421deb)
1*16467b97STreehugger Robot/** Convert the simple input to be java code; wrap in a class,
2*16467b97STreehugger Robot *  convert method with "public void", add decls.  This shows how to insert
3*16467b97STreehugger Robot *  extra text into a stream of tokens and how to replace a token
4*16467b97STreehugger Robot *  with some text.  Calling toString() on the TokenRewriteStream
5*16467b97STreehugger Robot *  in Main will print out the original input stream.
6*16467b97STreehugger Robot *
7*16467b97STreehugger Robot *  Note that you can do the instructions in any order as the
8*16467b97STreehugger Robot *  rewrite instructions just get queued up and executed upon toString().
9*16467b97STreehugger Robot */
10*16467b97STreehugger Robotgrammar T;
11*16467b97STreehugger Robotoptions { language = Perl5; }
12*16467b97STreehugger Robot
13*16467b97STreehugger Robotprogram
14*16467b97STreehugger Robot    :   method+
15*16467b97STreehugger Robot        {
16*16467b97STreehugger Robot        $input->insert_before($input->LT(1), "public class Wrapper {\n");
17*16467b97STreehugger Robot        // note the reference to the last token matched for method:
18*16467b97STreehugger Robot        $input->insert_after($method.stop, "\n}\n");
19*16467b97STreehugger Robot        }
20*16467b97STreehugger Robot    ;
21*16467b97STreehugger Robot
22*16467b97STreehugger Robotmethod
23*16467b97STreehugger Robot    :   m='method' ID '(' ')' body
24*16467b97STreehugger Robot        { $input->replace($m, "public void"); }
25*16467b97STreehugger Robot    ;
26*16467b97STreehugger Robot
27*16467b97STreehugger Robotbody
28*16467b97STreehugger Robotscope {
29*16467b97STreehugger Robot    // decls is on body's local variable stack but is visible to
30*16467b97STreehugger Robot    // any rule that body calls such as stat.  From other rules
31*16467b97STreehugger Robot    // it is referenced as $body::decls
32*16467b97STreehugger Robot    // From within rule body, you can use $decls shorthand
33*16467b97STreehugger Robot    decls;
34*16467b97STreehugger Robot}
35*16467b97STreehugger Robot@init {
36*16467b97STreehugger Robot    $body::decls = [];
37*16467b97STreehugger Robot}
38*16467b97STreehugger Robot    :   lcurly='{' stat* '}'
39*16467b97STreehugger Robot        {
40*16467b97STreehugger Robot        // dump declarations for all identifiers seen in statement list
41*16467b97STreehugger Robot        foreach my $id ($body::decls) {
42*16467b97STreehugger Robot            $tokens->insert_after($lcurly, "\nint $id;");
43*16467b97STreehugger Robot        }
44*16467b97STreehugger Robot        }
45*16467b97STreehugger Robot    ;
46*16467b97STreehugger Robot
47*16467b97STreehugger Robotstat:   ID '=' expr ';' { $body::decls->add($ID.text); } // track left-hand-sides
48*16467b97STreehugger Robot    ;
49*16467b97STreehugger Robot
50*16467b97STreehugger Robotexpr:   mul ('+' mul)*
51*16467b97STreehugger Robot    ;
52*16467b97STreehugger Robot
53*16467b97STreehugger Robotmul :   atom ('*' atom)*
54*16467b97STreehugger Robot    ;
55*16467b97STreehugger Robot
56*16467b97STreehugger Robotatom:   ID
57*16467b97STreehugger Robot    |   INT
58*16467b97STreehugger Robot    ;
59*16467b97STreehugger Robot
60*16467b97STreehugger RobotID  :   ('a'..'z'|'A'..'Z')+ ;
61*16467b97STreehugger Robot
62*16467b97STreehugger RobotINT :   ('0'..'9')+ ;
63*16467b97STreehugger Robot
64*16467b97STreehugger RobotWS  :   (' '|'\t'|'\n')+ { $channel = $self->HIDDEN; }
65*16467b97STreehugger Robot    ;
66