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 java.io.*; 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport java.util.ArrayList; 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport java.util.List; 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Load a grammar file and scan it just until we learn a few items 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * of interest. Currently: name, type, imports, tokenVocab, language option. 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * GrammarScanner (at bottom of this class) converts grammar to stuff like: 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * grammar Java ; options { backtrack true memoize true } 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * import JavaDecl JavaAnnotations JavaExpr ; 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * ... : ... 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * First ':' or '@' indicates we can stop looking for imports/options. 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Then we just grab interesting grammar properties. 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic class GrammarSpelunker { 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected String grammarFileName; 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected String token; 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected Scanner scanner; 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // grammar info / properties 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected String grammarModifier; 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected String grammarName; 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected String tokenVocab; 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected String language = "Java"; // default 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected String inputDirectory; 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected List<String> importedGrammars; 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public GrammarSpelunker(String inputDirectory, String grammarFileName) { 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.inputDirectory = inputDirectory; 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.grammarFileName = grammarFileName; 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void consume() throws IOException { token = scanner.nextToken(); } 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected void match(String expecting) throws IOException { 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver //System.out.println("match "+expecting+"; is "+token); 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( token.equals(expecting) ) consume(); 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else throw new Error("Error parsing "+grammarFileName+": '"+token+ 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "' not expected '"+expecting+"'"); 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void parse() throws IOException { 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Reader r = new FileReader((inputDirectory != null ? inputDirectory + File.separator : "") + grammarFileName); 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver BufferedReader br = new BufferedReader(r); 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver try { 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver scanner = new Scanner(br); 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver consume(); 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammarHeader(); 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // scan until imports or options 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while ( token!=null && !token.equals("@") && !token.equals(":") && 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver !token.equals("import") && !token.equals("options") ) 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver consume(); 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( token.equals("options") ) options(); 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // scan until options or first rule 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while ( token!=null && !token.equals("@") && !token.equals(":") && 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver !token.equals("import") ) 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver consume(); 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( token.equals("import") ) imports(); 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // ignore rest of input; close up shop 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver finally { 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( br!=null ) br.close(); 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected void grammarHeader() throws IOException { 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( token==null ) return; 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( token.equals("tree") || token.equals("parser") || token.equals("lexer") ) { 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammarModifier=token; 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver consume(); 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver match("grammar"); 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver grammarName = token; 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver consume(); // move beyond name 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // looks like "options { backtrack true ; tokenVocab MyTokens ; }" 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected void options() throws IOException { 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver match("options"); 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver match("{"); 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while ( token!=null && !token.equals("}") ) { 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String name = token; 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver consume(); 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String value = token; 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver consume(); 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver match(";"); 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( name.equals("tokenVocab") ) tokenVocab = value; 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( name.equals("language") ) language = value; 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver match("}"); 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // looks like "import JavaDecl JavaAnnotations JavaExpr ;" 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected void imports() throws IOException { 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver match("import"); 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver importedGrammars = new ArrayList<String>(); 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while ( token!=null && !token.equals(";") ) { 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver importedGrammars.add(token); 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver consume(); 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver match(";"); 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( importedGrammars.size()==0 ) importedGrammars = null; 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public String getGrammarModifier() { return grammarModifier; } 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public String getGrammarName() { return grammarName; } 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public String getTokenVocab() { return tokenVocab; } 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public String getLanguage() { return language; } 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public List<String> getImportedGrammars() { return importedGrammars; } 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Strip comments and then return stream of words and 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * tokens {';', ':', '{', '}'} 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static class Scanner { 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static final int EOF = -1; 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Reader input; 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int c; 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public Scanner(Reader input) throws IOException { 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.input = input; 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver consume(); 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver boolean isDIGIT() { return c>='0'&&c<='9'; } 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver boolean isID_START() { return c>='a'&&c<='z' || c>='A'&&c<='Z'; } 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver boolean isID_LETTER() { return isID_START() || c>='0'&&c<='9' || c=='_'; } 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void consume() throws IOException { c = input.read(); } 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public String nextToken() throws IOException { 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while ( c!=EOF ) { 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver //System.out.println("check "+(char)c); 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver switch ( c ) { 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case ';' : consume(); return ";"; 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case '{' : consume(); return "{"; 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case '}' : consume(); return "}"; 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case ':' : consume(); return ":"; 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case '@' : consume(); return "@"; 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case '/' : COMMENT(); break; 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case '\'': return STRING(); 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver default: 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( isID_START() ) return ID(); 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if ( isDIGIT() ) return INT(); 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver consume(); // ignore anything else 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return null; 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** NAME : LETTER+ ; // NAME is sequence of >=1 letter */ 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String ID() throws IOException { 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver StringBuffer buf = new StringBuffer(); 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while ( c!=EOF && isID_LETTER() ) { buf.append((char)c); consume(); } 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return buf.toString(); 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String INT() throws IOException { 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver StringBuffer buf = new StringBuffer(); 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while ( c!=EOF && isDIGIT() ) { buf.append((char)c); consume(); } 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return buf.toString(); 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String STRING() throws IOException { 204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver StringBuffer buf = new StringBuffer(); 205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver consume(); 206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while ( c!=EOF && c!='\'' ) { 207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( c=='\\' ) { 208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buf.append((char)c); 209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver consume(); 210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buf.append((char)c); 212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver consume(); 213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver consume(); // scan past ' 215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return buf.toString(); 216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void COMMENT() throws IOException { 219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( c=='/' ) { 220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver consume(); 221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( c=='*' ) { 222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver consume(); 223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver scarf: 224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while ( true ) { 225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( c=='*' ) { 226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver consume(); 227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( c=='/' ) { consume(); break scarf; } 228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else { 230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while ( c!=EOF && c!='*' ) consume(); 231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if ( c=='/' ) { 235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while ( c!=EOF && c!='\n' ) consume(); 236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Tester; Give grammar filename as arg */ 242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static void main(String[] args) throws IOException { 243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver GrammarSpelunker g = new GrammarSpelunker(".", args[0]); 244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver g.parse(); 245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.out.println(g.grammarModifier+" grammar "+g.grammarName); 246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.out.println("language="+g.language); 247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.out.println("tokenVocab="+g.tokenVocab); 248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.out.println("imports="+g.importedGrammars); 249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 251