summaryrefslogtreecommitdiff
path: root/lisc
diff options
context:
space:
mode:
authorQuentin Carbonneaux <quentin.carbonneaux@yale.edu>2015-10-07 18:30:19 -0400
committerQuentin Carbonneaux <quentin.carbonneaux@yale.edu>2015-10-07 18:30:19 -0400
commitb93b0d2902bae928edd960ae4d373f5e0033e39e (patch)
treec1b2d8b43378b9913c64e95ec85e8da5688a2e3a /lisc
parent01c1734e42d49202aaa1362b18a428d0d7ae0c3f (diff)
downloadroux-b93b0d2902bae928edd960ae4d373f5e0033e39e.tar.gz
start work on parsing data blocks
Diffstat (limited to 'lisc')
-rw-r--r--lisc/parse.c44
1 files changed, 43 insertions, 1 deletions
diff --git a/lisc/parse.c b/lisc/parse.c
index 05cb32c..70cdb55 100644
--- a/lisc/parse.c
+++ b/lisc/parse.c
@@ -638,7 +638,7 @@ parsetyp()
t = nextnl();
if (t == TAlign) {
if (nextnl() != TNum)
- err("alignment value expected");
+ err("alignment expected");
for (al=0; tokval.num /= 2; al++)
;
ty->align = al;
@@ -711,6 +711,48 @@ parsetyp()
err("expected closing }");
}
+typedef struct Dat Dat;
+
+struct Dat {
+ enum {
+ DName,
+ DAlign,
+ DA,
+ DB,
+ DH,
+ DW,
+ DL
+ } type;
+ union {
+ long long num;
+ char *str;
+ } u;
+};
+
+static void
+parsedat(void cb(Dat *))
+{
+ int t;
+ Dat d;
+
+ if (nextnl() != TGlo || nextnl() != TEq)
+ err("data name, then = expected");
+ d.type = DName;
+ d.u.str = tokval.str;
+ cb(&d);
+ t = nextnl();
+ if (t == TAlign) {
+ if (nextnl() != TNum)
+ err("alignment expected");
+ d.type = DAlign;
+ d.u.num = tokval.num;
+ cb(&d);
+ t = nextnl();
+ }
+ if (t != TLBrace)
+ err("data contents must start with {");
+}
+
Fn *
parse(FILE *f)
{