ref: e01f61f0d55b37630264e8d74107199752a6e76f
parent: c2086cda32afb3960938a81df6f5a6a209bfaf33
author: Jacob Moody <moody@posixcafe.org>
date: Fri Apr 26 01:51:47 EDT 2024
string literals and tweak call parsing Not exactly sure why using expr for the args is causing yacc to give reduce conflicts but I am not particularly tied to that grammer for now.
--- a/dat.h
+++ b/dat.h
@@ -80,6 +80,12 @@
Orcv,
};
+enum {
+ Lint,
+ Lstr,
+ Lfloat,
+};
+
struct Nod {
int t;
Loc loc;
@@ -111,7 +117,12 @@
Nod *f;
} nif;
struct {
- vlong val;
+ int t;
+ union {
+ vlong i;
+ double d;
+ char *s;
+ };
} lit;
struct {
char *sym;
--- a/fmt.c
+++ b/fmt.c
@@ -56,7 +56,14 @@
case Nsym:
return fmtprint(f, "%s", n->sym.sym);
case Nlit:
- return fmtprint(f, "%lld", n->lit.val);
+ switch(n->lit.t){
+ case Lint:
+ return fmtprint(f, "%lld", n->lit.i);
+ case Lstr:
+ return fmtprint(f, "\"%s\"", n->lit.s);
+ default:
+ return fmtprint(f, "\n#error unknown literal type\n");
+ }
case Nexpr:
if(n->expr.op == Olit || n->expr.op == Ovar)
return fmtprint(f, "%N", n->expr.lhs);
@@ -116,7 +123,14 @@
case Nsym:
return fmtprint(f, "%s", n->sym.sym);
case Nlit:
- return fmtprint(f, "%lld", n->lit.val);
+ switch(n->lit.t){
+ case Lint:
+ return fmtprint(f, "%lld", n->lit.i);
+ case Lstr:
+ return fmtprint(f, "\"%s\"", n->lit.s);
+ default:
+ return fmtprint(f, "\n#error unknown literal type\n");
+ }
case Nexpr:
if(n->expr.op == Olit || n->expr.op == Ovar)
return fmtprint(f, "%O", n->expr.lhs);
--- a/fns.h
+++ b/fns.h
@@ -6,7 +6,8 @@
Nod* mkif(Nod*, Nod*, Nod*);
Nod* mkfunc(char*, Nlst, Typ*, Nlst);
Nod* mkcall(char*, Nlst);
-Nod* mklit(vlong);
+Nod* mkintlit(vlong);
+Nod* mkstrlit(char*);
Nod* mksym(char*);
Nod* mkdecl(char*, Typ*, Nod*);
Nod* mkblk(Nlst);
--- a/n.y
+++ b/n.y
@@ -74,7 +74,7 @@
type
: NAME { $$ = mktype($1, Tunkn); }
| type '[' ']' { $$ = mktyslice($1); }
-| type '[' NUM ']' { $$ = mktyarray($1, mklit($3)); }
+| type '[' NUM ']' { $$ = mktyarray($1, mkintlit($3)); }
| type '!' { $$ = $1; $$->linear = 1; }
return
@@ -82,14 +82,15 @@
| { $$ = mktype("void", Tvoid); }
unary
-: NUM { $$ = mkexpr(Olit, mklit($1), nil); }
+: NUM { $$ = mkexpr(Olit, mkintlit($1), nil); }
| NAME { $$ = mkexpr(Ovar, mksym($1), nil); }
+| '"' NAME '"' { $$ = mkstrlit($2); }
| '(' expr ')' { $$ = $2; }
-| NAME '(' args ')' { $$ = mkcall($1, $3); }
sufexpr
: sufexpr DEC { $$ = mkexpr(Odec, $1, nil); }
| sufexpr INC { $$ = mkexpr(Oinc, $1, nil); }
+| NAME '(' args ')' { $$ = mkcall($1, $3); }
| unary { $$ = $1; }
prefexpr
@@ -161,10 +162,11 @@
| defarg { $$ = append(ZL, $1); }
| defargs ',' defarg { $$ = append($1, $3); }
+/* TODO: should be expr */
args
-: { $$ = ZL; }
-| expr { $$ = append(ZL, $1); }
-| args ',' expr { $$ = append($1, $3); }
+: { $$ = ZL; }
+| logexpr { $$ = append(ZL, $1); }
+| args ',' logexpr { $$ = append($1, $3); }
%%
--- a/nod.c
+++ b/nod.c
@@ -115,12 +115,24 @@
}
Nod*
-mklit(vlong v)
+mkintlit(vlong v)
{
Nod *n;
n = new(Nlit);
- n->lit.val = v;
+ n->lit.t = Lint;
+ n->lit.i = v;
+ return n;
+}
+
+Nod*
+mkstrlit(char *s)
+{
+ Nod *n;
+
+ n = new(Nlit);
+ n->lit.t = Lstr;
+ n->lit.s = s;
return n;
}