From: Robert Anisko Date: Thu, 25 Apr 2002 14:36:38 +0000 (+0000) Subject: * src/scan-skel.l: Postprocess quadrigraphs. X-Git-Tag: BISON-1_49a~9 X-Git-Url: https://git.saurik.com/bison.git/commitdiff_plain/2b7ed18a60c1e3618d189ff773aa9679ebec12a1?hp=34a89c506630ce3e5aaee4259b110f7d61187438 * src/scan-skel.l: Postprocess quadrigraphs. * src/reader.c (copy_character): New function, used to output single characters while replacing `[' and `]' with quadrigraphs, to avoid troubles with M4 quotes. (copy_comment): Output characters with copy_character. (read_additionnal_code): Likewise. (copy_string2): Likewise. (copy_definition): Likewise. * tests/calc.at: Exercise M4 quoting. --- diff --git a/ChangeLog b/ChangeLog index 405359b3..9dbb7318 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2002-04-25 Robert Anisko + + * src/scan-skel.l: Postprocess quadrigraphs. + + * src/reader.c (copy_character): New function, used to output + single characters while replacing `[' and `]' with quadrigraphs, to + avoid troubles with M4 quotes. + (copy_comment): Output characters with copy_character. + (read_additionnal_code): Likewise. + (copy_string2): Likewise. + (copy_definition): Likewise. + + * tests/calc.at: Exercise M4 quoting. + 2002-04-25 Akim Demaille * tests/sets.at (AT_EXTRACT_SETS): Sed portability issue: no space diff --git a/src/reader.c b/src/reader.c index 099f32da..3375fa2a 100644 --- a/src/reader.c +++ b/src/reader.c @@ -332,6 +332,28 @@ get_type_name (int n, symbol_list *rule) return rp->sym->type_name; } +/*------------------------------------------------------------------. +| Copy the character C to OOUT, and insert quadigraphs when needed. | +`------------------------------------------------------------------*/ + +static inline void +copy_character (struct obstack *oout, int c) +{ + switch (c) + { + case '[': + obstack_sgrow (oout, "@<:@"); + break; + + case ']': + obstack_sgrow (oout, "@:>@"); + break; + + default: + obstack_1grow (oout, c); + } +} + /*------------------------------------------------------------. | Dump the string from FIN to OOUT if non null. MATCH is the | | delimiter of the string (either ' or "). | @@ -359,14 +381,14 @@ copy_string2 (FILE *fin, struct obstack *oout, int match, int store) continue; } - obstack_1grow (oout, c); + copy_character (oout, c); if (c == '\\') { c = getc (fin); if (c == EOF) fatal (_("unterminated string at end of file")); - obstack_1grow (oout, c); + copy_character (oout, c); if (c == '\n') ++lineno; @@ -463,7 +485,7 @@ copy_comment (FILE *fin, struct obstack *oout) fatal (_("unterminated comment")); else { - obstack_1grow (oout, c); + copy_character (oout, c); c = getc (fin); } } @@ -634,7 +656,7 @@ copy_definition (struct obstack *oout) fatal ("%s", _("unterminated `%{' definition")); default: - obstack_1grow (oout, c); + copy_character (oout, c); } c = getc (finput); @@ -1666,7 +1688,7 @@ read_additionnal_code (void) } while ((c = getc (finput)) != EOF) - obstack_1grow (&el_obstack, c); + copy_character (&el_obstack, c); obstack_1grow (&el_obstack, 0); muscle_insert ("epilogue", obstack_finish (&el_obstack)); diff --git a/src/scan-skel.l b/src/scan-skel.l index 9a01ffef..e7eeaa56 100644 --- a/src/scan-skel.l +++ b/src/scan-skel.l @@ -38,9 +38,12 @@ static char *yyoutname = NULL; yylineno = 1; } +"@<:@" fputc ('[', yyout); +"@:>@" fputc (']', yyout); + "__oline__" fprintf (yyout, "%d", yylineno); "__ofile__" fprintf (yyout, "%s", yyoutname); -[^_\n]+ ECHO; +[^@_\n]+ ECHO; \n+ yylineno += yyleng; ECHO; . ECHO; diff --git a/tests/calc.at b/tests/calc.at index ecd4c673..2cc0757f 100644 --- a/tests/calc.at +++ b/tests/calc.at @@ -67,6 +67,8 @@ typedef int value_t; %} +/* Exercise M4 quoting: '@:>@@:>@', 0. */ + /* Also exercise %union. */ %union { @@ -76,6 +78,9 @@ typedef int value_t; /* Exercise post-prologue dependency to %union. */ %{ static void id (YYSTYPE *lval); + +/* Exercise quotes in declarations. */ +char quote[] = "@:>@@:>@,"; %} /* Bison Declarations */ @@ -83,6 +88,9 @@ static void id (YYSTYPE *lval); %token NUM "number" %type exp +/* Exercise quotes in strings. */ +%token "fake @>:@@>:@," + %nonassoc '=' /* comparison */ %left '-' '+' %left '*' '/' @@ -100,9 +108,14 @@ input: line: '\n' -| exp '\n' {} +| exp '\n' + { + /* Exercise quotes in braces. */ + char tmp[] = "@>:@@:>@,"; + } ; +/* Exercise M4 quoting: '@:>@@:>@', 1. */ exp: NUM { $$ = $1; } | exp '=' exp @@ -124,6 +137,7 @@ exp: /* The input. */ FILE *yyin; +/* Exercise M4 quoting: '@:>@@:>@', 2. */ static void yyerror (const char *s) {