summaryrefslogtreecommitdiff
path: root/src/wast-parser-lexer-shared.h
blob: 76be8f31f5f42e57d5f47e316fb5595b62637362 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/*
 * 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 <cstdarg>
#include <memory>

#include "common.h"
#include "ir.h"
#include "source-error-handler.h"
#include "wast-parser.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

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 ModuleFieldList {
  ModuleField* first;
  ModuleField* last;
};

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;
  Exception* exception;
  Export* export_;
  Expr* expr;
  ExprList expr_list;
  Func* func;
  FuncSignature* func_sig;
  FuncType* func_type;
  Global* global;
  Import* import;
  Limits limits;
  Memory* memory;
  Module* module;
  ModuleField* module_field;
  ModuleFieldList module_fields;
  ScriptModule* script_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;
  WastParseOptions* options;
};

int wast_lexer_lex(union Token*,
                   struct Location*,
                   WastLexer*,
                   struct WastParser*);
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_text_list(TextList*);
void destroy_module_field_list(ModuleFieldList*);

}  // namespace wabt

#endif /* WABT_WAST_PARSER_LEXER_SHARED_H_ */