summaryrefslogtreecommitdiffhomepage
path: root/include/ucode/compiler.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/ucode/compiler.h')
-rw-r--r--include/ucode/compiler.h25
1 files changed, 23 insertions, 2 deletions
diff --git a/include/ucode/compiler.h b/include/ucode/compiler.h
index 19fcf37..04fc0ef 100644
--- a/include/ucode/compiler.h
+++ b/include/ucode/compiler.h
@@ -64,11 +64,23 @@ typedef enum {
P_PRIMARY /* (…) */
} uc_precedence_t;
+typedef enum {
+ F_ASSIGNABLE = (1 << 0),
+ F_OPTCHAINING = (1 << 1),
+ F_ALTBLOCKMODE = (1 << 2),
+} uc_exprflag_t;
+
typedef struct uc_patchlist {
struct uc_patchlist *parent;
size_t depth, count, *entries;
} uc_patchlist_t;
+typedef struct uc_exprstack {
+ struct uc_exprstack *parent;
+ uint32_t flags;
+ uc_tokentype_t token;
+} uc_exprstack_t;
+
typedef struct {
uc_value_t *name;
ssize_t depth;
@@ -101,17 +113,26 @@ typedef struct uc_compiler {
uc_locals_t locals;
uc_upvals_t upvals;
uc_patchlist_t *patchlist;
+ uc_exprstack_t *exprstack;
uc_value_t *function;
uc_parser_t *parser;
size_t scope_depth, current_srcpos, last_insn;
} uc_compiler_t;
typedef struct {
- void (*prefix)(uc_compiler_t *, bool);
- void (*infix)(uc_compiler_t *, bool);
+ void (*prefix)(uc_compiler_t *);
+ void (*infix)(uc_compiler_t *);
uc_precedence_t precedence;
} uc_parse_rule_t;
uc_function_t *uc_compile(uc_parse_config_t *config, uc_source_t *source, char **errp);
+#define uc_compiler_exprstack_push(compiler, token, flags) \
+ uc_exprstack_t expr = { compiler->exprstack, flags, token }; \
+ compiler->exprstack = &expr
+
+#define uc_compiler_exprstack_pop(compiler) \
+ if (compiler->exprstack) \
+ compiler->exprstack = compiler->exprstack->parent
+
#endif /* __COMPILER_H_ */