1 /* 2 * [The "BSD license"] 3 * Copyright (c) 2010 Terence Parr 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 3. The name of the author may not be used to endorse or promote products 15 * derived from this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 package org.antlr.codegen; 30 31 public class JavaScriptTarget extends Target { 32 /** Convert an int to a JavaScript Unicode character literal. 33 * 34 * The current JavaScript spec (ECMA-262) doesn't provide for octal 35 * notation in String literals, although some implementations support it. 36 * This method overrides the parent class so that characters will always 37 * be encoded as Unicode literals (e.g. \u0011). 38 */ 39 @Override encodeIntAsCharEscape(int v)40 public String encodeIntAsCharEscape(int v) { 41 String hex = Integer.toHexString(v|0x10000).substring(1,5); 42 return "\\u"+hex; 43 } 44 45 /** Convert long to two 32-bit numbers separted by a comma. 46 * JavaScript does not support 64-bit numbers, so we need to break 47 * the number into two 32-bit literals to give to the Bit. A number like 48 * 0xHHHHHHHHLLLLLLLL is broken into the following string: 49 * "0xLLLLLLLL, 0xHHHHHHHH" 50 * Note that the low order bits are first, followed by the high order bits. 51 * This is to match how the BitSet constructor works, where the bits are 52 * passed in in 32-bit chunks with low-order bits coming first. 53 * 54 * Note: stole the following two methods from the ActionScript target. 55 */ 56 @Override getTarget64BitStringFromValue(long word)57 public String getTarget64BitStringFromValue(long word) { 58 StringBuffer buf = new StringBuffer(22); // enough for the two "0x", "," and " " 59 buf.append("0x"); 60 writeHexWithPadding(buf, Integer.toHexString((int)(word & 0x00000000ffffffffL))); 61 buf.append(", 0x"); 62 writeHexWithPadding(buf, Integer.toHexString((int)(word >> 32))); 63 64 return buf.toString(); 65 } 66 writeHexWithPadding(StringBuffer buf, String digits)67 private void writeHexWithPadding(StringBuffer buf, String digits) { 68 digits = digits.toUpperCase(); 69 int padding = 8 - digits.length(); 70 // pad left with zeros 71 for (int i=1; i<=padding; i++) { 72 buf.append('0'); 73 } 74 buf.append(digits); 75 } 76 } 77