diff --git a/src/qir/ast/QIRLambda.java b/src/qir/ast/QIRLambda.java
index 33eb76b1c862c88ab96159712c917b28f7a56af9..b7f27bdd89c8c24aa8044941e3e46b29633c9f92 100644
--- a/src/qir/ast/QIRLambda.java
+++ b/src/qir/ast/QIRLambda.java
@@ -8,6 +8,8 @@ import com.oracle.truffle.api.frame.VirtualFrame;
 import com.oracle.truffle.api.source.SourceSection;
 
 import qir.driver.IQIRVisitor;
+import qir.types.QIRConstantType;
+import qir.types.QIRType;
 import qir.util.QIRAny;
 
 /**
@@ -18,6 +20,7 @@ public final class QIRLambda extends QIRNode {
      * The name of the function. {@code null} for an anonymous function.
      */
     private final String funName;
+    private final QIRType type;
     /**
      * A {@link QIRVariable} that represents the argument of the function.
      */
@@ -32,18 +35,27 @@ public final class QIRLambda extends QIRNode {
      */
     private MaterializedFrame env;
 
-    public QIRLambda(final SourceSection source, final String funName, final QIRVariable var, final QIRNode body, final FrameDescriptor frameDescr) {
+    public QIRLambda(final SourceSection source, final String funName, final QIRType type, final QIRVariable var, final QIRNode body, final FrameDescriptor frameDescr) {
         super(source);
         this.funName = funName;
+        this.type = type;
         this.var = var;
         this.body = body;
         this.target = Truffle.getRuntime().createCallTarget(new QIRRootNode(null, var != null ? frameDescr.findOrAddFrameSlot(var.id) : null, body, frameDescr));
     }
 
+    public QIRLambda(final SourceSection source, final String funName, final QIRVariable var, final QIRNode body, final FrameDescriptor frameDescr) {
+        this(source, funName, QIRConstantType.ANY, var, body, frameDescr);
+    }
+
     public final String getFunName() {
         return funName;
     }
 
+    public final QIRType getType() {
+        return type;
+    }
+
     public final QIRVariable getVar() {
         return var;
     }
@@ -62,7 +74,7 @@ public final class QIRLambda extends QIRNode {
 
     @Override
     public final String toString() {
-        return (funName != null ? funName : "lambda") + " " + var + " -> {" + body + "}";
+        return (funName != null ? funName : "lambda") + " : " + type.toString() + " " + var + " -> {" + body + "}";
     }
 
     @Override
diff --git a/src/qir/ast/operator/ExternalOperator.java b/src/qir/ast/operator/ExternalOperator.java
new file mode 100644
index 0000000000000000000000000000000000000000..ba0003542bde4822c14329c8169b434d6032cb6f
--- /dev/null
+++ b/src/qir/ast/operator/ExternalOperator.java
@@ -0,0 +1,25 @@
+package qir.ast.operator;
+
+import java.util.List;
+
+import com.oracle.truffle.api.frame.VirtualFrame;
+import com.oracle.truffle.api.source.SourceSection;
+
+import qir.ast.QIRNode;
+import qir.util.QIRException;
+
+public final class ExternalOperator extends QIROperator {
+    public final String name;
+    public final List<QIRNode> args;
+
+    public ExternalOperator(final SourceSection source, final String name, final List<QIRNode> args) {
+        super(source);
+        this.name = name;
+        this.args = args;
+    }
+
+    @Override
+    public final QIRNode executeGeneric(final VirtualFrame frame) {
+        throw new QIRException("External operator " + name + " is not implemented in QIR.");
+    }
+}
diff --git a/src/qir/parser/Parser.frame b/src/qir/parser/Parser.frame
index 2751f52f8c6f76d63034b43e44f358f5dd95da6d..96864c46557fd5de6b98bc5b143d0fab8de56499 100644
--- a/src/qir/parser/Parser.frame
+++ b/src/qir/parser/Parser.frame
@@ -28,6 +28,9 @@ Coco/R itself) does not fall under the GNU General Public License.
 -->beginpackage qir.parser;
 
 import java.math.BigInteger;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Arrays;
 
 import com.oracle.truffle.api.frame.FrameDescriptor;
 import com.oracle.truffle.api.source.Source;
@@ -40,6 +43,7 @@ import qir.ast.expression.arithmetic.*;
 import qir.ast.expression.logic.*;
 import qir.ast.expression.relational.*;
 import qir.ast.operator.*;
+import qir.types.*;
 
 public class Parser {
 -->constants
diff --git a/src/qir/parser/Parser.java b/src/qir/parser/Parser.java
index 43a062c8c9e28e031bacf1120aa621ec393ba873..d30feda5d8e6ea9b8341b939786012e6371102f1 100644
--- a/src/qir/parser/Parser.java
+++ b/src/qir/parser/Parser.java
@@ -1,6 +1,9 @@
 package qir.parser;
 
 import java.math.BigInteger;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Arrays;
 
 import com.oracle.truffle.api.frame.FrameDescriptor;
 import com.oracle.truffle.api.source.Source;
@@ -13,6 +16,7 @@ import qir.ast.expression.arithmetic.*;
 import qir.ast.expression.logic.*;
 import qir.ast.expression.relational.*;
 import qir.ast.operator.*;
+import qir.types.*;
 
 public class Parser {
 	public static final int _EOF = 0;
@@ -20,7 +24,7 @@ public class Parser {
 	public static final int _stringLiteral = 2;
 	public static final int _numberLiteral = 3;
 	public static final int _doubleLiteral = 4;
-	public static final int maxT = 50;
+	public static final int maxT = 60;
 
 	static final boolean _T = true;
 	static final boolean _x = false;
@@ -262,47 +266,47 @@ public class Parser {
 			res = result; 
 			break;
 		}
-		case 20: {
+		case 21: {
 			QIRLambda result = Lambda();
 			res = result; 
 			break;
 		}
-		case 23: {
+		case 34: {
 			QIRIf result = Ifexpr();
 			res = result; 
 			break;
 		}
-		case 26: {
+		case 37: {
 			QIRRecord result = Tuplecons();
 			res = result; 
 			break;
 		}
-		case 30: {
+		case 41: {
 			QIRList result = Listcons();
 			res = result; 
 			break;
 		}
-		case 32: {
+		case 43: {
 			QIRLdestr result = Listdestr();
 			res = result; 
 			break;
 		}
-		case 35: {
+		case 46: {
 			QIRExternal result = External();
 			res = result; 
 			break;
 		}
-		case 36: {
+		case 47: {
 			QIRTable result = Table();
 			res = result; 
 			break;
 		}
-		case 38: {
+		case 48: {
 			QIRBigNumber result = Bignumber();
 			res = result; 
 			break;
 		}
-		case 39: case 40: {
+		case 49: case 50: {
 			QIRBoolean result = Boolean();
 			res = result; 
 			break;
@@ -317,7 +321,7 @@ public class Parser {
 			res = result; 
 			break;
 		}
-		case 41: {
+		case 51: {
 			QIRNull result = Null();
 			res = result; 
 			break;
@@ -327,42 +331,61 @@ public class Parser {
 			res = result; 
 			break;
 		}
-		case 42: {
+		case 14: {
+			Get();
+			final Token srcToken = t;
+			final List<QIRNode> args = new ArrayList<>(); 
+			Expect(1);
+			final Token opName = t; 
+			Expect(18);
+			if (StartOf(1)) {
+				QIRNode arg = QIR();
+				args.add(arg); 
+				while (la.kind == 19) {
+					Get();
+					arg = QIR();
+					args.add(arg); 
+				}
+			}
+			res = new ExternalOperator(srcFromToken(srcToken), opName.val, args); 
+			break;
+		}
+		case 52: {
 			QIRProject result = Project();
 			res = result; 
 			break;
 		}
-		case 43: {
+		case 53: {
 			QIRScan result = Scan();
 			res = result; 
 			break;
 		}
-		case 44: {
+		case 54: {
 			QIRFilter result = Filter();
 			res = result; 
 			break;
 		}
-		case 45: {
+		case 55: {
 			QIRGroupBy result = Groupby();
 			res = result; 
 			break;
 		}
-		case 46: {
+		case 56: {
 			QIRSortBy result = Sortby();
 			res = result; 
 			break;
 		}
-		case 47: {
+		case 57: {
 			QIRJoin result = Join();
 			res = result; 
 			break;
 		}
-		case 48: {
+		case 58: {
 			QIRLeftJoin result = Leftjoin();
 			res = result; 
 			break;
 		}
-		case 49: {
+		case 59: {
 			QIRRightJoin result = Rightjoin();
 			res = result; 
 			break;
@@ -370,10 +393,10 @@ public class Parser {
 		case 18: {
 			Get();
 			res = QIR();
-			Expect(19);
+			Expect(20);
 			break;
 		}
-		default: SynErr(51); break;
+		default: SynErr(61); break;
 		}
 		return res;
 	}
@@ -387,29 +410,34 @@ public class Parser {
 
 	QIRLambda  Lambda() {
 		QIRLambda  res;
-		Expect(20);
+		Expect(21);
 		final Token srcToken = t;
-		Token funName = null; 
-		if (la.kind == 21) {
+		Token funName = null;
+		QIRType type = new FunctionType(Arrays.asList(QIRConstantType.ANY, QIRConstantType.ANY)); 
+		if (la.kind == 22) {
 			Get();
 			Expect(1);
 			funName = t; 
 		}
+		if (la.kind == 23) {
+			Get();
+			type = Type();
+		}
 		QIRVariable var = Variable();
-		Expect(22);
+		Expect(24);
 		QIRNode body = QIR();
-		res = new QIRLambda(srcFromToken(srcToken), funName == null ? null : funName.val, var, body, new FrameDescriptor()); 
+		res = new QIRLambda(srcFromToken(srcToken), funName == null ? null : funName.val, type, var, body, new FrameDescriptor()); 
 		return res;
 	}
 
 	QIRIf  Ifexpr() {
 		QIRIf  res;
-		Expect(23);
+		Expect(34);
 		final Token srcToken = t; 
 		QIRNode cond = QIR();
-		Expect(24);
+		Expect(35);
 		QIRNode thenNode = QIR();
-		Expect(25);
+		Expect(36);
 		QIRNode elseNode = QIR();
 		res = new QIRIf(srcFromToken(srcToken), cond, thenNode, elseNode); 
 		return res;
@@ -417,98 +445,98 @@ public class Parser {
 
 	QIRRecord  Tuplecons() {
 		QIRRecord  res;
-		Expect(26);
+		Expect(37);
 		res = QIRRnil.getInstance();
 		final Token srcToken = t;
 		Token idToken; 
 		if (la.kind == 1) {
 			Get();
 			idToken = t; 
-			Expect(27);
+			Expect(38);
 			QIRNode value = QIR();
 			res = new QIRRcons(srcFromToken(srcToken), idToken.val, value, res); 
-			while (la.kind == 28) {
+			while (la.kind == 39) {
 				Get();
 				Expect(1);
 				idToken = t; 
-				Expect(27);
+				Expect(38);
 				value = QIR();
 				res = new QIRRcons(srcFromToken(srcToken), idToken.val, value, res); 
 			}
 		}
-		Expect(29);
+		Expect(40);
 		return res;
 	}
 
 	QIRList  Listcons() {
 		QIRList  res;
-		Expect(30);
+		Expect(41);
 		res = QIRLnil.getInstance();
 		final Token srcToken = t; 
 		if (StartOf(1)) {
 			QIRNode value = QIR();
 			res = new QIRLcons(srcFromToken(srcToken), value, res); 
-			while (la.kind == 28) {
+			while (la.kind == 39) {
 				Get();
 				value = QIR();
 				res = new QIRLcons(srcFromToken(srcToken), value, res); 
 			}
 		}
-		Expect(31);
+		Expect(42);
 		return res;
 	}
 
 	QIRLdestr  Listdestr() {
 		QIRLdestr  res;
-		Expect(32);
+		Expect(43);
 		final Token srcToken = t; 
 		QIRNode list = QIR();
-		Expect(33);
-		Expect(34);
-		Expect(22);
+		Expect(44);
+		Expect(45);
+		Expect(24);
 		QIRNode ifEmpty = QIR();
-		Expect(25);
-		Expect(22);
+		Expect(36);
+		Expect(24);
 		QIRNode handler = QIR();
-		Expect(19);
+		Expect(20);
 		res = new QIRLdestr(srcFromToken(srcToken), list, ifEmpty, handler); 
 		return res;
 	}
 
 	QIRExternal  External() {
 		QIRExternal  res;
-		Expect(35);
+		Expect(46);
 		final Token srcToken = t; 
 		Expect(1);
 		final Token eName = t; 
-		Expect(19);
+		Expect(20);
 		res = new QIRExternal(srcFromToken(srcToken), eName.val); 
 		return res;
 	}
 
 	QIRTable  Table() {
 		QIRTable  res;
-		Expect(36);
+		Expect(47);
 		final Token srcToken = t; 
 		QIRNode tableName = QIR();
-		Expect(37);
+		Expect(19);
 		QIRNode dbName = QIR();
-		Expect(37);
+		Expect(19);
 		QIRNode configFile = QIR();
-		Expect(37);
-		QIRNode schemaName = QIR();
 		Expect(19);
+		QIRNode schemaName = QIR();
+		Expect(20);
 		res = new QIRTable(srcFromToken(srcToken), tableName, dbName, configFile, schemaName); 
 		return res;
 	}
 
 	QIRBigNumber  Bignumber() {
 		QIRBigNumber  res;
-		Expect(38);
+		Expect(48);
 		final Token srcToken = t; 
 		Expect(3);
 		final Token number = t; 
-		Expect(19);
+		Expect(20);
 		res = new QIRBigNumber(srcFromToken(srcToken), new BigInteger(number.val)); 
 		return res;
 	}
@@ -516,13 +544,13 @@ public class Parser {
 	QIRBoolean  Boolean() {
 		QIRBoolean  res;
 		res = null; 
-		if (la.kind == 39) {
+		if (la.kind == 49) {
 			Get();
 			res = QIRBoolean.TRUE; 
-		} else if (la.kind == 40) {
+		} else if (la.kind == 50) {
 			Get();
 			res = QIRBoolean.FALSE; 
-		} else SynErr(52);
+		} else SynErr(62);
 		return res;
 	}
 
@@ -542,7 +570,7 @@ public class Parser {
 
 	QIRNull  Null() {
 		QIRNull  res;
-		Expect(41);
+		Expect(51);
 		res = QIRNull.getInstance(); 
 		return res;
 	}
@@ -556,106 +584,175 @@ public class Parser {
 
 	QIRProject  Project() {
 		QIRProject  res;
-		Expect(42);
+		Expect(52);
 		final Token srcToken = t; 
 		QIRNode formatter = QIR();
-		Expect(37);
-		QIRNode child = QIR();
 		Expect(19);
+		QIRNode child = QIR();
+		Expect(20);
 		res = new QIRProject(srcFromToken(srcToken), formatter, child); 
 		return res;
 	}
 
 	QIRScan  Scan() {
 		QIRScan  res;
-		Expect(43);
+		Expect(53);
 		final Token srcToken = t; 
 		QIRNode child = QIR();
-		Expect(19);
+		Expect(20);
 		res = new QIRScan(srcFromToken(srcToken), child); 
 		return res;
 	}
 
 	QIRFilter  Filter() {
 		QIRFilter  res;
-		Expect(44);
+		Expect(54);
 		final Token srcToken = t; 
 		QIRNode filter = QIR();
-		Expect(37);
-		QIRNode child = QIR();
 		Expect(19);
+		QIRNode child = QIR();
+		Expect(20);
 		res = new QIRFilter(srcFromToken(srcToken), filter, child); 
 		return res;
 	}
 
 	QIRGroupBy  Groupby() {
 		QIRGroupBy  res;
-		Expect(45);
+		Expect(55);
 		final Token srcToken = t; 
 		QIRNode group = QIR();
-		Expect(37);
-		QIRNode child = QIR();
 		Expect(19);
+		QIRNode child = QIR();
+		Expect(20);
 		res = new QIRGroupBy(srcFromToken(srcToken), group, child); 
 		return res;
 	}
 
 	QIRSortBy  Sortby() {
 		QIRSortBy  res;
-		Expect(46);
+		Expect(56);
 		final Token srcToken = t; 
 		QIRNode order = QIR();
-		Expect(37);
+		Expect(19);
 		QIRNode isAscending = QIR();
-		Expect(37);
-		QIRNode child = QIR();
 		Expect(19);
+		QIRNode child = QIR();
+		Expect(20);
 		res = new QIRSortBy(srcFromToken(srcToken), order, isAscending, child); 
 		return res;
 	}
 
 	QIRJoin  Join() {
 		QIRJoin  res;
-		Expect(47);
+		Expect(57);
 		final Token srcToken = t; 
 		QIRNode filter = QIR();
-		Expect(37);
+		Expect(19);
 		QIRNode left = QIR();
-		Expect(37);
-		QIRNode right = QIR();
 		Expect(19);
+		QIRNode right = QIR();
+		Expect(20);
 		res = new QIRJoin(srcFromToken(srcToken), filter, left, right); 
 		return res;
 	}
 
 	QIRLeftJoin  Leftjoin() {
 		QIRLeftJoin  res;
-		Expect(48);
+		Expect(58);
 		final Token srcToken = t; 
 		QIRNode filter = QIR();
-		Expect(37);
+		Expect(19);
 		QIRNode left = QIR();
-		Expect(37);
-		QIRNode right = QIR();
 		Expect(19);
+		QIRNode right = QIR();
+		Expect(20);
 		res = new QIRLeftJoin(srcFromToken(srcToken), filter, left, right); 
 		return res;
 	}
 
 	QIRRightJoin  Rightjoin() {
 		QIRRightJoin  res;
-		Expect(49);
+		Expect(59);
 		final Token srcToken = t; 
 		QIRNode filter = QIR();
-		Expect(37);
+		Expect(19);
 		QIRNode left = QIR();
-		Expect(37);
-		QIRNode right = QIR();
 		Expect(19);
+		QIRNode right = QIR();
+		Expect(20);
 		res = new QIRRightJoin(srcFromToken(srcToken), filter, left, right); 
 		return res;
 	}
 
+	QIRType  Type() {
+		QIRType  res;
+		QIRType first = ConstantType();
+		final List<QIRType> types = new ArrayList<>();
+		types.add(first);
+		QIRType type; 
+		while (la.kind == 24) {
+			Get();
+			type = ConstantType();
+			types.add(type); 
+		}
+		res = types.size() == 1 ? first : new FunctionType(types); 
+		return res;
+	}
+
+	QIRType  ConstantType() {
+		QIRType  res;
+		res = null; 
+		switch (la.kind) {
+		case 25: {
+			Get();
+			res = QIRConstantType.ANY; 
+			break;
+		}
+		case 26: {
+			Get();
+			res = QIRConstantType.NUMBER; 
+			break;
+		}
+		case 27: {
+			Get();
+			res = QIRConstantType.BIG_NUMBER; 
+			break;
+		}
+		case 28: {
+			Get();
+			res = QIRConstantType.DOUBLE; 
+			break;
+		}
+		case 29: {
+			Get();
+			res = QIRConstantType.BOOLEAN; 
+			break;
+		}
+		case 30: {
+			Get();
+			res = QIRConstantType.STRING; 
+			break;
+		}
+		case 31: {
+			Get();
+			res = QIRConstantType.NULL; 
+			break;
+		}
+		case 32: {
+			Get();
+			res = QIRConstantType.LIST; 
+			break;
+		}
+		case 33: {
+			Get();
+			res = QIRConstantType.RECORD; 
+			break;
+		}
+		default: SynErr(63); break;
+		}
+		return res;
+	}
+
 
 
 	public QIRNode Parse() {
@@ -670,8 +767,8 @@ public class Parser {
 	}
 
 	private static final boolean[][] set = {
-		{_T,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x},
-		{_x,_T,_T,_T, _T,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_T, _x,_x,_T,_x, _T,_x,_x,_T, _x,_x,_T,_x, _x,_x,_T,_x, _T,_x,_x,_T, _T,_x,_T,_T, _T,_T,_T,_T, _T,_T,_T,_T, _T,_T,_x,_x}
+		{_T,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x},
+		{_x,_T,_T,_T, _T,_x,_x,_x, _x,_x,_x,_x, _x,_x,_T,_T, _x,_x,_T,_x, _x,_T,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_T,_x, _x,_T,_x,_x, _x,_T,_x,_T, _x,_x,_T,_T, _T,_T,_T,_T, _T,_T,_T,_T, _T,_T,_T,_T, _x,_x}
 
 	};
 
@@ -723,40 +820,51 @@ class Errors {
 			case 16: s = "\"@\" expected"; break;
 			case 17: s = "\".\" expected"; break;
 			case 18: s = "\"(\" expected"; break;
-			case 19: s = "\")\" expected"; break;
-			case 20: s = "\"fun\" expected"; break;
-			case 21: s = "\":\" expected"; break;
-			case 22: s = "\"->\" expected"; break;
-			case 23: s = "\"if\" expected"; break;
-			case 24: s = "\"then\" expected"; break;
-			case 25: s = "\"else\" expected"; break;
-			case 26: s = "\"{\" expected"; break;
-			case 27: s = "\"=\" expected"; break;
-			case 28: s = "\";\" expected"; break;
-			case 29: s = "\"}\" expected"; break;
-			case 30: s = "\"[\" expected"; break;
-			case 31: s = "\"]\" expected"; break;
-			case 32: s = "\"match\" expected"; break;
-			case 33: s = "\"with\" expected"; break;
-			case 34: s = "\"empty\" expected"; break;
-			case 35: s = "\"External(\" expected"; break;
-			case 36: s = "\"Table(\" expected"; break;
-			case 37: s = "\",\" expected"; break;
-			case 38: s = "\"BigNumber(\" expected"; break;
-			case 39: s = "\"true\" expected"; break;
-			case 40: s = "\"false\" expected"; break;
-			case 41: s = "\"NULL\" expected"; break;
-			case 42: s = "\"Project(\" expected"; break;
-			case 43: s = "\"Scan(\" expected"; break;
-			case 44: s = "\"Filter(\" expected"; break;
-			case 45: s = "\"GroupBy(\" expected"; break;
-			case 46: s = "\"SortBy(\" expected"; break;
-			case 47: s = "\"Join(\" expected"; break;
-			case 48: s = "\"LeftJoin(\" expected"; break;
-			case 49: s = "\"RightJoin(\" expected"; break;
-			case 50: s = "??? expected"; break;
-			case 51: s = "invalid Expression"; break;
-			case 52: s = "invalid Boolean"; break;
+			case 19: s = "\",\" expected"; break;
+			case 20: s = "\")\" expected"; break;
+			case 21: s = "\"fun\" expected"; break;
+			case 22: s = "\"#\" expected"; break;
+			case 23: s = "\":\" expected"; break;
+			case 24: s = "\"->\" expected"; break;
+			case 25: s = "\"any\" expected"; break;
+			case 26: s = "\"int\" expected"; break;
+			case 27: s = "\"big_int\" expected"; break;
+			case 28: s = "\"double\" expected"; break;
+			case 29: s = "\"bool\" expected"; break;
+			case 30: s = "\"string\" expected"; break;
+			case 31: s = "\"null\" expected"; break;
+			case 32: s = "\"list\" expected"; break;
+			case 33: s = "\"record\" expected"; break;
+			case 34: s = "\"if\" expected"; break;
+			case 35: s = "\"then\" expected"; break;
+			case 36: s = "\"else\" expected"; break;
+			case 37: s = "\"{\" expected"; break;
+			case 38: s = "\"=\" expected"; break;
+			case 39: s = "\";\" expected"; break;
+			case 40: s = "\"}\" expected"; break;
+			case 41: s = "\"[\" expected"; break;
+			case 42: s = "\"]\" expected"; break;
+			case 43: s = "\"match\" expected"; break;
+			case 44: s = "\"with\" expected"; break;
+			case 45: s = "\"empty\" expected"; break;
+			case 46: s = "\"External(\" expected"; break;
+			case 47: s = "\"Table(\" expected"; break;
+			case 48: s = "\"BigNumber(\" expected"; break;
+			case 49: s = "\"true\" expected"; break;
+			case 50: s = "\"false\" expected"; break;
+			case 51: s = "\"NULL\" expected"; break;
+			case 52: s = "\"%Project(\" expected"; break;
+			case 53: s = "\"%Scan(\" expected"; break;
+			case 54: s = "\"%Filter(\" expected"; break;
+			case 55: s = "\"%GroupBy(\" expected"; break;
+			case 56: s = "\"%SortBy(\" expected"; break;
+			case 57: s = "\"%Join(\" expected"; break;
+			case 58: s = "\"%LeftJoin(\" expected"; break;
+			case 59: s = "\"%RightJoin(\" expected"; break;
+			case 60: s = "??? expected"; break;
+			case 61: s = "invalid Expression"; break;
+			case 62: s = "invalid Boolean"; break;
+			case 63: s = "invalid ConstantType"; break;
 			default: s = "error " + n; break;
 		}
 		printMsg(line, col, s);
diff --git a/src/qir/parser/Scanner.java b/src/qir/parser/Scanner.java
index eb0c05280bc1ac92706afd5c72f684226adf8f1f..7b48bd38042324073f796df7da0a4d7685618587 100644
--- a/src/qir/parser/Scanner.java
+++ b/src/qir/parser/Scanner.java
@@ -253,8 +253,8 @@ class StartStates {
 public class Scanner {
 	static final char EOL = '\n';
 	static final int  eofSym = 0;
-	static final int maxT = 50;
-	static final int noSym = 50;
+	static final int maxT = 60;
+	static final int noSym = 60;
 
 
 	public Buffer buffer; // scanner buffer
@@ -281,57 +281,57 @@ public class Scanner {
 		literals = new HashMap<>();
 		for (int i = 65; i <= 65; ++i) start.set(i, 1);
 		for (int i = 67; i <= 68; ++i) start.set(i, 1);
-		for (int i = 72; i <= 73; ++i) start.set(i, 1);
-		for (int i = 75; i <= 75; ++i) start.set(i, 1);
-		for (int i = 77; i <= 79; ++i) start.set(i, 1);
-		for (int i = 81; i <= 81; ++i) start.set(i, 1);
+		for (int i = 70; i <= 83; ++i) start.set(i, 1);
 		for (int i = 85; i <= 90; ++i) start.set(i, 1);
 		for (int i = 97; i <= 122; ++i) start.set(i, 1);
 		for (int i = 49; i <= 57; ++i) start.set(i, 10);
 		start.set(48, 11); 
 		start.set(34, 2); 
-		start.set(45, 47); 
+		start.set(45, 96); 
 		start.set(124, 13); 
 		start.set(38, 15); 
-		start.set(61, 48); 
-		start.set(60, 49); 
+		start.set(61, 97); 
+		start.set(60, 98); 
 		start.set(43, 19); 
 		start.set(42, 20); 
 		start.set(47, 21); 
-		start.set(37, 22); 
-		start.set(33, 23); 
-		start.set(64, 24); 
-		start.set(46, 25); 
-		start.set(40, 26); 
+		start.set(37, 99); 
+		start.set(33, 22); 
+		start.set(64, 23); 
+		start.set(46, 24); 
+		start.set(40, 25); 
+		start.set(44, 26); 
 		start.set(41, 27); 
-		start.set(58, 28); 
-		start.set(123, 30); 
-		start.set(59, 31); 
-		start.set(125, 32); 
-		start.set(91, 33); 
-		start.set(93, 34); 
-		start.set(69, 50); 
-		start.set(84, 51); 
-		start.set(44, 37); 
-		start.set(66, 52); 
-		start.set(80, 53); 
-		start.set(83, 54); 
-		start.set(70, 55); 
-		start.set(71, 56); 
-		start.set(74, 57); 
-		start.set(76, 58); 
-		start.set(82, 59); 
+		start.set(35, 28); 
+		start.set(58, 29); 
+		start.set(123, 31); 
+		start.set(59, 32); 
+		start.set(125, 33); 
+		start.set(91, 34); 
+		start.set(93, 35); 
+		start.set(69, 100); 
+		start.set(84, 101); 
+		start.set(66, 102); 
 		start.set(Buffer.EOF, -1);
-		literals.put("fun", new Integer(20));
-		literals.put("if", new Integer(23));
-		literals.put("then", new Integer(24));
-		literals.put("else", new Integer(25));
-		literals.put("match", new Integer(32));
-		literals.put("with", new Integer(33));
-		literals.put("empty", new Integer(34));
-		literals.put("true", new Integer(39));
-		literals.put("false", new Integer(40));
-		literals.put("NULL", new Integer(41));
+		literals.put("fun", new Integer(21));
+		literals.put("any", new Integer(25));
+		literals.put("int", new Integer(26));
+		literals.put("big_int", new Integer(27));
+		literals.put("double", new Integer(28));
+		literals.put("bool", new Integer(29));
+		literals.put("string", new Integer(30));
+		literals.put("null", new Integer(31));
+		literals.put("list", new Integer(32));
+		literals.put("record", new Integer(33));
+		literals.put("if", new Integer(34));
+		literals.put("then", new Integer(35));
+		literals.put("else", new Integer(36));
+		literals.put("match", new Integer(43));
+		literals.put("with", new Integer(44));
+		literals.put("empty", new Integer(45));
+		literals.put("true", new Integer(49));
+		literals.put("false", new Integer(50));
+		literals.put("NULL", new Integer(51));
 
 	}
 	
@@ -531,429 +531,339 @@ public class Scanner {
 				case 21:
 					{t.kind = 13; break loop;}
 				case 22:
-					{t.kind = 14; break loop;}
-				case 23:
 					{t.kind = 15; break loop;}
-				case 24:
+				case 23:
 					{t.kind = 16; break loop;}
-				case 25:
+				case 24:
 					{t.kind = 17; break loop;}
-				case 26:
+				case 25:
 					{t.kind = 18; break loop;}
-				case 27:
+				case 26:
 					{t.kind = 19; break loop;}
+				case 27:
+					{t.kind = 20; break loop;}
 				case 28:
-					{t.kind = 21; break loop;}
-				case 29:
 					{t.kind = 22; break loop;}
+				case 29:
+					{t.kind = 23; break loop;}
 				case 30:
-					{t.kind = 26; break loop;}
+					{t.kind = 24; break loop;}
 				case 31:
-					{t.kind = 28; break loop;}
+					{t.kind = 37; break loop;}
 				case 32:
-					{t.kind = 29; break loop;}
+					{t.kind = 39; break loop;}
 				case 33:
-					{t.kind = 30; break loop;}
+					{t.kind = 40; break loop;}
 				case 34:
-					{t.kind = 31; break loop;}
+					{t.kind = 41; break loop;}
 				case 35:
-					{t.kind = 35; break loop;}
+					{t.kind = 42; break loop;}
 				case 36:
-					{t.kind = 36; break loop;}
+					{t.kind = 46; break loop;}
 				case 37:
-					{t.kind = 37; break loop;}
+					{t.kind = 47; break loop;}
 				case 38:
-					{t.kind = 38; break loop;}
+					{t.kind = 48; break loop;}
 				case 39:
-					{t.kind = 42; break loop;}
+					if (ch == 'r') {AddCh(); state = 40; break;}
+					else {state = 0; break;}
 				case 40:
-					{t.kind = 43; break loop;}
+					if (ch == 'o') {AddCh(); state = 41; break;}
+					else {state = 0; break;}
 				case 41:
-					{t.kind = 44; break loop;}
+					if (ch == 'j') {AddCh(); state = 42; break;}
+					else {state = 0; break;}
 				case 42:
-					{t.kind = 45; break loop;}
+					if (ch == 'e') {AddCh(); state = 43; break;}
+					else {state = 0; break;}
 				case 43:
-					{t.kind = 46; break loop;}
+					if (ch == 'c') {AddCh(); state = 44; break;}
+					else {state = 0; break;}
 				case 44:
-					{t.kind = 47; break loop;}
+					if (ch == 't') {AddCh(); state = 45; break;}
+					else {state = 0; break;}
 				case 45:
-					{t.kind = 48; break loop;}
+					if (ch == '(') {AddCh(); state = 46; break;}
+					else {state = 0; break;}
 				case 46:
-					{t.kind = 49; break loop;}
+					{t.kind = 52; break loop;}
 				case 47:
-					recEnd = pos; recKind = 11;
-					if (ch >= '1' && ch <= '9') {AddCh(); state = 12; break;}
-					else if (ch == '0') {AddCh(); state = 7; break;}
-					else if (ch == '>') {AddCh(); state = 29; break;}
-					else {t.kind = 11; break loop;}
+					if (ch == 'a') {AddCh(); state = 48; break;}
+					else {state = 0; break;}
 				case 48:
-					recEnd = pos; recKind = 27;
-					if (ch == '=') {AddCh(); state = 17; break;}
-					else {t.kind = 27; break loop;}
+					if (ch == 'n') {AddCh(); state = 49; break;}
+					else {state = 0; break;}
 				case 49:
-					recEnd = pos; recKind = 8;
-					if (ch == '=') {AddCh(); state = 18; break;}
-					else {t.kind = 8; break loop;}
+					if (ch == '(') {AddCh(); state = 50; break;}
+					else {state = 0; break;}
 				case 50:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'w' || ch >= 'y' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'x') {AddCh(); state = 60; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					{t.kind = 53; break loop;}
 				case 51:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'b' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'a') {AddCh(); state = 61; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					if (ch == 'i') {AddCh(); state = 52; break;}
+					else {state = 0; break;}
 				case 52:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'h' || ch >= 'j' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'i') {AddCh(); state = 62; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					if (ch == 'l') {AddCh(); state = 53; break;}
+					else {state = 0; break;}
 				case 53:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'q' || ch >= 's' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'r') {AddCh(); state = 63; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					if (ch == 't') {AddCh(); state = 54; break;}
+					else {state = 0; break;}
 				case 54:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'b' || ch >= 'd' && ch <= 'n' || ch >= 'p' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'c') {AddCh(); state = 64; break;}
-					else if (ch == 'o') {AddCh(); state = 65; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					if (ch == 'e') {AddCh(); state = 55; break;}
+					else {state = 0; break;}
 				case 55:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'h' || ch >= 'j' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'i') {AddCh(); state = 66; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					if (ch == 'r') {AddCh(); state = 56; break;}
+					else {state = 0; break;}
 				case 56:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'q' || ch >= 's' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'r') {AddCh(); state = 67; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					if (ch == '(') {AddCh(); state = 57; break;}
+					else {state = 0; break;}
 				case 57:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'n' || ch >= 'p' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'o') {AddCh(); state = 68; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					{t.kind = 54; break loop;}
 				case 58:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'd' || ch >= 'f' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'e') {AddCh(); state = 69; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					if (ch == 'r') {AddCh(); state = 59; break;}
+					else {state = 0; break;}
 				case 59:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'h' || ch >= 'j' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'i') {AddCh(); state = 70; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					if (ch == 'o') {AddCh(); state = 60; break;}
+					else {state = 0; break;}
 				case 60:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 's' || ch >= 'u' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 't') {AddCh(); state = 71; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					if (ch == 'u') {AddCh(); state = 61; break;}
+					else {state = 0; break;}
 				case 61:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch == 'a' || ch >= 'c' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'b') {AddCh(); state = 72; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					if (ch == 'p') {AddCh(); state = 62; break;}
+					else {state = 0; break;}
 				case 62:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'f' || ch >= 'h' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'g') {AddCh(); state = 73; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					if (ch == 'B') {AddCh(); state = 63; break;}
+					else {state = 0; break;}
 				case 63:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'n' || ch >= 'p' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'o') {AddCh(); state = 74; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					if (ch == 'y') {AddCh(); state = 64; break;}
+					else {state = 0; break;}
 				case 64:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'b' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'a') {AddCh(); state = 75; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					if (ch == '(') {AddCh(); state = 65; break;}
+					else {state = 0; break;}
 				case 65:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'q' || ch >= 's' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'r') {AddCh(); state = 76; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					{t.kind = 55; break loop;}
 				case 66:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'k' || ch >= 'm' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'l') {AddCh(); state = 77; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					if (ch == 'r') {AddCh(); state = 67; break;}
+					else {state = 0; break;}
 				case 67:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'n' || ch >= 'p' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'o') {AddCh(); state = 78; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					if (ch == 't') {AddCh(); state = 68; break;}
+					else {state = 0; break;}
 				case 68:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'h' || ch >= 'j' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'i') {AddCh(); state = 79; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					if (ch == 'B') {AddCh(); state = 69; break;}
+					else {state = 0; break;}
 				case 69:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'e' || ch >= 'g' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'f') {AddCh(); state = 80; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					if (ch == 'y') {AddCh(); state = 70; break;}
+					else {state = 0; break;}
 				case 70:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'f' || ch >= 'h' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'g') {AddCh(); state = 81; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					if (ch == '(') {AddCh(); state = 71; break;}
+					else {state = 0; break;}
 				case 71:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'd' || ch >= 'f' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'e') {AddCh(); state = 82; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					{t.kind = 56; break loop;}
 				case 72:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'k' || ch >= 'm' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'l') {AddCh(); state = 83; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					if (ch == 'o') {AddCh(); state = 73; break;}
+					else {state = 0; break;}
 				case 73:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'M' || ch >= 'O' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'N') {AddCh(); state = 84; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					if (ch == 'i') {AddCh(); state = 74; break;}
+					else {state = 0; break;}
 				case 74:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'i' || ch >= 'k' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'j') {AddCh(); state = 85; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					if (ch == 'n') {AddCh(); state = 75; break;}
+					else {state = 0; break;}
 				case 75:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'm' || ch >= 'o' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'n') {AddCh(); state = 86; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					if (ch == '(') {AddCh(); state = 76; break;}
+					else {state = 0; break;}
 				case 76:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 's' || ch >= 'u' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 't') {AddCh(); state = 87; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					{t.kind = 57; break loop;}
 				case 77:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 's' || ch >= 'u' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 't') {AddCh(); state = 88; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					if (ch == 'e') {AddCh(); state = 78; break;}
+					else {state = 0; break;}
 				case 78:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 't' || ch >= 'v' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'u') {AddCh(); state = 89; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					if (ch == 'f') {AddCh(); state = 79; break;}
+					else {state = 0; break;}
 				case 79:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'm' || ch >= 'o' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'n') {AddCh(); state = 90; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					if (ch == 't') {AddCh(); state = 80; break;}
+					else {state = 0; break;}
 				case 80:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 's' || ch >= 'u' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 't') {AddCh(); state = 91; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					if (ch == 'J') {AddCh(); state = 81; break;}
+					else {state = 0; break;}
 				case 81:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'g' || ch >= 'i' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'h') {AddCh(); state = 92; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					if (ch == 'o') {AddCh(); state = 82; break;}
+					else {state = 0; break;}
 				case 82:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'q' || ch >= 's' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'r') {AddCh(); state = 93; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					if (ch == 'i') {AddCh(); state = 83; break;}
+					else {state = 0; break;}
 				case 83:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'd' || ch >= 'f' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'e') {AddCh(); state = 94; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					if (ch == 'n') {AddCh(); state = 84; break;}
+					else {state = 0; break;}
 				case 84:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 't' || ch >= 'v' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'u') {AddCh(); state = 95; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					if (ch == '(') {AddCh(); state = 85; break;}
+					else {state = 0; break;}
 				case 85:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'd' || ch >= 'f' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'e') {AddCh(); state = 96; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					{t.kind = 58; break loop;}
 				case 86:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == '(') {AddCh(); state = 40; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					if (ch == 'i') {AddCh(); state = 87; break;}
+					else {state = 0; break;}
 				case 87:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch == 'A' || ch >= 'C' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'B') {AddCh(); state = 97; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					if (ch == 'g') {AddCh(); state = 88; break;}
+					else {state = 0; break;}
 				case 88:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'd' || ch >= 'f' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'e') {AddCh(); state = 98; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					if (ch == 'h') {AddCh(); state = 89; break;}
+					else {state = 0; break;}
 				case 89:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'o' || ch >= 'q' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'p') {AddCh(); state = 99; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					if (ch == 't') {AddCh(); state = 90; break;}
+					else {state = 0; break;}
 				case 90:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == '(') {AddCh(); state = 44; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					if (ch == 'J') {AddCh(); state = 91; break;}
+					else {state = 0; break;}
 				case 91:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'I' || ch >= 'K' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'J') {AddCh(); state = 100; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					if (ch == 'o') {AddCh(); state = 92; break;}
+					else {state = 0; break;}
 				case 92:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 's' || ch >= 'u' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 't') {AddCh(); state = 101; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					if (ch == 'i') {AddCh(); state = 93; break;}
+					else {state = 0; break;}
 				case 93:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'm' || ch >= 'o' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'n') {AddCh(); state = 102; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					if (ch == 'n') {AddCh(); state = 94; break;}
+					else {state = 0; break;}
 				case 94:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == '(') {AddCh(); state = 36; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					if (ch == '(') {AddCh(); state = 95; break;}
+					else {state = 0; break;}
 				case 95:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'l' || ch >= 'n' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'm') {AddCh(); state = 103; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					{t.kind = 59; break loop;}
 				case 96:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'b' || ch >= 'd' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'c') {AddCh(); state = 104; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					recEnd = pos; recKind = 11;
+					if (ch >= '1' && ch <= '9') {AddCh(); state = 12; break;}
+					else if (ch == '0') {AddCh(); state = 7; break;}
+					else if (ch == '>') {AddCh(); state = 30; break;}
+					else {t.kind = 11; break loop;}
 				case 97:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'x' || ch == 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'y') {AddCh(); state = 105; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					recEnd = pos; recKind = 38;
+					if (ch == '=') {AddCh(); state = 17; break;}
+					else {t.kind = 38; break loop;}
 				case 98:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'q' || ch >= 's' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'r') {AddCh(); state = 106; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					recEnd = pos; recKind = 8;
+					if (ch == '=') {AddCh(); state = 18; break;}
+					else {t.kind = 8; break loop;}
 				case 99:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch == 'A' || ch >= 'C' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'B') {AddCh(); state = 107; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					recEnd = pos; recKind = 14;
+					if (ch == 'P') {AddCh(); state = 39; break;}
+					else if (ch == 'S') {AddCh(); state = 103; break;}
+					else if (ch == 'F') {AddCh(); state = 51; break;}
+					else if (ch == 'G') {AddCh(); state = 58; break;}
+					else if (ch == 'J') {AddCh(); state = 72; break;}
+					else if (ch == 'L') {AddCh(); state = 77; break;}
+					else if (ch == 'R') {AddCh(); state = 86; break;}
+					else {t.kind = 14; break loop;}
 				case 100:
 					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'n' || ch >= 'p' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'o') {AddCh(); state = 108; break;}
+					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'w' || ch >= 'y' && ch <= 'z') {AddCh(); state = 1; break;}
+					else if (ch == 'x') {AddCh(); state = 104; break;}
 					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
 				case 101:
 					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'I' || ch >= 'K' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'J') {AddCh(); state = 109; break;}
+					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'b' && ch <= 'z') {AddCh(); state = 1; break;}
+					else if (ch == 'a') {AddCh(); state = 105; break;}
 					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
 				case 102:
 					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'b' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'a') {AddCh(); state = 110; break;}
+					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'h' || ch >= 'j' && ch <= 'z') {AddCh(); state = 1; break;}
+					else if (ch == 'i') {AddCh(); state = 106; break;}
 					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
 				case 103:
-					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch == 'a' || ch >= 'c' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'b') {AddCh(); state = 111; break;}
-					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+					if (ch == 'c') {AddCh(); state = 47; break;}
+					else if (ch == 'o') {AddCh(); state = 66; break;}
+					else {state = 0; break;}
 				case 104:
 					recEnd = pos; recKind = 1;
 					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 's' || ch >= 'u' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 't') {AddCh(); state = 112; break;}
+					else if (ch == 't') {AddCh(); state = 107; break;}
 					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
 				case 105:
 					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == '(') {AddCh(); state = 43; break;}
+					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch == 'a' || ch >= 'c' && ch <= 'z') {AddCh(); state = 1; break;}
+					else if (ch == 'b') {AddCh(); state = 108; break;}
 					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
 				case 106:
 					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == '(') {AddCh(); state = 41; break;}
+					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'f' || ch >= 'h' && ch <= 'z') {AddCh(); state = 1; break;}
+					else if (ch == 'g') {AddCh(); state = 109; break;}
 					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
 				case 107:
 					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'x' || ch == 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'y') {AddCh(); state = 113; break;}
+					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'd' || ch >= 'f' && ch <= 'z') {AddCh(); state = 1; break;}
+					else if (ch == 'e') {AddCh(); state = 110; break;}
 					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
 				case 108:
 					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'h' || ch >= 'j' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'i') {AddCh(); state = 114; break;}
+					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'k' || ch >= 'm' && ch <= 'z') {AddCh(); state = 1; break;}
+					else if (ch == 'l') {AddCh(); state = 111; break;}
 					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
 				case 109:
 					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'n' || ch >= 'p' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'o') {AddCh(); state = 115; break;}
+					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'M' || ch >= 'O' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'z') {AddCh(); state = 1; break;}
+					else if (ch == 'N') {AddCh(); state = 112; break;}
 					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
 				case 110:
 					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'k' || ch >= 'm' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'l') {AddCh(); state = 116; break;}
+					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'q' || ch >= 's' && ch <= 'z') {AddCh(); state = 1; break;}
+					else if (ch == 'r') {AddCh(); state = 113; break;}
 					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
 				case 111:
 					recEnd = pos; recKind = 1;
 					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'd' || ch >= 'f' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'e') {AddCh(); state = 117; break;}
+					else if (ch == 'e') {AddCh(); state = 114; break;}
 					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
 				case 112:
 					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == '(') {AddCh(); state = 39; break;}
+					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 't' || ch >= 'v' && ch <= 'z') {AddCh(); state = 1; break;}
+					else if (ch == 'u') {AddCh(); state = 115; break;}
 					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
 				case 113:
 					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == '(') {AddCh(); state = 42; break;}
+					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'm' || ch >= 'o' && ch <= 'z') {AddCh(); state = 1; break;}
+					else if (ch == 'n') {AddCh(); state = 116; break;}
 					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
 				case 114:
 					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'm' || ch >= 'o' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'n') {AddCh(); state = 118; break;}
+					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'z') {AddCh(); state = 1; break;}
+					else if (ch == '(') {AddCh(); state = 37; break;}
 					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
 				case 115:
 					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'h' || ch >= 'j' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'i') {AddCh(); state = 119; break;}
+					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'l' || ch >= 'n' && ch <= 'z') {AddCh(); state = 1; break;}
+					else if (ch == 'm') {AddCh(); state = 117; break;}
 					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
 				case 116:
 					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == '(') {AddCh(); state = 35; break;}
+					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'b' && ch <= 'z') {AddCh(); state = 1; break;}
+					else if (ch == 'a') {AddCh(); state = 118; break;}
 					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
 				case 117:
 					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'q' || ch >= 's' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'r') {AddCh(); state = 120; break;}
+					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch == 'a' || ch >= 'c' && ch <= 'z') {AddCh(); state = 1; break;}
+					else if (ch == 'b') {AddCh(); state = 119; break;}
 					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
 				case 118:
 					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == '(') {AddCh(); state = 45; break;}
+					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'k' || ch >= 'm' && ch <= 'z') {AddCh(); state = 1; break;}
+					else if (ch == 'l') {AddCh(); state = 120; break;}
 					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
 				case 119:
 					recEnd = pos; recKind = 1;
-					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'm' || ch >= 'o' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == 'n') {AddCh(); state = 121; break;}
+					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'd' || ch >= 'f' && ch <= 'z') {AddCh(); state = 1; break;}
+					else if (ch == 'e') {AddCh(); state = 121; break;}
 					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
 				case 120:
 					recEnd = pos; recKind = 1;
 					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == '(') {AddCh(); state = 38; break;}
+					else if (ch == '(') {AddCh(); state = 36; break;}
 					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
 				case 121:
+					recEnd = pos; recKind = 1;
+					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'q' || ch >= 's' && ch <= 'z') {AddCh(); state = 1; break;}
+					else if (ch == 'r') {AddCh(); state = 122; break;}
+					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
+				case 122:
 					recEnd = pos; recKind = 1;
 					if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'z') {AddCh(); state = 1; break;}
-					else if (ch == '(') {AddCh(); state = 46; break;}
+					else if (ch == '(') {AddCh(); state = 38; break;}
 					else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;}
 
 				default:
diff --git a/src/qir/parser/qir.atg b/src/qir/parser/qir.atg
index 813cbefcfee4a12f40a072ec250a2dad894b9c45..6d7b68dd297cb2bae4a7bc99874996936611dd35 100644
--- a/src/qir/parser/qir.atg
+++ b/src/qir/parser/qir.atg
@@ -126,6 +126,15 @@ Variable<out QIRVariable result>											(. res = result; .)
 | Double<out QIRDouble result>												(. res = result; .)
 | Null<out QIRNull result>													(. res = result; .)
 | String<out QIRString result>												(. res = result; .)
+| '%'																		(. final Token srcToken = t;
+																			   final List<QIRNode> args = new ArrayList<>(); .)
+identifier																	(. final Token opName = t; .)
+'('
+[
+QIR<out QIRNode arg>														(. args.add(arg); .)
+{
+',' QIR<out arg>															(. args.add(arg); .)
+} ]																			(. res = new ExternalOperator(srcFromToken(srcToken), opName.val, args); .)
 | Project<out QIRProject result>											(. res = result; .)
 | Scan<out QIRScan result>													(. res = result; .)
 | Filter<out QIRFilter result>												(. res = result; .)
@@ -143,9 +152,33 @@ identifier																	(. res = new QIRVariable(srcFromToken(t), t.val); .)
 
 Lambda<out QIRLambda res> =
 "fun"																		(. final Token srcToken = t;
-																			   Token funName = null; .)
-[ ":" identifier															(. funName = t; .)
-] Variable<out QIRVariable var> "->" QIR<out QIRNode body>					(. res = new QIRLambda(srcFromToken(srcToken), funName == null ? null : funName.val, var, body, new FrameDescriptor()); .)
+																			   Token funName = null;
+																			   QIRType type = new FunctionType(Arrays.asList(QIRConstantType.ANY, QIRConstantType.ANY)); .)
+[ "#" identifier															(. funName = t; .)
+] [ ":" Type<out type> ] Variable<out QIRVariable var> "->"
+QIR<out QIRNode body>														(. res = new QIRLambda(srcFromToken(srcToken), funName == null ? null : funName.val, type, var, body, new FrameDescriptor()); .)
+.
+
+Type<out QIRType res> =
+ConstantType<out QIRType first>												(. final List<QIRType> types = new ArrayList<>();
+																			   types.add(first);
+																			   QIRType type; .)
+{ "->" ConstantType<out type>												(. types.add(type); .)
+}																			(. res = types.size() == 1 ? first : new FunctionType(types); .)
+.
+
+ConstantType<out QIRType res> =												(. res = null; .)
+(
+"any"																		(. res = QIRConstantType.ANY; .)
+| "int"																		(. res = QIRConstantType.NUMBER; .)
+| "big_int"																	(. res = QIRConstantType.BIG_NUMBER; .)
+| "double"																	(. res = QIRConstantType.DOUBLE; .)
+| "bool"																	(. res = QIRConstantType.BOOLEAN; .)
+| "string"																	(. res = QIRConstantType.STRING; .)
+| "null"																	(. res = QIRConstantType.NULL; .)
+| "list"																	(. res = QIRConstantType.LIST; .)
+| "record"																	(. res = QIRConstantType.RECORD; .)
+)
 .
 
 Ifexpr<out QIRIf res> =
@@ -226,45 +259,45 @@ stringLiteral																(. res = new QIRString(srcFromToken(t), t.val); .)
 .
 
 Project<out QIRProject res> =
-"Project("																	(. final Token srcToken = t; .)
+"%Project("																	(. final Token srcToken = t; .)
 QIR<out QIRNode formatter> "," QIR<out QIRNode child> ')'					(. res = new QIRProject(srcFromToken(srcToken), formatter, child); .)
 .
 
 Scan<out QIRScan res> =
-"Scan("																		(. final Token srcToken = t; .)
+"%Scan("																	(. final Token srcToken = t; .)
 QIR<out QIRNode child> ')'													(. res = new QIRScan(srcFromToken(srcToken), child); .)
 .
 
 Filter<out QIRFilter res> =
-"Filter("																	(. final Token srcToken = t; .)
+"%Filter("																	(. final Token srcToken = t; .)
 QIR<out QIRNode filter> "," QIR<out QIRNode child> ')'						(. res = new QIRFilter(srcFromToken(srcToken), filter, child); .)
 .
 
 Groupby<out QIRGroupBy res> =
-"GroupBy("																	(. final Token srcToken = t; .)
+"%GroupBy("																	(. final Token srcToken = t; .)
 QIR<out QIRNode group> "," QIR<out QIRNode child> ')'						(. res = new QIRGroupBy(srcFromToken(srcToken), group, child); .)
 .
 
 Sortby<out QIRSortBy res> =
-"SortBy("																	(. final Token srcToken = t; .)
+"%SortBy("																	(. final Token srcToken = t; .)
 QIR<out QIRNode order> "," QIR<out QIRNode isAscending>
 "," QIR<out QIRNode child> ')'												(. res = new QIRSortBy(srcFromToken(srcToken), order, isAscending, child); .)
 .
 
 Join<out QIRJoin res> =
-"Join("																		(. final Token srcToken = t; .)
+"%Join("																	(. final Token srcToken = t; .)
 QIR<out QIRNode filter> "," QIR<out QIRNode left> ","
 QIR<out QIRNode right> ')'													(. res = new QIRJoin(srcFromToken(srcToken), filter, left, right); .)
 .
 
 Leftjoin<out QIRLeftJoin res> =
-"LeftJoin("																	(. final Token srcToken = t; .)
+"%LeftJoin("																(. final Token srcToken = t; .)
 QIR<out QIRNode filter> "," QIR<out QIRNode left> ","
 QIR<out QIRNode right> ')'													(. res = new QIRLeftJoin(srcFromToken(srcToken), filter, left, right); .)
 .
 
 Rightjoin<out QIRRightJoin res> =
-"RightJoin("																(. final Token srcToken = t; .)
+"%RightJoin("																(. final Token srcToken = t; .)
 QIR<out QIRNode filter> "," QIR<out QIRNode left> ","
 QIR<out QIRNode right> ')'													(. res = new QIRRightJoin(srcFromToken(srcToken), filter, left, right); .)
 .
diff --git a/src/qir/parser/test.qir b/src/qir/parser/test.qir
index 51446cb9bd51e413c8b95cd4180297a8d9feeca4..a52991ef0ffcbbd2f8c63a56b01a84fdbd6e1028 100644
--- a/src/qir/parser/test.qir
+++ b/src/qir/parser/test.qir
@@ -1 +1 @@
-(fun x -> x) @ [ { x = 2; y = 3 + 4 }; "toto" ]
+(fun : any -> any x -> x) @ [ { x = 2; y = 3 + 4 }; "toto"; (fun : int -> int x -> x + 2) ]
diff --git a/src/qir/types/FunctionType.java b/src/qir/types/FunctionType.java
new file mode 100644
index 0000000000000000000000000000000000000000..677830c5e80ada6bdd1d08a09fa569b9a85c0682
--- /dev/null
+++ b/src/qir/types/FunctionType.java
@@ -0,0 +1,22 @@
+package qir.types;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public final class FunctionType implements QIRType {
+    private final List<QIRType> types;
+
+    public FunctionType(final List<QIRType> types) {
+        this.types = types;
+    }
+
+    public final List<QIRType> getDomain() {
+        return types.size() > 0 ? types.subList(0, types.size() - 1) : new ArrayList<>();
+    }
+
+    @Override
+    public final String toString() {
+        return types.stream().map(Object::toString).collect(Collectors.joining(" -> "));
+    }
+}
diff --git a/src/qir/types/QIRConstantType.java b/src/qir/types/QIRConstantType.java
new file mode 100644
index 0000000000000000000000000000000000000000..9c986d4e7673ec10ad3c60a92645c918237d9abd
--- /dev/null
+++ b/src/qir/types/QIRConstantType.java
@@ -0,0 +1,13 @@
+package qir.types;
+
+public enum QIRConstantType implements QIRType {
+    ANY,
+    NUMBER,
+    BIG_NUMBER,
+    DOUBLE,
+    BOOLEAN,
+    STRING,
+    NULL,
+    LIST,
+    RECORD
+}
diff --git a/src/qir/types/QIRType.java b/src/qir/types/QIRType.java
new file mode 100644
index 0000000000000000000000000000000000000000..6f004382fc74cca4cfe5db2494a0ec1692a71755
--- /dev/null
+++ b/src/qir/types/QIRType.java
@@ -0,0 +1,4 @@
+package qir.types;
+
+public interface QIRType {
+}