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.codegen; 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.Tool; 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.stringtemplate.v4.ST; 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.tool.Grammar; 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport java.io.IOException; 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport java.util.ArrayList; 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic class CTarget extends Target { 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ArrayList strings = new ArrayList(); 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Override 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected void genRecognizerFile(Tool tool, 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver CodeGenerator generator, 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Grammar grammar, 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ST outputFileST) 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throws IOException { 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Before we write this, and cause it to generate its string, 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // we need to add all the string literals that we are going to match 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver outputFileST.add("literals", strings); 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String fileName = generator.getRecognizerFileName(grammar.name, grammar.type); 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver generator.write(outputFileST, fileName); 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Override 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected void genRecognizerHeaderFile(Tool tool, 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver CodeGenerator generator, 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Grammar grammar, 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ST headerFileST, 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String extName) 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throws IOException { 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Pick up the file name we are generating. This method will return a 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // a file suffixed with .c, so we must substring and add the extName 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // to it as we cannot assign into strings in Java. 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String fileName = generator.getRecognizerFileName(grammar.name, grammar.type); 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver fileName = fileName.substring(0, fileName.length() - 2) + extName; 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver generator.write(headerFileST, fileName); 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected ST chooseWhereCyclicDFAsGo(Tool tool, 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver CodeGenerator generator, 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Grammar grammar, 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ST recognizerST, 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ST cyclicDFAST) { 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return recognizerST; 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Is scope in @scope::name {action} valid for this kind of grammar? 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Targets like C++ may want to allow new scopes like headerfile or 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * some such. The action names themselves are not policed at the 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * moment so targets can add template actions w/o having to recompile 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * ANTLR. 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Override 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public boolean isValidActionScope(int grammarType, String scope) { 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver switch (grammarType) { 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case Grammar.LEXER: 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (scope.equals("lexer")) { 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return true; 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (scope.equals("header")) { 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return true; 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (scope.equals("includes")) { 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return true; 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (scope.equals("preincludes")) { 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return true; 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (scope.equals("overrides")) { 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return true; 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case Grammar.PARSER: 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (scope.equals("parser")) { 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return true; 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (scope.equals("header")) { 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return true; 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (scope.equals("includes")) { 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return true; 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (scope.equals("preincludes")) { 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return true; 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (scope.equals("overrides")) { 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return true; 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case Grammar.COMBINED: 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (scope.equals("parser")) { 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return true; 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (scope.equals("lexer")) { 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return true; 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (scope.equals("header")) { 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return true; 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (scope.equals("includes")) { 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return true; 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (scope.equals("preincludes")) { 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return true; 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (scope.equals("overrides")) { 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return true; 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case Grammar.TREE_PARSER: 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (scope.equals("treeparser")) { 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return true; 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (scope.equals("header")) { 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return true; 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (scope.equals("includes")) { 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return true; 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (scope.equals("preincludes")) { 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return true; 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (scope.equals("overrides")) { 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return true; 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return false; 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Override 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public String getTargetCharLiteralFromANTLRCharLiteral( 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver CodeGenerator generator, 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String literal) { 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (literal.startsWith("'\\u")) { 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver literal = "0x" + literal.substring(3, 7); 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } else { 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int c = literal.charAt(1); 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (c < 32 || c > 127) { 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver literal = "0x" + Integer.toHexString(c); 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return literal; 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Convert from an ANTLR string literal found in a grammar file to 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * an equivalent string literal in the C target. 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Because we must support Unicode character sets and have chosen 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * to have the lexer match UTF32 characters, then we must encode 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * string matches to use 32 bit character arrays. Here then we 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * must produce the C array and cater for the case where the 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * lexer has been encoded with a string such as 'xyz\n', 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Override 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public String getTargetStringLiteralFromANTLRStringLiteral( 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver CodeGenerator generator, 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String literal) { 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int index; 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String bytes; 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver StringBuffer buf = new StringBuffer(); 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buf.append("{ "); 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // We need ot lose any escaped characters of the form \x and just 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // replace them with their actual values as well as lose the surrounding 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // quote marks. 204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (int i = 1; i < literal.length() - 1; i++) { 206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buf.append("0x"); 207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (literal.charAt(i) == '\\') { 209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver i++; // Assume that there is a next character, this will just yield 210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // invalid strings if not, which is what the input would be of course - invalid 211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver switch (literal.charAt(i)) { 212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case 'u': 213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case 'U': 214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buf.append(literal.substring(i + 1, i + 5)); // Already a hex string 215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver i = i + 5; // Move to next string/char/escape 216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case 'n': 219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case 'N': 220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buf.append("0A"); 222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case 'r': 225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case 'R': 226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buf.append("0D"); 228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case 't': 231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case 'T': 232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buf.append("09"); 234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case 'b': 237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case 'B': 238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buf.append("08"); 240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case 'f': 243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case 'F': 244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buf.append("0C"); 246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver default: 249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Anything else is what it is! 251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buf.append(Integer.toHexString((int) literal.charAt(i)).toUpperCase()); 253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } else { 256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buf.append(Integer.toHexString((int) literal.charAt(i)).toUpperCase()); 257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buf.append(", "); 259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buf.append(" ANTLR3_STRING_TERMINATOR}"); 261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver bytes = buf.toString(); 263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver index = strings.indexOf(bytes); 264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (index == -1) { 266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver strings.add(bytes); 267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver index = strings.indexOf(bytes); 268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String strref = "lit_" + String.valueOf(index + 1); 271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return strref; 273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** 276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Overrides the standard grammar analysis so we can prepare the analyser 277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * a little differently from the other targets. 278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * In particular we want to influence the way the code generator makes assumptions about 280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * switchs vs ifs, vs table driven DFAs. In general, C code should be generated that 281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * has the minimum use of tables, and tha meximum use of large switch statements. This 282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * allows the optimizers to generate very efficient code, it can reduce object code size 283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * by about 30% and give about a 20% performance improvement over not doing this. Hence, 284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * for the C target only, we change the defaults here, but only if they are still set to the 285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * defaults. 286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @param generator An instance of the generic code generator class. 288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @param grammar The grammar that we are currently analyzing 289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Override 291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected void performGrammarAnalysis(CodeGenerator generator, Grammar grammar) { 292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Check to see if the maximum inline DFA states is still set to 294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // the default size. If it is then whack it all the way up to the maximum that 295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // we can sensibly get away with. 296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (CodeGenerator.MAX_ACYCLIC_DFA_STATES_INLINE == CodeGenerator.MAX_ACYCLIC_DFA_STATES_INLINE ) { 298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver CodeGenerator.MAX_ACYCLIC_DFA_STATES_INLINE = 65535; 300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Check to see if the maximum switch size is still set to the default 303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // and bring it up much higher if it is. Modern C compilers can handle 304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // much bigger switch statements than say Java can and if anyone finds a compiler 305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // that cannot deal with such big switches, all the need do is generate the 306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // code with a reduced -Xmaxswitchcaselabels nnn 307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (CodeGenerator.MAX_SWITCH_CASE_LABELS == CodeGenerator.MSCL_DEFAULT) { 309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver CodeGenerator.MAX_SWITCH_CASE_LABELS = 3000; 311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Check to see if the number of transitions considered a miminum for using 314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // a switch is still at the default. Because a switch is still generally faster than 315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // an if even with small sets, and given that the optimizer will do the best thing with it 316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // anyway, then we simply want to generate a switch for any number of states. 317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (CodeGenerator.MIN_SWITCH_ALTS == CodeGenerator.MSA_DEFAULT) { 319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver CodeGenerator.MIN_SWITCH_ALTS = 1; 321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Now we allow the superclass implementation to do whatever it feels it 324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // must do. 325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver super.performGrammarAnalysis(generator, grammar); 327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 330