/* Token.java */
/* Now just contains various static methods for dealing with Symbols. *shrug* */

public class Token {
  public static String symbol_to_string(java_cup.runtime.Symbol symbol) {
	switch (symbol.sym) {
	case Sym.CHAR_LITERAL:
	  return "char literal \'" + Token.backslashify(symbol.value.toString()) + "\'";
	case Sym.STRING_LITERAL:
	  return "string literal \"" + Token.backslashify(symbol.value.toString()) + "\"";
	case Sym.INT_LITERAL:
	  return "int literal " + symbol.value.toString();
	case Sym.ID:
	  return "identifier " + (String)symbol.value;
	}
	if (symbol.value == null)
	  return Token.symnames[symbol.sym];
	return "\"" + symbol.value.toString() + "\"";
  }

  private static String backslashify(String s) {
	StringBuffer buf = new StringBuffer(s.length());
	for (int i = 0; i < s.length(); i++) {
	  char c = s.charAt(i);
	  switch (c) {
	  case '\'':
		buf.append("\\\'");
		break;
	  case '\"':
		buf.append("\\\"");
		break;
	  case '\\':
		buf.append("\\\\");
		break;
	  case '\n':
		buf.append("\\n");
		break;
	  default:
		buf.append(c);
		break;
	  }
	}
	return buf.toString();
  }


  public static String symnames[] = new String[100];

  static {
	symnames[Sym.EOF] = "EOF";
	symnames[Sym.LBRACE] = "LBRACE";
	symnames[Sym.RBRACE] = "RBRACE";
	symnames[Sym.LBRACKET] = "LBRACKET";
	symnames[Sym.RBRACKET] = "RBRACKET";
	symnames[Sym.LPAREN] = "LPAREN";
	symnames[Sym.RPAREN] = "RPAREN";
	symnames[Sym.COMMA] = "COMMA";
	symnames[Sym.SEMICOLON] = "SEMICOLON";
	symnames[Sym.PLUS] = "PLUS";
	symnames[Sym.MINUS] = "MINUS";
	symnames[Sym.TIMES] = "TIMES";
	symnames[Sym.LSHIFT] = "LSHIFT";
	symnames[Sym.RSHIFT] = "RSHIFT";
	symnames[Sym.LE] = "LE";
	symnames[Sym.GE] = "GE";
	symnames[Sym.LT] = "LT";
	symnames[Sym.GT] = "GT";
	symnames[Sym.EQ] = "EQ";
	symnames[Sym.NE] = "NE";
	symnames[Sym.ASSIGN] = "ASSIGN";
	symnames[Sym.AND] = "AND";
	symnames[Sym.OR] = "OR";
	symnames[Sym.DOT] = "DOT";
	symnames[Sym.BOOLEAN] = "BOOLEAN";
	symnames[Sym.CALLOUT] = "CALLOUT";
	symnames[Sym.CLASS] = "CLASS";
	symnames[Sym.ELSE] = "ELSE";
	symnames[Sym.EXTENDS] = "EXTENDS";
	symnames[Sym.FALSE] = "FALSE";
	symnames[Sym.IF] = "IF";
	symnames[Sym.INT] = "INT";
	symnames[Sym.NEW] = "NEW";
	symnames[Sym.NULL] = "NULL";
	symnames[Sym.RETURN] = "RETURN";
	symnames[Sym.THIS] = "THIS";
	symnames[Sym.TRUE] = "TRUE";
	symnames[Sym.VOID] = "VOID";
	symnames[Sym.WHILE] = "WHILE";
	symnames[Sym.INT_LITERAL] = "INT_LITERAL";
	symnames[Sym.CHAR_LITERAL] = "CHAR_LITERAL";
	symnames[Sym.STRING_LITERAL] = "STRING_LITERAL";
	symnames[Sym.ID] = "ID";
  }
}
