aboutsummaryrefslogtreecommitdiffhomepage
path: root/parse.h
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2023-06-19 11:56:46 +0200
committerlemon <lsof@mailbox.org>2023-06-19 11:56:46 +0200
commitb71515071d1310bbf9cd34f8997aa736ebd30099 (patch)
treef14ac1364d508ad2f1e8cdcda59b4dc9bae96f21 /parse.h
parent08649c95cc15b5ad99e6b8899d639f6c3b63266b (diff)
frontend: separate compiler & lexer
Diffstat (limited to 'parse.h')
-rw-r--r--parse.h179
1 files changed, 0 insertions, 179 deletions
diff --git a/parse.h b/parse.h
deleted file mode 100644
index 4cd2e5f..0000000
--- a/parse.h
+++ /dev/null
@@ -1,179 +0,0 @@
-#include "common.h"
-
-/*************/
-/** PARSING **/
-/************/
-
-static inline bool
-joinspan(struct span0 *dst, struct span0 snd)
-{
- if (dst->file != snd.file) return 0;
- assert(dst->off <= snd.off);
- dst->len = snd.off + snd.len - dst->off;
- return 1;
-}
-
-enum toktag { /* single-character tokens' tag value is the character itself */
- TKEOF = -1,
- TKXXX,
- TKNUMLIT,
- TKCHRLIT,
- TKSTRLIT,
- TKEQU = '@', /* == */
- TKNEQ, /* != */
- TKLTE, /* <= */
- TKGTE, /* >= */
- TKSHR, /* >> */
- TKSHL, /* << */
- TKINC, /* ++ */
- TKDEC, /* -- */
- TKDOTS, /* ... */
- TKARROW, /* -> */
- TKPPCAT, /* ## */
- TKLOGAND, /* && */
- TKLOGIOR, /* || */
- TKSETADD, /* += */
- TKSETSUB, /* -= */
- TKSETMUL, /* *= */
- TKSETDIV, /* /= */
- TKSETREM, /* %= */
- TKSETIOR, /* |= */
- TKSETXOR, /* ^= */
- TKSETAND, /* &= */
- TKSETSHL, /* <<= */
- TKSETSHR, /* >>= */
- TKIDENT = 0x80,
-#define _(kw, stdc) TKW##kw,
-#include "keywords.def"
-#undef _
-};
-
-struct token {
- short t; /* toktag */
- bool litlit;
- uint len;
- struct span span;
- const char *s;
- /* for (multi-)character tokens s & len are unused
- * for keywords, s is constant cstring, len = strlen(s)
- * for idents, s is interned cstring, len = strlen(s)
- * for strlit and chrlit:
- * when litlit : s points to start of string within file buffer (after the ")
- * len == span.sl.len - 2 (string data appears literally in source code)
- * otherwise s is heap allocated buffer of len bytes
- * for numlit:
- * when litlit : s points to start of token within file buffer (normal case)
- * len == span.sl.len (number literal appears literally in source code)
- * otherwise s is heap allocated buffer of len bytes
- */
-};
-
-struct macro {
- const char *name; /* interned */
- const char **param;
- struct span0 span;
- uchar nparam;
- bool fnlike, variadic;
- struct rlist {
- struct token *tk;
- int n;
- } rlist;
-};
-
-struct macrostack {
- struct macrostack *link;
- struct rlist *args;
- struct span0 exspan;
- int mac;
- int idx;
-};
-
-extern int nerror;
-struct parser {
- struct parser *save;
- short fileid;
- const uchar *dat;
- uint ndat;
- uint idx, chridx;
- short peekchr[2];
- uint peekcidx[2];
- short npeekchr;
- struct macrostack *macstk;
- struct token peektok;
- bool eof, err;
- struct env *env;
- struct arena *fnarena, *exarena;
- struct span fnblkspan;
- uint loopdepth, switchdepth;
- struct block *loopbreak, *loopcont;
-};
-
-const char *intern(const char *);
-int lex(struct parser *, struct token *);
-int lexpeek(struct parser *, struct token *);
-enum typetag parsenumlit(uvlong *, double *, const struct token *, bool ispp);
-void initparser(struct parser *, const char *file);
-void parse(struct parser *);
-
-/************/
-/* ANALYSIS */
-/************/
-
-enum exprkind {
- EXXX, ENUMLIT, ESTRLIT, ESYM, EINIT, EGETF, ECALL, ECOND,
- /* unary */
- EPLUS, ENEG, ECOMPL, ELOGNOT, EDEREF, EADDROF, ECAST,
- EPREINC, EPOSTINC, EPREDEC, EPOSTDEC,
- /* binary */
- EADD, ESUB, EMUL, EDIV, EREM, EBAND, EBIOR, EXOR, ESHL, ESHR,
- ELOGAND, ELOGIOR,
- EEQU, ENEQ, ELTH, EGTH, ELTE, EGTE,
- ESET, ESETADD, ESETSUB, ESETMUL, ESETDIV, ESETREM, ESETAND, ESETIOR, ESETXOR, ESETSHL, ESETSHR,
- ESEQ,
-};
-#define isunop(t) in_range(t, EPLUS, EPOSTDEC)
-#define isbinop(t) in_range(t, EADD, ESEQ)
-#define isassign(t) in_range(t, ESET, ESETSHR)
-#define assigntobinop(t) ((t) - ESETADD + EADD)
-
-struct expr {
- uchar t;
- uchar qual;
- ushort narg; /* ECALL */
- union type ty;
- struct span span;
- union {
- struct {
- struct expr *sub;
- struct {
- ushort off;
- uchar bitsiz, bitoff;
- } fld; /* EGETF */
- };
- uvlong u; vlong i; double f; /* ENUMLIT */
- struct bytes s; /* ESTRLIT */
- struct decl *sym; /* ESYM */
- struct initializer *ini; /* EINIT */
- };
-};
-
-enum storageclass {
- SCNONE,
- SCTYPEDEF = 1<<0,
- SCEXTERN = 1<<1,
- SCSTATIC = 1<<2,
- SCTHREADLOCAL = 1<<3,
- SCAUTO = 1<<4,
- SCREGISTER = 1<<5,
-};
-
-enum evalmode {
- EVINTCONST,
- EVARITH,
- EVSTATICINI,
- EVFOLD,
-};
-
-bool eval(struct expr *, enum evalmode);
-
-/* vim:set ts=3 sw=3 expandtab: */