blob: 22962e08368e0a1e9ccde1ee2cb1dcc78420c114 [file] [log] [blame]
/*
* [The "BSD license"]
* Copyright (c) 2010 Terence Parr
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.antlr.codegen;
import org.antlr.Tool;
import org.stringtemplate.v4.ST;
import org.stringtemplate.v4.STGroup;
import org.antlr.tool.Grammar;
import java.io.IOException;
public class CPPTarget extends Target {
public String escapeChar( int c ) {
// System.out.println("CPPTarget.escapeChar("+c+")");
switch (c) {
case '\n' : return "\\n";
case '\t' : return "\\t";
case '\r' : return "\\r";
case '\\' : return "\\\\";
case '\'' : return "\\'";
case '"' : return "\\\"";
default :
if ( c < ' ' || c > 126 )
{
if (c > 255)
{
String s = Integer.toString(c,16);
// put leading zeroes in front of the thing..
while( s.length() < 4 )
s = '0' + s;
return "\\u" + s;
}
else {
return "\\" + Integer.toString(c,8);
}
}
else {
return String.valueOf((char)c);
}
}
}
/** Converts a String into a representation that can be use as a literal
* when surrounded by double-quotes.
*
* Used for escaping semantic predicate strings for exceptions.
*
* @param s The String to be changed into a literal
*/
public String escapeString(String s)
{
StringBuffer retval = new StringBuffer();
for (int i = 0; i < s.length(); i++) {
retval.append(escapeChar(s.charAt(i)));
}
return retval.toString();
}
protected void genRecognizerHeaderFile(Tool tool,
CodeGenerator generator,
Grammar grammar,
ST headerFileST,
String extName)
throws IOException
{
generator.write(headerFileST, grammar.name+extName);
}
/** Convert from an ANTLR char literal found in a grammar file to
* an equivalent char literal in the target language. For Java, this
* is the identify translation; i.e., '\n' -> '\n'. Most languages
* will be able to use this 1-to-1 mapping. Expect single quotes
* around the incoming literal.
* Depending on the charvocabulary the charliteral should be prefixed with a 'L'
*/
public String getTargetCharLiteralFromANTLRCharLiteral( CodeGenerator codegen, String literal) {
int c = Grammar.getCharValueFromGrammarCharLiteral(literal);
String prefix = "'";
if( codegen.grammar.getMaxCharValue() > 255 )
prefix = "L'";
else if( (c & 0x80) != 0 ) // if in char mode prevent sign extensions
return ""+c;
return prefix+escapeChar(c)+"'";
}
/** Convert from an ANTLR string literal found in a grammar file to
* an equivalent string literal in the target language. For Java, this
* is the identify translation; i.e., "\"\n" -> "\"\n". Most languages
* will be able to use this 1-to-1 mapping. Expect double quotes
* around the incoming literal.
* Depending on the charvocabulary the string should be prefixed with a 'L'
*/
public String getTargetStringLiteralFromANTLRStringLiteral( CodeGenerator codegen, String literal) {
StringBuffer buf = Grammar.getUnescapedStringFromGrammarStringLiteral(literal);
String prefix = "\"";
if( codegen.grammar.getMaxCharValue() > 255 )
prefix = "L\"";
return prefix+escapeString(buf.toString())+"\"";
}
/** Character constants get truncated to this value.
* TODO: This should be derived from the charVocabulary. Depending on it
* being 255 or 0xFFFF the templates should generate normal character
* constants or multibyte ones.
*/
public int getMaxCharValue( CodeGenerator codegen ) {
int maxval = 255; // codegen.grammar.get????();
if ( maxval <= 255 )
return 255;
else
return maxval;
}
}