blob: 421d9fa70e7874ba3d2d3b7c83ff4784668176b3 [file] [edit]
/*
* 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_ */