diff options
author | Quentin Carbonneaux <quentin.carbonneaux@yale.edu> | 2015-10-04 15:17:58 -0400 |
---|---|---|
committer | Quentin Carbonneaux <quentin.carbonneaux@yale.edu> | 2015-10-04 15:17:58 -0400 |
commit | 4beee73fd38818a287c00087d3d1e3cf2a3ccfa5 (patch) | |
tree | f4617b7d3d046d02a4cd00214c9cb97d9035f103 | |
parent | 5b8b78f2f1d4ad7d82ac1c92c9aa00d01c343f32 (diff) | |
download | roux-4beee73fd38818a287c00087d3d1e3cf2a3ccfa5.tar.gz |
update miniyacc
-rw-r--r-- | minic/yacc.c | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/minic/yacc.c b/minic/yacc.c index 52fd891..91c0be7 100644 --- a/minic/yacc.c +++ b/minic/yacc.c @@ -851,7 +851,7 @@ nexttk() char * cpycode() { - int c, nest, len, pos; + int c, nest, in, len, pos; char *s; len = 64; @@ -859,17 +859,26 @@ cpycode() s[0] = '{'; pos = 1; nest = 1; + in = 0; while (nest) { c = fgetc(fin); - if (c == '{') - nest++; - if (c == '}') - nest--; - if (c == EOF) - die("syntax error, unclosed code block"); - if (c == '\n') - lineno++; + if (in) { + if (c == in) + if (s[pos-1] != '\\') + in = 0; + } else { + if (c == '"' || c == '\'') + in = c; + if (c == '{') + nest++; + if (c == '}') + nest--; + if (c == EOF) + die("syntax error, unclosed code block"); + if (c == '\n') + lineno++; + } if (pos>=len) if (!(s=realloc(s, len=2*len+1))) die("out of memory"); |