| /* |
| * Copyright 2015 WebAssembly Community Group participants |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| // Pure parsing. Calls methods on a Builder (template argument) to actually |
| // construct the AST |
| // |
| // XXX All parsing methods assume they take ownership of the input string. This |
| // lets them reuse parts of it. You will segfault if the input string cannot |
| // be reused and written to. |
| |
| #ifndef wasm_parser_h |
| #define wasm_parser_h |
| |
| #include <algorithm> |
| #include <cstdio> |
| #include <iostream> |
| #include <limits> |
| #include <vector> |
| |
| #include "support/istring.h" |
| #include "support/safe_integer.h" |
| |
| namespace cashew { |
| |
| using IString = wasm::IString; |
| |
| // IStringSet |
| |
| class IStringSet : public std::unordered_set<IString> { |
| std::vector<char> data; |
| |
| public: |
| IStringSet() = default; |
| IStringSet(const char* init) { // comma-delimited list |
| int size = strlen(init) + 1; |
| data.resize(size); |
| char* curr = &data[0]; |
| strncpy(curr, init, size); |
| while (1) { |
| char* end = strchr(curr, ' '); |
| if (end) { |
| *end = 0; |
| } |
| insert(curr); |
| if (!end) { |
| break; |
| } |
| curr = end + 1; |
| } |
| } |
| |
| bool has(const IString& str) { return count(str) > 0; } |
| }; |
| |
| class IOrderedStringSet : public std::set<IString> { |
| public: |
| bool has(const IString& str) { return count(str) > 0; } |
| }; |
| |
| // common strings |
| |
| extern IString TOPLEVEL; |
| extern IString DEFUN; |
| extern IString BLOCK; |
| extern IString VAR; |
| extern IString CONST; |
| extern IString CONDITIONAL; |
| extern IString BINARY; |
| extern IString RETURN; |
| extern IString IF; |
| extern IString ELSE; |
| extern IString WHILE; |
| extern IString DO; |
| extern IString FOR; |
| extern IString SEQ; |
| extern IString SUB; |
| extern IString CALL; |
| extern IString LABEL; |
| extern IString BREAK; |
| extern IString CONTINUE; |
| extern IString SWITCH; |
| extern IString STRING; |
| extern IString TRY; |
| extern IString INF; |
| extern IString NaN; |
| extern IString LLVM_CTTZ_I32; |
| extern IString UDIVMODDI4; |
| extern IString UNARY_PREFIX; |
| extern IString UNARY_POSTFIX; |
| extern IString MATH_FROUND; |
| extern IString MATH_CLZ32; |
| extern IString INT64; |
| extern IString INT64_CONST; |
| extern IString SIMD_FLOAT32X4; |
| extern IString SIMD_FLOAT64X2; |
| extern IString SIMD_INT8X16; |
| extern IString SIMD_INT16X8; |
| extern IString SIMD_INT32X4; |
| extern IString PLUS; |
| extern IString MINUS; |
| extern IString OR; |
| extern IString AND; |
| extern IString XOR; |
| extern IString L_NOT; |
| extern IString B_NOT; |
| extern IString LT; |
| extern IString GE; |
| extern IString LE; |
| extern IString GT; |
| extern IString EQ; |
| extern IString NE; |
| extern IString DIV; |
| extern IString MOD; |
| extern IString MUL; |
| extern IString RSHIFT; |
| extern IString LSHIFT; |
| extern IString TRSHIFT; |
| extern IString HEAP8; |
| extern IString HEAP16; |
| extern IString HEAP32; |
| extern IString HEAPF32; |
| extern IString HEAPU8; |
| extern IString HEAPU16; |
| extern IString HEAPU32; |
| extern IString HEAPF64; |
| extern IString F0; |
| extern IString EMPTY; |
| extern IString FUNCTION; |
| extern IString OPEN_PAREN; |
| extern IString OPEN_BRACE; |
| extern IString OPEN_CURLY; |
| extern IString CLOSE_CURLY; |
| extern IString COMMA; |
| extern IString QUESTION; |
| extern IString COLON; |
| extern IString CASE; |
| extern IString DEFAULT; |
| extern IString DOT; |
| extern IString PERIOD; |
| extern IString NEW; |
| extern IString ARRAY; |
| extern IString OBJECT; |
| extern IString THROW; |
| extern IString SET; |
| extern IString ATOMICS; |
| extern IString COMPARE_EXCHANGE; |
| extern IString LOAD; |
| extern IString STORE; |
| extern IString GETTER; |
| extern IString SETTER; |
| |
| extern const char *OPERATOR_INITS, *SEPARATORS; |
| |
| extern int MAX_OPERATOR_SIZE, LOWEST_PREC; |
| |
| struct OperatorClass { |
| enum Type { Binary = 0, Prefix = 1, Postfix = 2, Tertiary = 3 }; |
| |
| IStringSet ops; |
| bool rtl; |
| Type type; |
| |
| OperatorClass(const char* o, bool r, Type t) : ops(o), rtl(r), type(t) {} |
| |
| static int getPrecedence(Type type, IString op); |
| static bool getRtl(int prec); |
| }; |
| |
| extern std::vector<OperatorClass> operatorClasses; |
| |
| extern bool isIdentInit(char x); |
| extern bool isIdentPart(char x); |
| |
| } // namespace cashew |
| |
| #endif // wasm_parser_h |