summaryrefslogtreecommitdiff
path: root/src/wast-parser-lexer-shared.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/wast-parser-lexer-shared.h')
-rw-r--r--src/wast-parser-lexer-shared.h197
1 files changed, 197 insertions, 0 deletions
diff --git a/src/wast-parser-lexer-shared.h b/src/wast-parser-lexer-shared.h
new file mode 100644
index 00000000..421d9fa7
--- /dev/null
+++ b/src/wast-parser-lexer-shared.h
@@ -0,0 +1,197 @@
+/*
+ * Copyright 2016 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 WABT_WAST_PARSER_LEXER_SHARED_H_
+#define WABT_WAST_PARSER_LEXER_SHARED_H_
+
+#include <stdarg.h>
+
+#include <memory>
+
+#include "common.h"
+#include "ir.h"
+#include "source-error-handler.h"
+#include "wast-lexer.h"
+
+#define WABT_WAST_PARSER_STYPE Token
+#define WABT_WAST_PARSER_LTYPE Location
+#define YYSTYPE WABT_WAST_PARSER_STYPE
+#define YYLTYPE WABT_WAST_PARSER_LTYPE
+
+#define WABT_INVALID_LINE_OFFSET (static_cast<size_t>(~0))
+
+namespace wabt {
+
+struct ExprList {
+ Expr* first;
+ Expr* last;
+ size_t size;
+};
+
+struct TextListNode {
+ StringSlice text;
+ struct TextListNode* next;
+};
+
+struct TextList {
+ TextListNode* first;
+ TextListNode* last;
+};
+
+struct OptionalExport {
+ std::unique_ptr<Export> export_;
+ bool has_export;
+};
+
+struct ExportedFunc {
+ std::unique_ptr<Func> func;
+ OptionalExport export_;
+};
+
+struct ExportedGlobal {
+ std::unique_ptr<Global> global;
+ OptionalExport export_;
+};
+
+struct ExportedTable {
+ std::unique_ptr<Table> table;
+ std::unique_ptr<ElemSegment> elem_segment;
+ OptionalExport export_;
+ bool has_elem_segment;
+};
+
+struct ExportedMemory {
+ std::unique_ptr<Memory> memory;
+ std::unique_ptr<DataSegment> data_segment;
+ OptionalExport export_;
+ bool has_data_segment;
+};
+
+enum class FuncFieldType {
+ Exprs,
+ ParamTypes,
+ BoundParam,
+ ResultTypes,
+ LocalTypes,
+ BoundLocal,
+};
+
+struct BoundType {
+ WABT_DISALLOW_COPY_AND_ASSIGN(BoundType);
+ BoundType();
+ ~BoundType();
+
+ Location loc;
+ StringSlice name;
+ Type type;
+};
+
+struct FuncField {
+ WABT_DISALLOW_COPY_AND_ASSIGN(FuncField);
+ FuncField();
+ ~FuncField();
+
+ FuncFieldType type;
+ union {
+ Expr* first_expr; /* WABT_FUNC_FIELD_TYPE_EXPRS */
+ TypeVector* types; /* WABT_FUNC_FIELD_TYPE_*_TYPES */
+ BoundType bound_type; /* WABT_FUNC_FIELD_TYPE_BOUND_{LOCAL, PARAM} */
+ };
+ struct FuncField* next;
+};
+
+union Token {
+ /* terminals */
+ StringSlice text;
+ Type type;
+ Opcode opcode;
+ Literal literal;
+
+ /* non-terminals */
+ /* some of these use pointers to keep the size of Token down; copying the
+ tokens is a hotspot when parsing large files. */
+ Action* action;
+ Block* block;
+ Command* command;
+ CommandPtrVector* commands;
+ Const const_;
+ ConstVector* consts;
+ DataSegment* data_segment;
+ ElemSegment* elem_segment;
+ Export* export_;
+ ExportedFunc* exported_func;
+ ExportedGlobal* exported_global;
+ ExportedMemory* exported_memory;
+ ExportedTable* exported_table;
+ Expr* expr;
+ ExprList expr_list;
+ FuncField* func_fields;
+ Func* func;
+ FuncSignature* func_sig;
+ FuncType* func_type;
+ Global* global;
+ Import* import;
+ Limits limits;
+ OptionalExport* optional_export;
+ Memory* memory;
+ Module* module;
+ RawModule* raw_module;
+ Script* script;
+ Table* table;
+ TextList text_list;
+ TypeVector* types;
+ uint32_t u32;
+ uint64_t u64;
+ Var var;
+ VarVector* vars;
+};
+
+struct WastParser {
+ Script* script;
+ SourceErrorHandler* error_handler;
+ int errors;
+ /* Cached pointers to reallocated parser buffers, so they don't leak. */
+ int16_t* yyssa;
+ YYSTYPE* yyvsa;
+ YYLTYPE* yylsa;
+};
+
+int wast_lexer_lex(union Token*,
+ struct Location*,
+ WastLexer*,
+ struct WastParser*);
+Result wast_lexer_get_source_line(WastLexer*,
+ const struct Location*,
+ size_t line_max_length,
+ char* line,
+ size_t* out_line_length,
+ int* out_column_offset);
+void WABT_PRINTF_FORMAT(4, 5) wast_parser_error(struct Location*,
+ WastLexer*,
+ struct WastParser*,
+ const char*,
+ ...);
+void wast_format_error(SourceErrorHandler*,
+ const struct Location*,
+ WastLexer*,
+ const char* format,
+ va_list);
+void destroy_func_fields(FuncField*);
+void destroy_text_list(TextList*);
+
+} // namespace wabt
+
+#endif /* WABT_WAST_PARSER_LEXER_SHARED_H_ */