123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- import { Types } from './../ast/types';
- import { Operators } from './../ast/operators';
- function buildInfixAddTable () {
- const table = [[], [], [], []];
- table[Types.INTEGER.ord][Types.INTEGER.ord] = Types.INTEGER;
- table[Types.INTEGER.ord][Types.REAL.ord] = Types.REAL;
- table[Types.INTEGER.ord][Types.STRING.ord] = Types.STRING;
- table[Types.REAL.ord][Types.INTEGER.ord] = Types.REAL;
- table[Types.REAL.ord][Types.REAL.ord] = Types.REAL;
- table[Types.REAL.ord][Types.STRING.ord] = Types.STRING;
- table[Types.STRING.ord][Types.INTEGER.ord] = Types.STRING;
- table[Types.STRING.ord][Types.REAL.ord] = Types.STRING;
- table[Types.STRING.ord][Types.STRING.ord] = Types.STRING;
- table[Types.STRING.ord][Types.BOOLEAN.ord] = Types.STRING;
- return table;
- }
- function buildInfixMultiDivSubTable () {
- const table = [[], [], [], []];
- table[Types.INTEGER.ord][Types.INTEGER.ord] = Types.INTEGER;
- table[Types.INTEGER.ord][Types.REAL.ord] = Types.REAL;
- table[Types.REAL.ord][Types.INTEGER.ord] = Types.REAL;
- table[Types.REAL.ord][Types.REAL.ord] = Types.REAL;
- return table;
- }
- function buildInfixEqualityInequalityTable () {
- const table = [[], [], [], []];
- table[Types.INTEGER.ord][Types.INTEGER.ord] = Types.BOOLEAN;
- table[Types.REAL.ord][Types.REAL.ord] = Types.BOOLEAN;
- table[Types.BOOLEAN.ord][Types.BOOLEAN.ord] = Types.BOOLEAN;
- table[Types.STRING.ord][Types.STRING.ord] = Types.BOOLEAN;
- return table;
- }
- function buildInfixRelationalTable () {
- const table = [[], [], [], []];
- table[Types.INTEGER.ord][Types.INTEGER.ord] = Types.BOOLEAN;
- table[Types.REAL.ord][Types.REAL.ord] = Types.BOOLEAN;
- table[Types.STRING.ord][Types.STRING.ord] = Types.BOOLEAN;
- return table;
- }
- function buildInfixAndOrTable () {
- const table = [[], [], [], []];
- table[Types.BOOLEAN.ord][Types.BOOLEAN.ord] = Types.BOOLEAN;
- return table;
- }
- function buildInfixModTable () {
- const table = [[], [], [], []];
- table[Types.INTEGER.ord][Types.INTEGER.ord] = Types.INTEGER;
- return table;
- }
- function buildUnarySumSubList () {
- const list = [];
- list[Types.INTEGER.ord] = Types.INTEGER;
- list[Types.REAL.ord] = Types.REAL;
- return list;
- }
- function buildUnaryNegList () {
- const list = [];
- list[Types.BOOLEAN.ord] = Types.BOOLEAN;
- return list;
- }
- function buildInfixCompatibilityTable () {
- const compatibilityMap = new WeakMap();
- compatibilityMap.set(Operators.ADD, buildInfixAddTable());
- compatibilityMap.set(Operators.SUB, buildInfixMultiDivSubTable());
- compatibilityMap.set(Operators.MULT, buildInfixMultiDivSubTable());
- compatibilityMap.set(Operators.DIV, buildInfixMultiDivSubTable());
- compatibilityMap.set(Operators.EQ, buildInfixEqualityInequalityTable());
- compatibilityMap.set(Operators.NEQ, buildInfixEqualityInequalityTable());
- compatibilityMap.set(Operators.GE, buildInfixRelationalTable());
- compatibilityMap.set(Operators.GT, buildInfixRelationalTable());
- compatibilityMap.set(Operators.LE, buildInfixRelationalTable());
- compatibilityMap.set(Operators.LT, buildInfixRelationalTable());
- compatibilityMap.set(Operators.OR, buildInfixAndOrTable());
- compatibilityMap.set(Operators.AND, buildInfixAndOrTable());
- compatibilityMap.set(Operators.MOD, buildInfixModTable());
- return compatibilityMap;
- }
- function buildUnaryCompatibilityTable () {
- const compatibilityMap = new WeakMap();
- compatibilityMap.set(Operators.ADD, buildUnarySumSubList());
- compatibilityMap.set(Operators.SUB, buildUnarySumSubList());
- compatibilityMap.set(Operators.NOT, buildUnaryNegList());
- return compatibilityMap;
- }
- const infixMap = buildInfixCompatibilityTable();
- const unaryMap = buildUnaryCompatibilityTable();
- export function resultTypeAfterInfixOp (operator, leftExpressionType, rightExpressionType) {
- try {
- return infixMap.get(operator)[leftExpressionType.ord][rightExpressionType.ord];
- } catch (e) {
- if (e instanceof TypeError) {
- return Types.UNDEFINED;
- } else {
- throw e;
- }
- }
- }
- export function resultTypeAfterUnaryOp (operator, leftExpressionType) {
- try {
- return unaryMap.get(operator)[leftExpressionType.ord];
- } catch (e) {
- if (e instanceof TypeError) {
- return Types.UNDEFINED;
- } else {
- throw e;
- }
- }
- }
|