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 { +}