// Path: src/com/iconmaster/source/element/IElementType.java
// public interface IElementType {
// 	public String getAlias();
// }
// 
// Path: src/com/iconmaster/source/util/StringUtils.java
// public class StringUtils {
// 	public static String nameString(Element e) {
// 		if (e==null) {
// 			return null;
// 		} else if (e.type==TokenRule.WORD || e.type==TokenRule.STRING) {
// 			return (String) e.args[0];
// 		} else if (e.type == Rule.CHAIN) {
// 			String str = null;
// 			for (Element e2 : (ArrayList<Element>)e.args[0]) {
// 				if (e2.type==TokenRule.WORD) {
// 					if (str==null) {
// 						str = (String) e2.args[0];
// 					} else {
// 						str += "." + (String) e2.args[0];
// 					}
// 				}
// 			}
// 			return str;
// 		}
// 		return null;
// 	}
// 	
// 	public static boolean isReal(String n) {
// 		return n.contains(".");
// 	}
// 	
// 	public static String unescape(String s) {
// 		String out = "";
// 		boolean esc = false;
// 		for (char c : s.toCharArray()) {
// 			if (esc) {
// 				if (c=='n') {
// 					out += '\n';
// 				} else if (c=='t') {
// 					out += '\t';
// 				} else {
// 					out += c;
// 				}
// 				esc = false;
// 			} else {
// 				if (c=='\\') {
// 					esc = true;
// 				} else {
// 					out += c;
// 				}
// 			}
// 		}
// 		return out;
// 	}
// 	
// 	public static String mathElementToString(Element e) {
// 		if (e.type instanceof Rule) {
// 			switch ((Rule)e.type) {
// 				case ADD:
// 					return "_add";
// 				case SUB:
// 					return "_sub";
// 				case MUL:
// 					return "_mul";
// 				case DIV:
// 					return "_div";
// 				case POW:
// 					return "_pow";
// 				case MOD:
// 					return "_mod";
// 				case CONCAT:
// 					return "_concat";
// 				case EQ:
// 					return "_eq";
// 				case NEQ:
// 					return "_neq";
// 				case LT:
// 					return "_lt";
// 				case GT:
// 					return "_gt";
// 				case LTE:
// 					return "_lte";
// 				case GTE:
// 					return "_gte";
// 				case AND:
// 					return "_and";
// 				case OR:
// 					return "_or";
// 				case BIT_AND:
// 					return "_band";
// 				case BIT_OR:
// 					return "_bor";
// 				case SLL:
// 					return "_sll";
// 				case SRL:
// 					return "_srl";
// 				case SRA:
// 					return "_sra";
// 			}
// 		}
// 		return null;
// 	}
// }


import com.iconmaster.source.element.IElementType;
import com.iconmaster.source.util.StringUtils;
	NUMBER("n","[\\d\\.]+"),
	STRING("s","\"(\\\\.|[^\"])*\""),
	CHAR(null,"\'(\\\\.|[^\'])\'"),
	SEP(";",";+"),
	DIRECTIVE("r","@[\\S]*"),
	SYMBOL("y","([\\Q+-*/=<>~:!&|%^\\E]+|\\(|\\)|\\[|\\]|\\{|\\}|,)");
	
	public final String match;
	public String alias;
	
	TokenRule(String alias, String match) {
		this.match = "^"+match;
		this.alias = alias;
	}
	
	TokenRule(String match) {
		this(null,match);
	}
	
	TokenRule() {
		this(null,"[^.]");
	}
	
	public String format(String input) {
		switch (this) {
			case SPACE:
			case COMMENT:
				return null;
			case CHAR:
			case STRING:
// Path: src/com/iconmaster/source/element/IElementType.java
// public interface IElementType {
// 	public String getAlias();
// }
// 
// Path: src/com/iconmaster/source/util/StringUtils.java
// public class StringUtils {
// 	public static String nameString(Element e) {
// 		if (e==null) {
// 			return null;
// 		} else if (e.type==TokenRule.WORD || e.type==TokenRule.STRING) {
// 			return (String) e.args[0];
// 		} else if (e.type == Rule.CHAIN) {
// 			String str = null;
// 			for (Element e2 : (ArrayList<Element>)e.args[0]) {
// 				if (e2.type==TokenRule.WORD) {
// 					if (str==null) {
// 						str = (String) e2.args[0];
// 					} else {
// 						str += "." + (String) e2.args[0];
// 					}
// 				}
// 			}
// 			return str;
// 		}
// 		return null;
// 	}
// 	
// 	public static boolean isReal(String n) {
// 		return n.contains(".");
// 	}
// 	
// 	public static String unescape(String s) {
// 		String out = "";
// 		boolean esc = false;
// 		for (char c : s.toCharArray()) {
// 			if (esc) {
// 				if (c=='n') {
// 					out += '\n';
// 				} else if (c=='t') {
// 					out += '\t';
// 				} else {
// 					out += c;
// 				}
// 				esc = false;
// 			} else {
// 				if (c=='\\') {
// 					esc = true;
// 				} else {
// 					out += c;
// 				}
// 			}
// 		}
// 		return out;
// 	}
// 	
// 	public static String mathElementToString(Element e) {
// 		if (e.type instanceof Rule) {
// 			switch ((Rule)e.type) {
// 				case ADD:
// 					return "_add";
// 				case SUB:
// 					return "_sub";
// 				case MUL:
// 					return "_mul";
// 				case DIV:
// 					return "_div";
// 				case POW:
// 					return "_pow";
// 				case MOD:
// 					return "_mod";
// 				case CONCAT:
// 					return "_concat";
// 				case EQ:
// 					return "_eq";
// 				case NEQ:
// 					return "_neq";
// 				case LT:
// 					return "_lt";
// 				case GT:
// 					return "_gt";
// 				case LTE:
// 					return "_lte";
// 				case GTE:
// 					return "_gte";
// 				case AND:
// 					return "_and";
// 				case OR:
// 					return "_or";
// 				case BIT_AND:
// 					return "_band";
// 				case BIT_OR:
// 					return "_bor";
// 				case SLL:
// 					return "_sll";
// 				case SRL:
// 					return "_srl";
// 				case SRA:
// 					return "_sra";
// 			}
// 		}
// 		return null;
// 	}
// }


// Path: src/com/iconmaster/source/tokenize/TokenRule.java
import com.iconmaster.source.element.IElementType;
import com.iconmaster.source.util.StringUtils;

	NUMBER("n","[\\d\\.]+"),
	STRING("s","\"(\\\\.|[^\"])*\""),
	CHAR(null,"\'(\\\\.|[^\'])\'"),
	SEP(";",";+"),
	DIRECTIVE("r","@[\\S]*"),
	SYMBOL("y","([\\Q+-*/=<>~:!&|%^\\E]+|\\(|\\)|\\[|\\]|\\{|\\}|,)");
	
	public final String match;
	public String alias;
	
	TokenRule(String alias, String match) {
		this.match = "^"+match;
		this.alias = alias;
	}
	
	TokenRule(String match) {
		this(null,match);
	}
	
	TokenRule() {
		this(null,"[^.]");
	}
	
	public String format(String input) {
		switch (this) {
			case SPACE:
			case COMMENT:
				return null;
			case CHAR:
			case STRING:
				return StringUtils.unescape(input.substring(1, input.length()-1));