commit 4b90764e547ea0bb9fdb8d93d9492db3668a033f
parent 27abb47957cb359cc7d3d8a8732d7ecd1f63f647
Author: m21c <ho*******@gmail.com>
Date: Wed, 6 Oct 2021 00:01:38 +0200
added keywords for sizeof, alignof, lengthof, bitcast
Diffstat:
| M | compiler.c | | | 134 | +++++++++++++++++++++++++++++++++++++++++++++---------------------------------- |
1 file changed, 77 insertions(+), 57 deletions(-)
diff --git a/compiler.c b/compiler.c
@@ -68,6 +68,8 @@ enum Kind {
KUSIZE, KSSIZE,
KFALSE, KTRUE, KNULL,
KUSE, KNOT, KAND, KOR, KIS,
+ KSIZEOF, KALIGNOF, KLENGTHOF,
+ KBITCAST,
KEXTERN, KINTERN, KSTATIC, KCONST, KVAR,
KBREAK, KCONTINUE, KGOTO, KRETURN,
KIF, KELSE, KCASE, KOF, KDO,
@@ -415,64 +417,67 @@ const int keywordtypeids[] = {
const char *const nodestrings[] = {
/* Keywords */
- [KVOID] = "void", [KBOOL] = "bool",
- [KU8] = "u8", [KS8] = "s8",
- [KU16] = "u16", [KS16] = "s16",
- [KU32] = "u32", [KS32] = "s32",
- [KU64] = "u64", [KS64] = "s64",
- [KF32] = "f32", [KF64] = "f64",
- [KUCHAR] = "uchar", [KCHAR] = "char",
- [KUSHORT] = "ushort", [KSHORT] = "short",
- [KUINT] = "uint", [KINT] = "int",
- [KULONG] = "ulong", [KLONG] = "long",
- [KULLONG] = "ullong", [KLLONG] = "llong",
- [KFLOAT] = "float", [KDOUBLE] = "double",
- [KLDOUBLE] = "ldouble", [KUSIZE] = "usize",
- [KSSIZE] = "ssize",
- [KFALSE] = "false", [KTRUE] = "true",
- [KNULL] = "null",
- [KUSE] = "use", [KNOT] = "not",
- [KAND] = "and", [KOR] = "or",
- [KIS] = "is",
- [KEXTERN] = "extern", [KINTERN] = "intern",
- [KSTATIC] = "static", [KCONST] = "const",
- [KVAR] = "var",
- [KBREAK] = "break", [KCONTINUE] = "continue",
- [KGOTO] = "goto", [KRETURN] = "return",
- [KIF] = "if", [KELSE] = "else",
- [KCASE] = "case", [KOF] = "of",
- [KDO] = "do",
- [KFOR] = "for", [KLOOP] = "loop",
- [KWHILE] = "while", [KUNTIL] = "until",
- [KSTRUCT] = "struct", [KUNION] = "union",
+ [KVOID] = "void", [KBOOL] = "bool",
+ [KU8] = "u8", [KS8] = "s8",
+ [KU16] = "u16", [KS16] = "s16",
+ [KU32] = "u32", [KS32] = "s32",
+ [KU64] = "u64", [KS64] = "s64",
+ [KF32] = "f32", [KF64] = "f64",
+ [KUCHAR] = "uchar", [KCHAR] = "char",
+ [KUSHORT] = "ushort", [KSHORT] = "short",
+ [KUINT] = "uint", [KINT] = "int",
+ [KULONG] = "ulong", [KLONG] = "long",
+ [KULLONG] = "ullong", [KLLONG] = "llong",
+ [KFLOAT] = "float", [KDOUBLE] = "double",
+ [KLDOUBLE] = "ldouble", [KUSIZE] = "usize",
+ [KSSIZE] = "ssize",
+ [KFALSE] = "false", [KTRUE] = "true",
+ [KNULL] = "null",
+ [KUSE] = "use", [KNOT] = "not",
+ [KAND] = "and", [KOR] = "or",
+ [KIS] = "is",
+ [KSIZEOF] = "sizeof", [KALIGNOF] = "alignof",
+ [KLENGTHOF] = "lengthof",
+ [KBITCAST] = "bitcast",
+ [KEXTERN] = "extern", [KINTERN] = "intern",
+ [KSTATIC] = "static", [KCONST] = "const",
+ [KVAR] = "var",
+ [KBREAK] = "break", [KCONTINUE] = "continue",
+ [KGOTO] = "goto", [KRETURN] = "return",
+ [KIF] = "if", [KELSE] = "else",
+ [KCASE] = "case", [KOF] = "of",
+ [KDO] = "do",
+ [KFOR] = "for", [KLOOP] = "loop",
+ [KWHILE] = "while", [KUNTIL] = "until",
+ [KSTRUCT] = "struct", [KUNION] = "union",
/* Operators */
- [OSUFINC] = "++", [OSUFDEC] = "--",
- [OARRAY] = "[]", [OCALL] = "()",
- [ODISP] = ".",
- [ODEREF] = "*", [OINC] = "++",
- [ODEC] = "--", [OBNOT] = "~",
- [OLNOT] = "!", [OFLIP] = "~=",
- [OADDR] = "&", [OPLUS] = "+",
- [OMINUS] = "-", [OCAST] = "(type)",
- [OMUL] = "*", [ODIV] = "/",
- [OMOD] = "%", [OLSH] = "<<",
- [OARSH] = ">>>", [ORSH] = ">>",
- [OBAND] = "&",
- [OADD] = "+", [OSUB] = "-",
- [OBOR] = "|", [OXOR] = "^",
- [ORANGE] = "..",
- [OLEQ] = "<=", [OLET] = "<",
- [OGEQ] = ">=", [OGRT] = ">",
- [ONEQ] = "!=", [OEQU] = "==",
- [OIDENT] = "===",
- [OLAND] = "&&",
- [OLOR] = "||",
- [OASS] = "=", [OMULA] = "*=",
- [ODIVA] = "/=", [OMODA] = "%=",
- [OLSHA] = "<<=", [OARSHA] = ">>>=",
- [ORSHA] = ">>=", [OANDA] = "&=",
- [OADDA] = "+=", [OSUBA] = "-=",
- [OORA] = "|=", [OXORA] = "^=",
+ [OSUFINC] = "++", [OSUFDEC] = "--",
+ [OARRAY] = "[]", [OCALL] = "()",
+ [ODISP] = ".",
+ [ODEREF] = "*", [OINC] = "++",
+ [ODEC] = "--", [OBNOT] = "~",
+ [OLNOT] = "!", [OFLIP] = "~=",
+ [OADDR] = "&", [OPLUS] = "+",
+ [OMINUS] = "-", [OCAST] = "(type)",
+ [OMUL] = "*", [ODIV] = "/",
+ [OMOD] = "%", [OLSH] = "<<",
+ [OARSH] = ">>>", [ORSH] = ">>",
+ [OBAND] = "&",
+ [OADD] = "+", [OSUB] = "-",
+ [OBOR] = "|", [OXOR] = "^",
+ [ORANGE] = "..",
+ [OLEQ] = "<=", [OLET] = "<",
+ [OGEQ] = ">=", [OGRT] = ">",
+ [ONEQ] = "!=", [OEQU] = "==",
+ [OIDENT] = "===",
+ [OLAND] = "&&",
+ [OLOR] = "||",
+ [OASS] = "=", [OMULA] = "*=",
+ [ODIVA] = "/=", [OMODA] = "%=",
+ [OLSHA] = "<<=", [OARSHA] = ">>>=",
+ [ORSHA] = ">>=", [OANDA] = "&=",
+ [OADDA] = "+=", [OSUBA] = "-=",
+ [OORA] = "|=", [OXORA] = "^=",
/* Ast Nodes */
[ACOMMA] = ",",
[ASTMT] = "statement", [ADO] = "do-clause",
@@ -2486,7 +2491,22 @@ readatom(Source *source, int flags)
gettok(source);
lhs->kind = OLNOT;
lhs->lhs = readexpr(source, PRELAT);
+ break;
+
+ case KALIGNOF:
+ case KSIZEOF:
+ lhs = tokennode(source, NULL);
+ gettok(source);
+ lhs->lhs = readatom(source, PRELAT);
+ break;
+ case KBITCAST:
+ lhs = tokennode(source, NULL);
+ gettok(source);
+ expect(source, '(', "expected '('");
+ lhs->rhs = exprlist(source, false, NULL);
+ expect(source, ')', "expected ')'");
+ lhs->lhs = readatom(source, PRELAT);
break;
case KBREAK: