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