Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | 123x 123x 123x 378x 123x 71x 1x 70x 1x 69x 123x 230x 123x 307x 123x 137x 137x 123x 28x 123x 44x 44x 34x 10x 9x 15x 10x 123x 39x 6x 33x 123x 26x | import { assertUnreachable } from "shared/lib/helpers/assert";
import {
Associativity,
FunctionSymbol,
functionSymbols,
OperatorSymbol,
operatorSymbols,
functionArgsLen,
Token,
} from "./types";
export const isNumeric = (str: string) => {
return (
str.toLowerCase() === "true" ||
str.toLowerCase() === "false" ||
(!isNaN(Number(str)) && isFinite(Number(str)))
);
};
export const toNumber = (str: string) => {
if (str.toLowerCase() === "true") {
return 1;
}
if (str.toLowerCase() === "false") {
return 0;
}
return Number(str);
};
export const isOperatorSymbol = (x: string): x is OperatorSymbol => {
return (operatorSymbols as unknown as string[]).indexOf(x) > -1;
};
export const isFunctionSymbol = (x: string): x is FunctionSymbol => {
return (functionSymbols as unknown as string[]).indexOf(x) > -1;
};
export const isVariable = (token: string): boolean => {
const variable = String.raw`\$([VLT][0-9]|[a-z0-9-]{36}|[0-9]+)\$`;
return !!new RegExp(`^${variable}$`, "i").exec(token);
};
export const isConstant = (token: string): boolean => {
return !!/^@([a-z0-9-]{36}|engine::[^@]+)@$/i.exec(token);
};
export const getPrecedence = (token: Token): number => {
Iif (token.type === "FUN") {
return 4;
}
if (token.type === "OP") {
switch (token.operator) {
case "~":
case "!":
case "neg":
return 14;
case "*":
case "/":
case "%":
return 12;
case "+":
case "-":
return 11;
case "<<":
case ">>":
return 10;
case "<":
case ">":
case ">=":
case "<=":
return 9;
case "==":
case "!=":
return 8;
case "&":
return 7;
case "^":
return 6;
case "|":
return 5;
case "&&":
return 4;
case "||":
return 3;
}
/* istanbul ignore next */
assertUnreachable(token.operator);
}
return -1;
};
export const getAssociativity = (token: Token): Associativity => {
if (
token.type === "OP" &&
(token.operator === "!" || token.operator === "~")
) {
return Associativity.Right;
}
return Associativity.Left;
};
export const getArgsLen = (symbol: FunctionSymbol) => {
return functionArgsLen[symbol];
};
|