// Path: nand2tetris/projects/11/Compiler/src/com/tamco/hack/compiler/lexical/Lexical.java
// public class Lexical {
// 
// 	public static final List<String> keywords = Arrays.asList("class", "constructor", "function",
// 															  "method", "field", "static", "var",
// 															  "int", "char", "boolean", "void", "true",
// 															  "false", "null", "this", "let", "do",
// 															  "if", "else", "while", "return");
// 
// 	public static final List<String> symbols = Arrays.asList("{", "}", "(", ")", "[", "]", ".",
// 															 ",", ";", "+", "-", "*", "/", "&",
// 															 "|", "<", ">", "=", "~");
// 
// 
// 	public static enum Type {
// 		keyword,
// 		symbol,
// 		integerConstant,
// 		stringConstant,
// 		identifier
// 	}
// 
// 	private Type type;
// 
// 	private String lecical;
// 
// 	public Lexical(Type type, String lecical) {
// 		this.type = type;
// 		this.lecical = lecical;
// 	}
// 
// 	public Type getType() {
// 		return type;
// 	}
// 
// 	public void setType(Type type) {
// 		this.type = type;
// 	}
// 
// 	public String getLecical() {
// 		return lecical;
// 	}
// 
// 	public void setLecical(String lecical) {
// 		this.lecical = lecical;
// 	}
// 
// 	public String toString() {
// 		String lex = lecical.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;");
// 		return "<" + type.name() + "> " + lex + " </" + type.name() + ">";
// 	}
// 
// 	public static Lexical fromString(String token) {
// 		if (keywords.contains(token)) {
// 			return new Lexical(Type.keyword, token);
// 		}
// 
// 		try {
// 			Integer.parseInt(token);
// 			return new Lexical(Type.integerConstant, token);
// 
// 		} catch (NumberFormatException e) {
// 			return new Lexical(Type.identifier, token);
// 		}
// 	}
// }


import com.tamco.hack.compiler.lexical.Lexical;
import java.util.List;
package com.tamco.hack.compiler;



/**
 * Created by tam-co on 12/07/2017.
 */
public class CompilationEngine {

	private List<Lexical> tokens;

	private List<String> output;

	private int count = -1;

// Path: nand2tetris/projects/11/Compiler/src/com/tamco/hack/compiler/lexical/Lexical.java
// public class Lexical {
// 
// 	public static final List<String> keywords = Arrays.asList("class", "constructor", "function",
// 															  "method", "field", "static", "var",
// 															  "int", "char", "boolean", "void", "true",
// 															  "false", "null", "this", "let", "do",
// 															  "if", "else", "while", "return");
// 
// 	public static final List<String> symbols = Arrays.asList("{", "}", "(", ")", "[", "]", ".",
// 															 ",", ";", "+", "-", "*", "/", "&",
// 															 "|", "<", ">", "=", "~");
// 
// 
// 	public static enum Type {
// 		keyword,
// 		symbol,
// 		integerConstant,
// 		stringConstant,
// 		identifier
// 	}
// 
// 	private Type type;
// 
// 	private String lecical;
// 
// 	public Lexical(Type type, String lecical) {
// 		this.type = type;
// 		this.lecical = lecical;
// 	}
// 
// 	public Type getType() {
// 		return type;
// 	}
// 
// 	public void setType(Type type) {
// 		this.type = type;
// 	}
// 
// 	public String getLecical() {
// 		return lecical;
// 	}
// 
// 	public void setLecical(String lecical) {
// 		this.lecical = lecical;
// 	}
// 
// 	public String toString() {
// 		String lex = lecical.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;");
// 		return "<" + type.name() + "> " + lex + " </" + type.name() + ">";
// 	}
// 
// 	public static Lexical fromString(String token) {
// 		if (keywords.contains(token)) {
// 			return new Lexical(Type.keyword, token);
// 		}
// 
// 		try {
// 			Integer.parseInt(token);
// 			return new Lexical(Type.integerConstant, token);
// 
// 		} catch (NumberFormatException e) {
// 			return new Lexical(Type.identifier, token);
// 		}
// 	}
// }


// Path: nand2tetris/projects/10/Compiler/src/com/tamco/hack/compiler/CompilationEngine.java
import com.tamco.hack.compiler.lexical.Lexical;
import java.util.List;

package com.tamco.hack.compiler;



/**
 * Created by tam-co on 12/07/2017.
 */
public class CompilationEngine {

	private List<Lexical> tokens;

	private List<String> output;

	private int count = -1;

	private Lexical currentToken;