VapourSynth-llvmexpr
Loading...
Searching...
No Matches
Tokenizer.hpp
Go to the documentation of this file.
1
19
20#ifndef LLVMEXPR_FRONTEND_TOKENIZER_HPP
21#define LLVMEXPR_FRONTEND_TOKENIZER_HPP
22
23#include <cstdint>
24#include <optional>
25#include <string>
26#include <string_view>
27#include <variant>
28#include <vector>
29
30enum class TokenType : std::uint8_t {
31 // Literals & Constants
35 ConstantWidth, // width
36 ConstantHeight, // height
37 ConstantPlaneWidth, // width^plane_no
38 ConstantPlaneHeight, // height^plane_no
39 ConstantClipWidth, // srcN:width
40 ConstantClipHeight, // srcN:height
41 ConstantClipPlaneWidth, // srcN:width^plane_no
42 ConstantClipPlaneHeight, // srcN:height^plane_no
45
46 // Variable Ops
47 VarStore, // my_var!
48 VarLoad, // my_var@
49
50 // Array Ops
51 ArrayAllocStatic, // arr{}^N
52 ArrayAllocDyn, // arr{}^
53 ArrayStore, // arr{}!
54 ArrayLoad, // arr{}@
55
56 // Data Access
57 ClipRel, // src[x,y]
58 ClipAbs, // src[]
59 ClipCur, // src
60 PropAccess, // src.prop
61 PropExists, // src.prop?
62 ClipAbsPlane, // src^plane[]
63 StoreAbsPlane, // @[]^plane
64 PropStore, // prop$
65 BufferRel, // bufN[x,y]
66 BufferAbs, // bufN[]
67 BufferCur, // bufN
68
69 // Binary Operators
91
92 // Unary Operators
117
118 // Ternary and other multi-arg
121 Clamp, // same op, 3 args
122 Fma, // 3 args
123
124 // Stack manipulation
132
133 // Control Flow
134 LabelDef, // #my_label
135 Jump, // my_label#
136
137 // Custom output control
138 ExitNoWrite, // ^exit^
139 StoreAbs, // @[]
140};
141
143 double value;
144};
145
147 std::string name;
148};
149
151 std::string name;
152};
153
155 int n;
156};
157
160 int rel_x = 0;
161 int rel_y = 0;
162 bool use_mirror = false;
163 bool has_mode = false;
164};
165
168 std::string prop_name;
169};
170
175
179
180enum class PropWriteType : std::uint8_t {
181 Float, // $f or $
182 Int, // $i
183 AutoInt, // $ai
184 AutoFloat, // $af
185 Delete, // $d
186};
187
192
196
200
205
207 std::string name;
208 int static_size = 0; // ARRAY_ALLOC_STATIC
209};
210
213 int rel_x = 0;
214 int rel_y = 0;
215 bool use_mirror = false;
216 bool has_mode = false;
217};
218
233
235 int arity;
237};
238
240using BehaviorResolver = std::variant<TokenBehavior, DynamicBehaviorFn>;
241
242enum class ExprMode : std::uint8_t {
246};
247
248// Utility functions
249constexpr int parse_std_clip_idx(char c) {
250 if (c >= 'x' && c <= 'z') {
251 return c - 'x';
252 }
253 return c - 'a' + 3;
254}
255
256using TokenParser = std::optional<Token> (*)(std::string_view);
257
260 std::string_view name;
263
264 enum class Availability : std::uint8_t {
265 Expr = 1U << 0,
266 SingleExpr = 1U << 1,
267 VkExpr = 1U << 2,
268 };
269
271 static_cast<std::uint8_t>(Availability::Expr) |
272 static_cast<std::uint8_t>(Availability::SingleExpr) |
273 static_cast<std::uint8_t>(Availability::VkExpr));
274};
275
276std::vector<Token> tokenize(const std::string& expr, int num_inputs,
278 int num_intermediate_inputs = 0);
280
281#endif // LLVMEXPR_FRONTEND_TOKENIZER_HPP
std::vector< Token > tokenize(const std::string &expr, int num_inputs, ExprMode mode=ExprMode::Expr, int num_intermediate_inputs=0)
TokenType
Definition Tokenizer.hpp:30
@ ConstantClipPlaneHeight
Definition Tokenizer.hpp:42
@ ConstantPlaneWidth
Definition Tokenizer.hpp:37
@ ArrayAllocStatic
Definition Tokenizer.hpp:51
@ ConstantPlaneHeight
Definition Tokenizer.hpp:38
@ ConstantClipHeight
Definition Tokenizer.hpp:40
@ ConstantClipPlaneWidth
Definition Tokenizer.hpp:41
@ ConstantClipWidth
Definition Tokenizer.hpp:39
std::optional< Token >(*)(std::string_view) TokenParser
ExprMode
PropWriteType
constexpr int parse_std_clip_idx(char c)
TokenBehavior(*)(const Token &) DynamicBehaviorFn
std::variant< TokenBehavior, DynamicBehaviorFn > BehaviorResolver
TokenBehavior get_token_behavior(const Token &token)
std::string_view name
BehaviorResolver behavior
TokenParser parser
Availability availability
std::string name
std::string name
std::variant< std::monostate, TokenPayloadNumber, TokenPayloadVar, TokenPayloadLabel, TokenPayloadStackOp, TokenPayloadClipAccess, TokenPayloadPropAccess, TokenPayloadClipAccessPlane, TokenPayloadStoreAbsPlane, TokenPayloadPropStore, TokenPayloadPlaneDim, TokenPayloadClipDim, TokenPayloadClipPlaneDim, TokenPayloadArrayOp, TokenPayloadBufferAccess > PayloadVariant
TokenType type
PayloadVariant payload
std::string text