001: /*
002: [The "BSD licence"]
003: Copyright (c) 2005 Terence Parr
004: Copyright (c) 2006 Kay Roepke (Objective-C runtime)
005: All rights reserved.
006:
007: Redistribution and use in source and binary forms, with or without
008: modification, are permitted provided that the following conditions
009: are met:
010: 1. Redistributions of source code must retain the above copyright
011: notice, this list of conditions and the following disclaimer.
012: 2. Redistributions in binary form must reproduce the above copyright
013: notice, this list of conditions and the following disclaimer in the
014: documentation and/or other materials provided with the distribution.
015: 3. The name of the author may not be used to endorse or promote products
016: derived from this software without specific prior written permission.
017:
018: THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
019: IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
020: OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
021: IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
022: INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
023: NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
024: DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
025: THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
026: (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
027: THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
028: */
029: package org.antlr.codegen;
030:
031: import org.antlr.stringtemplate.StringTemplate;
032: import org.antlr.tool.Grammar;
033: import org.antlr.Tool;
034: import org.antlr.misc.Utils;
035:
036: import java.io.IOException;
037:
038: public class ObjCTarget extends Target {
039: protected void genRecognizerHeaderFile(Tool tool,
040: CodeGenerator generator, Grammar grammar,
041: StringTemplate headerFileST, String extName)
042: throws IOException {
043: generator.write(headerFileST, grammar.name
044: + Grammar.grammarTypeToFileNameSuffix[grammar.type]
045: + extName);
046: }
047:
048: public String getTargetCharLiteralFromANTLRCharLiteral(
049: CodeGenerator generator, String literal) {
050: if (literal.startsWith("'\\u")) {
051: literal = "0x" + literal.substring(3, 7);
052: } else {
053: int c = literal.charAt(1); // TJP
054: if (c < 32 || c > 127) {
055: literal = "0x" + Integer.toHexString(c);
056: }
057: }
058:
059: return literal;
060: }
061:
062: /** Convert from an ANTLR string literal found in a grammar file to
063: * an equivalent string literal in the target language. For Java, this
064: * is the translation 'a\n"' -> "a\n\"". Expect single quotes
065: * around the incoming literal. Just flip the quotes and replace
066: * double quotes with \"
067: */
068: public String getTargetStringLiteralFromANTLRStringLiteral(
069: CodeGenerator generator, String literal) {
070: literal = Utils.replace(literal, "\"", "\\\"");
071: StringBuffer buf = new StringBuffer(literal);
072: buf.setCharAt(0, '"');
073: buf.setCharAt(literal.length() - 1, '"');
074: buf.insert(0, '@');
075: return buf.toString();
076: }
077:
078: /** If we have a label, prefix it with the recognizer's name */
079: public String getTokenTypeAsTargetLabel(CodeGenerator generator,
080: int ttype) {
081: String name = generator.grammar.getTokenDisplayName(ttype);
082: // If name is a literal, return the token type instead
083: if (name.charAt(0) == '\'') {
084: return String.valueOf(ttype);
085: }
086: return generator.grammar.name
087: + Grammar.grammarTypeToFileNameSuffix[generator.grammar.type]
088: + "_" + name;
089: //return super.getTokenTypeAsTargetLabel(generator, ttype);
090: //return this.getTokenTextAndTypeAsTargetLabel(generator, null, ttype);
091: }
092:
093: /** Target must be able to override the labels used for token types. Sometimes also depends on the token text.*/
094: public String getTokenTextAndTypeAsTargetLabel(
095: CodeGenerator generator, String text, int tokenType) {
096: String name = generator.grammar.getTokenDisplayName(tokenType);
097: // If name is a literal, return the token type instead
098: if (name.charAt(0) == '\'') {
099: return String.valueOf(tokenType);
100: }
101: String textEquivalent = text == null ? name : text;
102: if (textEquivalent.charAt(0) >= '0'
103: && textEquivalent.charAt(0) <= '9') {
104: return textEquivalent;
105: } else {
106: return generator.grammar.name
107: + Grammar.grammarTypeToFileNameSuffix[generator.grammar.type]
108: + "_" + textEquivalent;
109: }
110: }
111:
112: }
|