diff options
author | Michael Forney <mforney@mforney.org> | 2019-05-14 14:34:23 -0700 |
---|---|---|
committer | Quentin Carbonneaux <quentin@c9x.me> | 2019-05-15 10:20:12 +0200 |
commit | 9e7e5bffc4e4af37a6c29657ba87fbb6a1123cf2 (patch) | |
tree | 9273d3f42153ce7d08db6ad6c97bb4852ebd2d0a /parse.c | |
parent | 72f2e8445adaeeb4916690263f65d6b61ffa5c1d (diff) | |
download | roux-9e7e5bffc4e4af37a6c29657ba87fbb6a1123cf2.tar.gz |
Allow specifying literal global names
Diffstat (limited to 'parse.c')
-rw-r--r-- | parse.c | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/parse.c b/parse.c index c6f16ea..c4c1fe6 100644 --- a/parse.c +++ b/parse.c @@ -227,15 +227,20 @@ lex() return Tfltd; case '%': t = Ttmp; + c = fgetc(inf); goto Alpha; case '@': t = Tlbl; + c = fgetc(inf); goto Alpha; case '$': t = Tglo; + if ((c = fgetc(inf)) == '"') + goto Quoted; goto Alpha; case ':': t = Ttyp; + c = fgetc(inf); goto Alpha; case '#': while ((c=fgetc(inf)) != '\n' && c != EOF) @@ -251,23 +256,25 @@ lex() return Tint; } if (c == '"') { - tokval.str = vnew(0, 1, Pfn); + t = Tstr; + Quoted: + tokval.str = vnew(2, 1, Pfn); + tokval.str[0] = c; esc = 0; - for (i=0;; i++) { + for (i=1;; i++) { c = fgetc(inf); if (c == EOF) err("unterminated string"); - vgrow(&tokval.str, i+1); + vgrow(&tokval.str, i+2); + tokval.str[i] = c; if (c == '"' && !esc) { - tokval.str[i] = 0; - return Tstr; + tokval.str[i+1] = 0; + return t; } esc = (c == '\\' && !esc); - tokval.str[i] = c; } } - if (0) -Alpha: c = fgetc(inf); +Alpha: if (!isalpha(c) && c != '.' && c != '_') err("invalid character %c (%d)", c, c); i = 0; |