summaryrefslogtreecommitdiff
path: root/src/wat-parser.h
diff options
context:
space:
mode:
authorThomas Lively <7121787+tlively@users.noreply.github.com>2022-06-10 12:30:09 -0700
committerGitHub <noreply@github.com>2022-06-10 12:30:09 -0700
commit093bf06e1115e84c4300eca91197dc31336ee3e5 (patch)
tree9016245be8af54c8e47bdb3c0aaa0ed6f263b3c0 /src/wat-parser.h
parent9fbfe0f200f716a6c9a045c6a3f2606b99af8dea (diff)
downloadbinaryen-093bf06e1115e84c4300eca91197dc31336ee3e5.tar.gz
binaryen-093bf06e1115e84c4300eca91197dc31336ee3e5.tar.bz2
binaryen-093bf06e1115e84c4300eca91197dc31336ee3e5.zip
[Parser] Begin parsing modules (#4716)
Implement the basic infrastructure for the full WAT parser with just enough detail to parse basic modules that contain only imported globals. Parsing functions correspond to elements of the grammar in the text specification and are templatized over context types that correspond to each phase of parsing. Errors are explicitly propagated via `Result<T>` and `MaybeResult<T>` types. Follow-on PRs will implement additional phases of parsing and parsing for new elements in the grammar.
Diffstat (limited to 'src/wat-parser.h')
-rw-r--r--src/wat-parser.h73
1 files changed, 73 insertions, 0 deletions
diff --git a/src/wat-parser.h b/src/wat-parser.h
new file mode 100644
index 000000000..4bb9b62c8
--- /dev/null
+++ b/src/wat-parser.h
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2022 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.
+ */
+
+#ifndef wasm_wat_parser_h
+#define wasm_wat_parser_h
+
+#include <optional>
+#include <string_view>
+
+#include "wasm.h"
+
+namespace wasm::WATParser {
+
+struct Ok {};
+
+struct None {};
+
+struct Err {
+ std::string msg;
+};
+
+template<typename T = Ok> struct Result {
+ std::variant<T, Err> val;
+
+ Result(Result<T>& other) = default;
+ Result(const Err& e) : val(std::in_place_type<Err>, e) {}
+ Result(Err&& e) : val(std::in_place_type<Err>, e) {}
+ template<typename U = T>
+ Result(U&& u) : val(std::in_place_type<T>, std::forward<U>(u)) {}
+
+ Err* getErr() { return std::get_if<Err>(&val); }
+ T& operator*() { return *std::get_if<T>(&val); }
+ T* operator->() { return std::get_if<T>(&val); }
+};
+
+template<typename T = Ok> struct MaybeResult {
+ std::variant<T, None, Err> val;
+
+ MaybeResult() : val(None{}) {}
+ MaybeResult(MaybeResult<T>& other) = default;
+ MaybeResult(const Err& e) : val(std::in_place_type<Err>, e) {}
+ MaybeResult(Err&& e) : val(std::in_place_type<Err>, std::move(e)) {}
+ template<typename U = T>
+ MaybeResult(U&& u) : val(std::in_place_type<T>, std::forward<U>(u)) {}
+
+ // Whether we have an error or a value. Useful for assignment in loops and if
+ // conditions where errors should not get lost.
+ operator bool() const { return !std::holds_alternative<None>(val); }
+
+ Err* getErr() { return std::get_if<Err>(&val); }
+ T& operator*() { return *std::get_if<T>(&val); }
+ T* operator->() { return std::get_if<T>(&val); }
+};
+
+// Parse a single WAT module.
+Result<> parseModule(Module& wasm, std::string_view in);
+
+} // namespace wasm::WATParser
+
+#endif // wasm_wat_parser.h