blob: b0074faa6e109a4aadb675d6a5866803355ec463 [file] [log] [blame] [edit]
/*
* Copyright 2023 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 parser_wat_parser_h
#define parser_wat_parser_h
#include <string_view>
#include "parser/lexer.h"
#include "support/result.h"
#include "wasm.h"
namespace wasm::WATParser {
// Parse a single WAT module.
Result<> parseModule(Module& wasm,
std::string_view in,
std::optional<std::string> filename = std::nullopt);
// Parse a single WAT module that may have other things after it, as in a wast
// file.
Result<> parseModule(Module& wasm, Lexer& lexer);
Result<Literal> parseConst(Lexer& lexer);
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
struct InvokeAction {
std::optional<Name> base;
Name name;
Literals args;
};
#pragma GCC diagnostic pop
struct GetAction {
std::optional<Name> base;
Name name;
};
using Action = std::variant<InvokeAction, GetAction>;
struct RefResult {
HeapType type;
};
enum class NaNKind { Canonical, Arithmetic };
struct NaNResult {
NaNKind kind;
Type type;
};
using LaneResult = std::variant<Literal, NaNResult>;
using LaneResults = std::vector<LaneResult>;
using ExpectedResult = std::variant<Literal, RefResult, NaNResult, LaneResults>;
using ExpectedResults = std::vector<ExpectedResult>;
struct AssertReturn {
Action action;
ExpectedResults expected;
};
enum class ActionAssertionType { Trap, Exhaustion, Exception };
struct AssertAction {
ActionAssertionType type;
Action action;
};
enum class QuotedModuleType { Text, Binary };
struct QuotedModule {
QuotedModuleType type;
std::string module;
};
using WASTModule = std::variant<QuotedModule, std::shared_ptr<Module>>;
enum class ModuleAssertionType { Trap, Malformed, Invalid, Unlinkable };
struct AssertModule {
ModuleAssertionType type;
WASTModule wasm;
};
using Assertion = std::variant<AssertReturn, AssertAction, AssertModule>;
struct Register {
Name name;
};
using WASTCommand = std::variant<WASTModule, Register, Action, Assertion>;
struct ScriptEntry {
WASTCommand cmd;
size_t line;
};
using WASTScript = std::vector<ScriptEntry>;
Result<WASTScript> parseScript(std::string_view in);
} // namespace wasm::WATParser
#endif // parser_wat_parser_h