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 Gruverpackage org.antlr.tool; 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.Tool; 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.runtime.*; 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.runtime.tree.ParseTree; 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport java.io.BufferedReader; 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport java.io.FileReader; 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport java.util.HashSet; 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport java.util.List; 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport java.util.Set; 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport java.util.StringTokenizer; 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Interpret any ANTLR grammar: 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * java Interp file.g tokens-to-ignore start-rule input-file 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * java Interp C.g 'WS COMMENT' program t.c 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * where the WS and COMMENT are the names of tokens you want to have 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the parser ignore. 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic class Interp { 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static class FilteringTokenStream extends CommonTokenStream { 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public FilteringTokenStream(TokenSource src) { super(src); } 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Set<Integer> hide = new HashSet<Integer>(); 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected void sync(int i) { 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver super.sync(i); 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( hide.contains(get(i).getType()) ) get(i).setChannel(Token.HIDDEN_CHANNEL); 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void setTokenTypeChannel(int ttype, int channel) { 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver hide.add(ttype); 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // pass me a java file to parse 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static void main(String[] args) throws Exception { 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( args.length!=4 ) { 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println("java Interp file.g tokens-to-ignore start-rule input-file"); 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return; 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammarFileName = args[0]; 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String ignoreTokens = args[1]; 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String startRule = args[2]; 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String inputFileName = args[3]; 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // TODO: using wrong constructor now 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Tool tool = new Tool(); 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver CompositeGrammar composite = new CompositeGrammar(); 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Grammar parser = new Grammar(tool, grammarFileName, composite); 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver composite.setDelegationRoot(parser); 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FileReader fr = new FileReader(grammarFileName); 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver BufferedReader br = new BufferedReader(fr); 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser.parseAndBuildAST(br); 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver br.close(); 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser.composite.assignTokenTypes(); 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser.composite.defineGrammarSymbols(); 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser.composite.createNFAs(); 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver List leftRecursiveRules = parser.checkAllRulesForLeftRecursion(); 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( leftRecursiveRules.size()>0 ) { 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return; 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( parser.getRule(startRule)==null ) { 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.out.println("undefined start rule "+startRule); 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return; 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String lexerGrammarText = parser.getLexerGrammar(); 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Grammar lexer = new Grammar(tool); 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer.importTokenVocabulary(parser); 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer.fileName = grammarFileName; 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer.setTool(tool); 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( lexerGrammarText!=null ) { 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer.setGrammarContent(lexerGrammarText); 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else { 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println("no lexer grammar found in "+grammarFileName); 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer.composite.createNFAs(); 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver CharStream input = 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver new ANTLRFileStream(inputFileName); 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Interpreter lexEngine = new Interpreter(lexer, input); 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FilteringTokenStream tokens = new FilteringTokenStream(lexEngine); 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver StringTokenizer tk = new StringTokenizer(ignoreTokens, " "); 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while ( tk.hasMoreTokens() ) { 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String tokenName = tk.nextToken(); 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens.setTokenTypeChannel(lexer.getTokenType(tokenName), 99); 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( parser.getRule(startRule)==null ) { 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println("Rule "+startRule+" does not exist in "+grammarFileName); 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return; 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Interpreter parseEngine = new Interpreter(parser, tokens); 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ParseTree t = parseEngine.parse(startRule); 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.out.println(t.toStringTree()); 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 130