13447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein/* 23447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein [The "BSD license"] 33447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein Copyright (c) 2005-2009 Terence Parr 43447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein All rights reserved. 53447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 63447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein Redistribution and use in source and binary forms, with or without 73447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein modification, are permitted provided that the following conditions 83447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein are met: 93447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 1. Redistributions of source code must retain the above copyright 103447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein notice, this list of conditions and the following disclaimer. 113447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 2. Redistributions in binary form must reproduce the above copyright 123447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein notice, this list of conditions and the following disclaimer in the 133447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein documentation and/or other materials provided with the distribution. 143447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 3. The name of the author may not be used to endorse or promote products 153447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein derived from this software without specific prior written permission. 163447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 173447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 183447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 193447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 203447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 213447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 223447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 233447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 243447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 253447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 263447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 273447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein */ 283447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 293447a5916aa62f44de24cc441fc9987116ddff52Andrew Sappersteinpackage org.antlr.runtime; 303447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 313447a5916aa62f44de24cc441fc9987116ddff52Andrew Sappersteinimport java.io.IOException; 323447a5916aa62f44de24cc441fc9987116ddff52Andrew Sappersteinimport java.io.FileInputStream; 333447a5916aa62f44de24cc441fc9987116ddff52Andrew Sappersteinimport java.io.BufferedInputStream; 343447a5916aa62f44de24cc441fc9987116ddff52Andrew Sappersteinimport java.io.DataInputStream; 353447a5916aa62f44de24cc441fc9987116ddff52Andrew Sappersteinimport java.util.List; 363447a5916aa62f44de24cc441fc9987116ddff52Andrew Sappersteinimport java.util.ArrayList; 373447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 383447a5916aa62f44de24cc441fc9987116ddff52Andrew Sappersteinpublic class SerializedGrammar { 393447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein public static final String COOKIE = "$ANTLR"; 403447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein public static final int FORMAT_VERSION = 1; 413447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein //public static org.antlr.tool.Grammar gr; // TESTING ONLY; remove later 423447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 433447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein public String name; 443447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein public char type; // in {l, p, t, c} 453447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein public List rules; 463447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 473447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein class Rule { 483447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein String name; 493447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein Block block; 503447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein public Rule(String name, Block block) { 513447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein this.name = name; 523447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein this.block = block; 533447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein } 543447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein public String toString() { 553447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein return name+":"+block; 563447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein } 573447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein } 583447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 593447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein class Block { 603447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein List[] alts; 613447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein public Block(List[] alts) { 623447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein this.alts = alts; 633447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein } 643447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein public String toString() { 653447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein StringBuffer buf = new StringBuffer(); 663447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein buf.append("("); 673447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein for (int i = 0; i < alts.length; i++) { 683447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein List alt = alts[i]; 693447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein if ( i>0 ) buf.append("|"); 703447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein buf.append(alt.toString()); 713447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein } 723447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein buf.append(")"); 733447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein return buf.toString(); 743447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein } 753447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein } 763447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 773447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein class TokenRef { 783447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein int ttype; 793447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein public TokenRef(int ttype) { this.ttype = ttype; } 803447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein public String toString() { return String.valueOf(ttype); } 813447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein } 823447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 833447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein class RuleRef { 843447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein int ruleIndex; 853447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein public RuleRef(int ruleIndex) { this.ruleIndex = ruleIndex; } 863447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein public String toString() { return String.valueOf(ruleIndex); } 873447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein } 883447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 893447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein public SerializedGrammar(String filename) throws IOException { 903447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein System.out.println("loading "+filename); 913447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein FileInputStream fis = new FileInputStream(filename); 923447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein BufferedInputStream bos = new BufferedInputStream(fis); 933447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein DataInputStream in = new DataInputStream(bos); 943447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein readFile(in); 953447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein in.close(); 963447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein } 973447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 983447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein protected void readFile(DataInputStream in) throws IOException { 993447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein String cookie = readString(in); // get $ANTLR 1003447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein if ( !cookie.equals(COOKIE) ) throw new IOException("not a serialized grammar file"); 1013447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein int version = in.readByte(); 1023447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein char grammarType = (char)in.readByte(); 1033447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein this.type = grammarType; 1043447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein String grammarName = readString(in); 1053447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein this.name = grammarName; 1063447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein System.out.println(grammarType+" grammar "+grammarName); 1073447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein int numRules = in.readShort(); 1083447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein System.out.println("num rules = "+numRules); 1093447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein rules = readRules(in, numRules); 1103447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein } 1113447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 1123447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein protected List readRules(DataInputStream in, int numRules) throws IOException { 1133447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein List rules = new ArrayList(); 1143447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein for (int i=0; i<numRules; i++) { 1153447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein Rule r = readRule(in); 1163447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein rules.add(r); 1173447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein } 1183447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein return rules; 1193447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein } 1203447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 1213447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein protected Rule readRule(DataInputStream in) throws IOException { 1223447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein byte R = in.readByte(); 1233447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein if ( R!='R' ) throw new IOException("missing R on start of rule"); 1243447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein String name = readString(in); 1253447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein System.out.println("rule: "+name); 1263447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein byte B = in.readByte(); 1273447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein Block b = readBlock(in); 1283447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein byte period = in.readByte(); 1293447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein if ( period!='.' ) throw new IOException("missing . on end of rule"); 1303447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein return new Rule(name, b); 1313447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein } 1323447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 1333447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein protected Block readBlock(DataInputStream in) throws IOException { 1343447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein int nalts = in.readShort(); 1353447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein List[] alts = new List[nalts]; 1363447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein //System.out.println("enter block n="+nalts); 1373447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein for (int i=0; i<nalts; i++) { 1383447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein List alt = readAlt(in); 1393447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein alts[i] = alt; 1403447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein } 1413447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein //System.out.println("exit block"); 1423447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein return new Block(alts); 1433447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein } 1443447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 1453447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein protected List readAlt(DataInputStream in) throws IOException { 1463447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein List alt = new ArrayList(); 1473447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein byte A = in.readByte(); 1483447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein if ( A!='A' ) throw new IOException("missing A on start of alt"); 1493447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein byte cmd = in.readByte(); 1503447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein while ( cmd!=';' ) { 1513447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein switch (cmd) { 1523447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein case 't' : 1533447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein int ttype = in.readShort(); 1543447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein alt.add(new TokenRef(ttype)); 1553447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein //System.out.println("read token "+gr.getTokenDisplayName(ttype)); 1563447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein break; 1573447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein case 'r' : 1583447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein int ruleIndex = in.readShort(); 1593447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein alt.add(new RuleRef(ruleIndex)); 1603447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein //System.out.println("read rule "+gr.getRuleName(ruleIndex)); 1613447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein break; 1623447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein case '.' : // wildcard 1633447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein break; 1643447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein case '-' : // range 1653447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein int from = in.readChar(); 1663447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein int to = in.readChar(); 1673447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein break; 1683447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein case '~' : // not 1693447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein int notThisTokenType = in.readShort(); 1703447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein break; 1713447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein case 'B' : // nested block 1723447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein Block b = readBlock(in); 1733447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein alt.add(b); 1743447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein break; 1753447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein } 1763447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein cmd = in.readByte(); 1773447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein } 1783447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein //System.out.println("exit alt"); 1793447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein return alt; 1803447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein } 1813447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 1823447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein protected String readString(DataInputStream in) throws IOException { 1833447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein byte c = in.readByte(); 1843447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein StringBuffer buf = new StringBuffer(); 1853447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein while ( c!=';' ) { 1863447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein buf.append((char)c); 1873447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein c = in.readByte(); 1883447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein } 1893447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein return buf.toString(); 1903447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein } 1913447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein 1923447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein public String toString() { 1933447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein StringBuffer buf = new StringBuffer(); 1943447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein buf.append(type+" grammar "+name); 1953447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein buf.append(rules); 1963447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein return buf.toString(); 1973447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein } 1983447a5916aa62f44de24cc441fc9987116ddff52Andrew Sapperstein} 199