1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/*
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * [The "BSD license"]
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  Copyright (c) 2010 Terence Parr
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  All rights reserved.
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  Redistribution and use in source and binary forms, with or without
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  modification, are permitted provided that the following conditions
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  are met:
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  1. Redistributions of source code must retain the above copyright
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *      notice, this list of conditions and the following disclaimer.
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  2. Redistributions in binary form must reproduce the above copyright
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *      notice, this list of conditions and the following disclaimer in the
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *      documentation and/or other materials provided with the distribution.
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  3. The name of the author may not be used to endorse or promote products
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *      derived from this software without specific prior written permission.
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpackage org.antlr.tool;
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.grammar.v3.ANTLRv3Lexer;
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.grammar.v3.ANTLRv3Parser;
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.runtime.*;
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.runtime.tree.CommonTree;
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.runtime.tree.TreeAdaptor;
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.runtime.tree.TreeWizard;
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport java.util.List;
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A basic action stripper. */
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic class Strip {
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    protected String filename;
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    protected TokenRewriteStream tokens;
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    protected boolean tree_option = false;
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    protected String args[];
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    public static void main(String args[]) throws Exception {
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Strip s = new Strip(args);
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        s.parseAndRewrite();
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        System.out.println(s.tokens);
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    public Strip(String[] args) { this.args = args; }
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    public TokenRewriteStream getTokenStream() { return tokens; }
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    public void parseAndRewrite() throws Exception {
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        processArgs(args);
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        CharStream input = null;
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if ( filename!=null ) input = new ANTLRFileStream(filename);
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        else input = new ANTLRInputStream(System.in);
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // BUILD AST
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ANTLRv3Lexer lex = new ANTLRv3Lexer(input);
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokens = new TokenRewriteStream(lex);
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ANTLRv3Parser g = new ANTLRv3Parser(tokens);
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ANTLRv3Parser.grammarDef_return r = g.grammarDef();
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        CommonTree t = (CommonTree)r.getTree();
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if (tree_option) System.out.println(t.toStringTree());
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        rewrite(g.getTreeAdaptor(),t,g.getTokenNames());
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    public void rewrite(TreeAdaptor adaptor, CommonTree t, String[] tokenNames) throws Exception {
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        TreeWizard wiz = new TreeWizard(adaptor, tokenNames);
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // ACTIONS STUFF
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz.visit(t, ANTLRv3Parser.ACTION,
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver           new TreeWizard.Visitor() {
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver               public void visit(Object t) { ACTION(tokens, (CommonTree)t); }
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver           });
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz.visit(t, ANTLRv3Parser.AT,  // ^('@' id ACTION) rule actions
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            new TreeWizard.Visitor() {
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              public void visit(Object t) {
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                  CommonTree a = (CommonTree)t;
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                  CommonTree action = null;
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                  if ( a.getChildCount()==2 ) action = (CommonTree)a.getChild(1);
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                  else if ( a.getChildCount()==3 ) action = (CommonTree)a.getChild(2);
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                  if ( action.getType()==ANTLRv3Parser.ACTION ) {
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                      tokens.delete(a.getTokenStartIndex(),
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                    a.getTokenStopIndex());
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                      killTrailingNewline(tokens, action.getTokenStopIndex());
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                  }
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              }
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            });
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz.visit(t, ANTLRv3Parser.ARG, // wipe rule arguments
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                  new TreeWizard.Visitor() {
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              public void visit(Object t) {
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                  CommonTree a = (CommonTree)t;
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                  a = (CommonTree)a.getChild(0);
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                  tokens.delete(a.token.getTokenIndex());
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                  killTrailingNewline(tokens, a.token.getTokenIndex());
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              }
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            });
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz.visit(t, ANTLRv3Parser.RET, // wipe rule return declarations
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            new TreeWizard.Visitor() {
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                public void visit(Object t) {
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    CommonTree a = (CommonTree)t;
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    CommonTree ret = (CommonTree)a.getChild(0);
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    tokens.delete(a.token.getTokenIndex(),
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                  ret.token.getTokenIndex());
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            });
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz.visit(t, ANTLRv3Parser.SEMPRED, // comment out semantic predicates
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            new TreeWizard.Visitor() {
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                public void visit(Object t) {
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    CommonTree a = (CommonTree)t;
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    tokens.replace(a.token.getTokenIndex(), "/*"+a.getText()+"*/");
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            });
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz.visit(t, ANTLRv3Parser.GATED_SEMPRED, // comment out semantic predicates
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            new TreeWizard.Visitor() {
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                public void visit(Object t) {
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    CommonTree a = (CommonTree)t;
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    String text = tokens.toString(a.getTokenStartIndex(),
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                                  a.getTokenStopIndex());
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    tokens.replace(a.getTokenStartIndex(),
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                   a.getTokenStopIndex(),
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                   "/*"+text+"*/");
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            });
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz.visit(t, ANTLRv3Parser.SCOPE, // comment scope specs
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            new TreeWizard.Visitor() {
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                public void visit(Object t) {
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    CommonTree a = (CommonTree)t;
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    tokens.delete(a.getTokenStartIndex(),
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                  a.getTokenStopIndex());
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    killTrailingNewline(tokens, a.getTokenStopIndex());
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            });
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz.visit(t, ANTLRv3Parser.ARG_ACTION, // args r[x,y] -> ^(r [x,y])
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            new TreeWizard.Visitor() {
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                public void visit(Object t) {
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    CommonTree a = (CommonTree)t;
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    if ( a.getParent().getType()==ANTLRv3Parser.RULE_REF ) {
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        tokens.delete(a.getTokenStartIndex(),
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                      a.getTokenStopIndex());
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    }
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            });
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz.visit(t, ANTLRv3Parser.LABEL_ASSIGN, // ^('=' id ^(RULE_REF [arg])), ...
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            new TreeWizard.Visitor() {
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                public void visit(Object t) {
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    CommonTree a = (CommonTree)t;
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    if ( !a.hasAncestor(ANTLRv3Parser.OPTIONS) ) { // avoid options
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        CommonTree child = (CommonTree)a.getChild(0);
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        tokens.delete(a.token.getTokenIndex());     // kill "id="
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        tokens.delete(child.token.getTokenIndex());
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    }
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            });
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz.visit(t, ANTLRv3Parser.LIST_LABEL_ASSIGN, // ^('+=' id ^(RULE_REF [arg])), ...
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            new TreeWizard.Visitor() {
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              public void visit(Object t) {
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                  CommonTree a = (CommonTree)t;
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                  CommonTree child = (CommonTree)a.getChild(0);
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                  tokens.delete(a.token.getTokenIndex());     // kill "id+="
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                  tokens.delete(child.token.getTokenIndex());
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              }
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            });
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // AST STUFF
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz.visit(t, ANTLRv3Parser.REWRITE,
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            new TreeWizard.Visitor() {
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              public void visit(Object t) {
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                  CommonTree a = (CommonTree)t;
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                  CommonTree child = (CommonTree)a.getChild(0);
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                  int stop = child.getTokenStopIndex();
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                  if ( child.getType()==ANTLRv3Parser.SEMPRED ) {
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                      CommonTree rew = (CommonTree)a.getChild(1);
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                      stop = rew.getTokenStopIndex();
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                  }
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                  tokens.delete(a.token.getTokenIndex(), stop);
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                  killTrailingNewline(tokens, stop);
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              }
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            });
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz.visit(t, ANTLRv3Parser.ROOT,
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver           new TreeWizard.Visitor() {
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver               public void visit(Object t) {
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                   tokens.delete(((CommonTree)t).token.getTokenIndex());
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver               }
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver           });
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz.visit(t, ANTLRv3Parser.BANG,
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver           new TreeWizard.Visitor() {
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver               public void visit(Object t) {
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                   tokens.delete(((CommonTree)t).token.getTokenIndex());
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver               }
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver           });
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    public static void ACTION(TokenRewriteStream tokens, CommonTree t) {
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        CommonTree parent = (CommonTree)t.getParent();
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        int ptype = parent.getType();
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if ( ptype==ANTLRv3Parser.SCOPE || // we have special rules for these
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver             ptype==ANTLRv3Parser.AT )
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return;
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        //System.out.println("ACTION: "+t.getText());
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        CommonTree root = (CommonTree)t.getAncestor(ANTLRv3Parser.RULE);
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if ( root!=null ) {
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            CommonTree rule = (CommonTree)root.getChild(0);
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            //System.out.println("rule: "+rule);
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if ( !Character.isUpperCase(rule.getText().charAt(0)) ) {
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                tokens.delete(t.getTokenStartIndex(),t.getTokenStopIndex());
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                killTrailingNewline(tokens, t.token.getTokenIndex());
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    private static void killTrailingNewline(TokenRewriteStream tokens, int index) {
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        List all = tokens.getTokens();
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Token tok = (Token)all.get(index);
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Token after = (Token)all.get(index+1);
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String ws = after.getText();
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if ( ws.startsWith("\n") ) {
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            //System.out.println("killing WS after action");
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if ( ws.length()>1 ) {
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                int space = ws.indexOf(' ');
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                int tab = ws.indexOf('\t');
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                if ( ws.startsWith("\n") &&
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                     space>=0 || tab>=0 )
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    return; // do nothing if \n + indent
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                // otherwise kill all \n
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ws = ws.replaceAll("\n", "");
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                tokens.replace(after.getTokenIndex(), ws);
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            else {
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                tokens.delete(after.getTokenIndex());
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    public void processArgs(String[] args) {
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		if ( args==null || args.length==0 ) {
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			help();
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			return;
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		for (int i = 0; i < args.length; i++) {
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			if (args[i].equals("-tree")) tree_option = true;
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			else {
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				if (args[i].charAt(0) != '-') {
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver					// Must be the grammar file
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    filename = args[i];
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				}
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			}
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    private static void help() {
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        System.err.println("usage: java org.antlr.tool.Strip [args] file.g");
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        System.err.println("  -tree      print out ANTLR grammar AST");
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
268