summaryrefslogtreecommitdiff
path: root/src/emscripten-optimizer/parser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/emscripten-optimizer/parser.cpp')
-rw-r--r--src/emscripten-optimizer/parser.cpp144
1 files changed, 144 insertions, 0 deletions
diff --git a/src/emscripten-optimizer/parser.cpp b/src/emscripten-optimizer/parser.cpp
new file mode 100644
index 000000000..06e455b0b
--- /dev/null
+++ b/src/emscripten-optimizer/parser.cpp
@@ -0,0 +1,144 @@
+
+#include "parser.h"
+
+namespace cashew {
+
+// common strings
+
+IString TOPLEVEL("toplevel"),
+ DEFUN("defun"),
+ BLOCK("block"),
+ STAT("stat"),
+ ASSIGN("assign"),
+ NAME("name"),
+ VAR("var"),
+ CONST("const"),
+ CONDITIONAL("conditional"),
+ BINARY("binary"),
+ RETURN("return"),
+ IF("if"),
+ ELSE("else"),
+ WHILE("while"),
+ DO("do"),
+ FOR("for"),
+ SEQ("seq"),
+ SUB("sub"),
+ CALL("call"),
+ NUM("num"),
+ LABEL("label"),
+ BREAK("break"),
+ CONTINUE("continue"),
+ SWITCH("switch"),
+ STRING("string"),
+ INF("inf"),
+ NaN("nan"),
+ TEMP_RET0("tempRet0"),
+ UNARY_PREFIX("unary-prefix"),
+ UNARY_POSTFIX("unary-postfix"),
+ MATH_FROUND("Math_fround"),
+ SIMD_FLOAT32X4("SIMD_Float32x4"),
+ SIMD_FLOAT64X2("SIMD_Float64x2"),
+ SIMD_INT8X16("SIMD_Int8x16"),
+ SIMD_INT16X8("SIMD_Int16x8"),
+ SIMD_INT32X4("SIMD_Int32x4"),
+ PLUS("+"),
+ MINUS("-"),
+ OR("|"),
+ AND("&"),
+ XOR("^"),
+ L_NOT("!"),
+ B_NOT("~"),
+ LT("<"),
+ GE(">="),
+ LE("<="),
+ GT(">"),
+ EQ("=="),
+ NE("!="),
+ DIV("/"),
+ MOD("%"),
+ MUL("*"),
+ RSHIFT(">>"),
+ LSHIFT("<<"),
+ TRSHIFT(">>>"),
+ TEMP_DOUBLE_PTR("tempDoublePtr"),
+ HEAP8("HEAP8"),
+ HEAP16("HEAP16"),
+ HEAP32("HEAP32"),
+ HEAPF32("HEAPF32"),
+ HEAPU8("HEAPU8"),
+ HEAPU16("HEAPU16"),
+ HEAPU32("HEAPU32"),
+ HEAPF64("HEAPF64"),
+ F0("f0"),
+ EMPTY(""),
+ FUNCTION("function"),
+ OPEN_PAREN("("),
+ OPEN_BRACE("["),
+ OPEN_CURLY("{"),
+ CLOSE_CURLY("}"),
+ COMMA(","),
+ QUESTION("?"),
+ COLON(":"),
+ CASE("case"),
+ DEFAULT("default"),
+ DOT("dot"),
+ PERIOD("."),
+ NEW("new"),
+ ARRAY("array"),
+ OBJECT("object"),
+ THROW("throw"),
+ SET("=");
+
+IStringSet keywords("var const function if else do while for break continue return switch case default throw try catch finally true false null new");
+
+const char *OPERATOR_INITS = "+-*/%<>&^|~=!,?:.",
+ *SEPARATORS = "([;{}";
+
+int MAX_OPERATOR_SIZE = 3;
+
+std::vector<OperatorClass> operatorClasses;
+
+static std::vector<std::unordered_map<IString, int>> precedences; // op, type => prec
+
+struct Init {
+ Init() {
+ // operators, rtl, type
+ operatorClasses.push_back(OperatorClass(".", false, OperatorClass::Binary));
+ operatorClasses.push_back(OperatorClass("! ~ + -", true, OperatorClass::Prefix));
+ operatorClasses.push_back(OperatorClass("* / %", false, OperatorClass::Binary));
+ operatorClasses.push_back(OperatorClass("+ -", false, OperatorClass::Binary));
+ operatorClasses.push_back(OperatorClass("<< >> >>>", false, OperatorClass::Binary));
+ operatorClasses.push_back(OperatorClass("< <= > >=", false, OperatorClass::Binary));
+ operatorClasses.push_back(OperatorClass("== !=", false, OperatorClass::Binary));
+ operatorClasses.push_back(OperatorClass("&", false, OperatorClass::Binary));
+ operatorClasses.push_back(OperatorClass("^", false, OperatorClass::Binary));
+ operatorClasses.push_back(OperatorClass("|", false, OperatorClass::Binary));
+ operatorClasses.push_back(OperatorClass("? :", true, OperatorClass::Tertiary));
+ operatorClasses.push_back(OperatorClass("=", true, OperatorClass::Binary));
+ operatorClasses.push_back(OperatorClass(",", true, OperatorClass::Binary));
+
+ precedences.resize(OperatorClass::Tertiary + 1);
+
+ for (size_t prec = 0; prec < operatorClasses.size(); prec++) {
+ for (auto curr : operatorClasses[prec].ops) {
+ precedences[operatorClasses[prec].type][curr] = prec;
+ }
+ }
+ }
+};
+
+Init init;
+
+int OperatorClass::getPrecedence(Type type, IString op) {
+ return precedences[type][op];
+}
+
+bool OperatorClass::getRtl(int prec) {
+ return operatorClasses[prec].rtl;
+}
+
+bool isIdentInit(char x) { return (x >= 'a' && x <= 'z') || (x >= 'A' && x <= 'Z') || x == '_' || x == '$'; }
+bool isIdentPart(char x) { return isIdentInit(x) || (x >= '0' && x <= '9'); }
+
+} // namespace cashew
+