summaryrefslogtreecommitdiffstats
path: root/contrib/restricted/wavm/Lib/WASTParse/Lexer.h
blob: d0b24b4b4496fbe78c1344b8bc75384989f26ae7 (plain) (blame)
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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#pragma once

#include "WAVM/IR/Operators.h"
#include "WAVM/Inline/BasicTypes.h"
#include "WAVM/Platform/Defines.h"
#include "WAVM/WASTParse/WASTParse.h"

#define VISIT_OPERATOR_TOKEN(opcode, name, nameString, ...)                                        \
	VISIT_TOKEN(name, "'" #nameString "'", #nameString)

#define VISIT_LITERAL_TOKEN(name) VISIT_TOKEN(name, "'" #name "'", #name)
#define ENUM_LITERAL_TOKENS()                                                                      \
	VISIT_LITERAL_TOKEN(module)                                                                    \
	VISIT_LITERAL_TOKEN(func)                                                                      \
	VISIT_LITERAL_TOKEN(type)                                                                      \
	VISIT_LITERAL_TOKEN(table)                                                                     \
	VISIT_LITERAL_TOKEN(export)                                                                    \
	VISIT_LITERAL_TOKEN(import)                                                                    \
	VISIT_LITERAL_TOKEN(memory)                                                                    \
	VISIT_LITERAL_TOKEN(data)                                                                      \
	VISIT_LITERAL_TOKEN(elem)                                                                      \
	VISIT_LITERAL_TOKEN(start)                                                                     \
	VISIT_LITERAL_TOKEN(param)                                                                     \
	VISIT_LITERAL_TOKEN(result)                                                                    \
	VISIT_LITERAL_TOKEN(local)                                                                     \
	VISIT_LITERAL_TOKEN(global)                                                                    \
	VISIT_LITERAL_TOKEN(assert_return)                                                             \
	VISIT_LITERAL_TOKEN(assert_return_arithmetic_nan)                                              \
	VISIT_LITERAL_TOKEN(assert_return_canonical_nan)                                               \
	VISIT_LITERAL_TOKEN(assert_return_arithmetic_nan_f32x4)                                        \
	VISIT_LITERAL_TOKEN(assert_return_canonical_nan_f32x4)                                         \
	VISIT_LITERAL_TOKEN(assert_return_arithmetic_nan_f64x2)                                        \
	VISIT_LITERAL_TOKEN(assert_return_canonical_nan_f64x2)                                         \
	VISIT_LITERAL_TOKEN(assert_return_func)                                                        \
	VISIT_LITERAL_TOKEN(assert_trap)                                                               \
	VISIT_LITERAL_TOKEN(assert_throws)                                                             \
	VISIT_LITERAL_TOKEN(assert_invalid)                                                            \
	VISIT_LITERAL_TOKEN(assert_unlinkable)                                                         \
	VISIT_LITERAL_TOKEN(assert_malformed)                                                          \
	VISIT_LITERAL_TOKEN(assert_exhaustion)                                                         \
	VISIT_LITERAL_TOKEN(benchmark)                                                                 \
	VISIT_LITERAL_TOKEN(thread)                                                                    \
	VISIT_LITERAL_TOKEN(wait)                                                                      \
	VISIT_LITERAL_TOKEN(either)                                                                    \
	VISIT_LITERAL_TOKEN(invoke)                                                                    \
	VISIT_LITERAL_TOKEN(get)                                                                       \
	VISIT_LITERAL_TOKEN(align)                                                                     \
	VISIT_LITERAL_TOKEN(offset)                                                                    \
	VISIT_LITERAL_TOKEN(item)                                                                      \
	VISIT_LITERAL_TOKEN(then)                                                                      \
	VISIT_LITERAL_TOKEN(register)                                                                  \
	VISIT_LITERAL_TOKEN(mut)                                                                       \
	VISIT_LITERAL_TOKEN(i32)                                                                       \
	VISIT_LITERAL_TOKEN(i64)                                                                       \
	VISIT_LITERAL_TOKEN(f32)                                                                       \
	VISIT_LITERAL_TOKEN(f64)                                                                       \
	VISIT_LITERAL_TOKEN(i8x16)                                                                     \
	VISIT_LITERAL_TOKEN(i16x8)                                                                     \
	VISIT_LITERAL_TOKEN(i32x4)                                                                     \
	VISIT_LITERAL_TOKEN(i64x2)                                                                     \
	VISIT_LITERAL_TOKEN(f32x4)                                                                     \
	VISIT_LITERAL_TOKEN(f64x2)                                                                     \
	VISIT_LITERAL_TOKEN(externref)                                                                 \
	VISIT_LITERAL_TOKEN(funcref)                                                                   \
	VISIT_LITERAL_TOKEN(extern)                                                                    \
	VISIT_LITERAL_TOKEN(declare)                                                                   \
	VISIT_LITERAL_TOKEN(shared)                                                                    \
	VISIT_LITERAL_TOKEN(quote)                                                                     \
	VISIT_LITERAL_TOKEN(binary)                                                                    \
	VISIT_LITERAL_TOKEN(v128)                                                                      \
	VISIT_LITERAL_TOKEN(exception_type)                                                            \
	VISIT_LITERAL_TOKEN(custom_section)                                                            \
	VISIT_LITERAL_TOKEN(after)                                                                     \
	VISIT_LITERAL_TOKEN(before)                                                                    \
	VISIT_LITERAL_TOKEN(data_count)                                                                \
	VISIT_LITERAL_TOKEN(code)                                                                      \
	VISIT_LITERAL_TOKEN(calling_conv)                                                              \
	VISIT_LITERAL_TOKEN(intrinsic)                                                                 \
	VISIT_LITERAL_TOKEN(intrinsic_with_context_switch)                                             \
	VISIT_LITERAL_TOKEN(c)                                                                         \
	VISIT_LITERAL_TOKEN(c_api_callback)                                                            \
	VISIT_TOKEN(ref_extern, "'ref.extern'", "ref.extern")

#define ENUM_TOKENS()                                                                              \
	VISIT_TOKEN(eof, "eof", _)                                                                     \
                                                                                                   \
	VISIT_TOKEN(unterminatedComment, "unterminated comment", _)                                    \
	VISIT_TOKEN(unrecognized, "unrecognized token", _)                                             \
	VISIT_TOKEN(legacyInstructionName, "legacy operator name", _)                                  \
                                                                                                   \
	VISIT_TOKEN(decimalFloat, "decimal float literal", _)                                          \
	VISIT_TOKEN(decimalInt, "decimal int literal", _)                                              \
	VISIT_TOKEN(hexFloat, "hexadecimal float literal", _)                                          \
	VISIT_TOKEN(hexInt, "hexadecimal int literal", _)                                              \
	VISIT_TOKEN(floatNaN, "float NaN literal", _)                                                  \
	VISIT_TOKEN(floatInf, "float infinity literal", _)                                             \
	VISIT_TOKEN(canonicalNaN, "float canonical NaN literal", _)                                    \
	VISIT_TOKEN(arithmeticNaN, "float arithmetic NaN literal", _)                                  \
	VISIT_TOKEN(string, "string literal", _)                                                       \
	VISIT_TOKEN(name, "name literal", _)                                                           \
	VISIT_TOKEN(quotedName, "quoted name literal", _)                                              \
                                                                                                   \
	VISIT_TOKEN(leftParenthesis, "'('", _)                                                         \
	VISIT_TOKEN(rightParenthesis, "')'", _)                                                        \
	VISIT_TOKEN(equals, "'='", _)                                                                  \
                                                                                                   \
	ENUM_LITERAL_TOKENS()                                                                          \
                                                                                                   \
	WAVM_ENUM_OPERATORS(VISIT_OPERATOR_TOKEN)

namespace WAVM { namespace WAST {
	typedef U16 TokenType;
	enum : U16
	{
#define VISIT_TOKEN(name, description, _) t_##name,
		ENUM_TOKENS()
#undef VISIT_TOKEN
	};

	WAVM_PACKED_STRUCT(struct Token {
		TokenType type;
		U32 begin;
	});

	struct LineInfo;

	// Lexes a string and returns an array of tokens.
	// Also returns a pointer in outLineInfo to the information necessary to resolve line/column
	// numbers for the tokens. The caller should pass the tokens and line info to
	// freeTokens/freeLineInfo, respectively, when it is done with them.
	Token* lex(const char* string,
			   Uptr stringLength,
			   LineInfo*& outLineInfo,
			   bool allowLegacyInstructionNames);

	void freeTokens(Token* tokens);
	void freeLineInfo(LineInfo* lineInfo);

	const char* describeToken(TokenType tokenType);

	TextFileLocus calcLocusFromOffset(const char* string,
									  const LineInfo* lineInfo,
									  Uptr charOffset);
}}