From f282676b7e6c9ae1b66233dbfc522bb685c3ece2 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Mon, 16 Oct 2000 18:08:35 +0000 Subject: [PATCH] * src/lex.c (read_typename): New function. (lex): Use it. * src/reader.c (copy_dollar): Likewise. --- ChangeLog | 7 +++++++ src/lex.c | 53 +++++++++++++++++++++++++++++++--------------------- src/lex.h | 1 + src/reader.c | 23 +++++++---------------- src/symtab.h | 3 +++ 5 files changed, 50 insertions(+), 37 deletions(-) diff --git a/ChangeLog b/ChangeLog index 77af1165..9fb13c39 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2000-10-16 Akim Demaille + + * src/lex.c (read_typename): New function. + (lex): Use it. + * src/reader.c (copy_dollar): Likewise. + + 2000-10-16 Akim Demaille * src/reader.c (copy_comment2): Expect the input stream to be on diff --git a/src/lex.c b/src/lex.c index 1d07bc3e..c5d73082 100644 --- a/src/lex.c +++ b/src/lex.c @@ -323,6 +323,37 @@ unlex (int token) unlexed_symval = symval; } +/*-----------------------------------------------------------------. +| We just read `<' from FIN. Store in TOKEN_BUFFER, the type name | +| specified between the `<...>'. | +`-----------------------------------------------------------------*/ + +void +read_type_name (FILE *fin) +{ + char *p = token_buffer; + int c = getc (fin); + + while (c != '>') + { + if (c == EOF) + fatal (_("unterminated type name at end of file")); + if (c == '\n') + { + complain (_("unterminated type name")); + ungetc (c, fin); + break; + } + + if (p == token_buffer + maxtoken) + p = grow_token_buffer (p); + + *p++ = c; + c = getc (fin); + } + *p = 0; +} + int lex (void) @@ -488,29 +519,9 @@ lex (void) } case '<': - p = token_buffer; - c = getc (finput); - while (c != '>') - { - if (c == EOF) - fatal (_("unterminated type name at end of file")); - if (c == '\n') - { - complain (_("unterminated type name")); - ungetc (c, finput); - break; - } - - if (p == token_buffer + maxtoken) - p = grow_token_buffer (p); - - *p++ = c; - c = getc (finput); - } - *p = 0; + read_type_name (finput); return TYPENAME; - case '%': return parse_percent_token (); diff --git a/src/lex.h b/src/lex.h index 3831e5af..54d5022c 100644 --- a/src/lex.h +++ b/src/lex.h @@ -62,6 +62,7 @@ char *grow_token_buffer PARAMS ((char *)); void init_lex PARAMS ((void)); int skip_white_space PARAMS ((void)); void unlex PARAMS ((int)); +void read_type_name PARAMS ((FILE *fin)); /* Return one of the token-type codes. When an identifier is seen, the code IDENTIFIER is returned and the name is looked up in the diff --git a/src/reader.c b/src/reader.c index c8d48067..0b2f643f 100644 --- a/src/reader.c +++ b/src/reader.c @@ -344,22 +344,12 @@ copy_dollar (FILE *fin, FILE *fout, int c = getc (fin); char *type_name = NULL; - /* Get the typename if explicit. */ + /* Get the type name if explicit. */ if (c == '<') { - char *cp = token_buffer; - - while ((c = getc (fin)) != '>' && c > 0) - { - if (cp == token_buffer + maxtoken) - cp = grow_token_buffer (cp); - - *cp++ = c; - } - *cp = 0; + read_type_name (fin); type_name = token_buffer; value_components_used = 1; - c = getc (fin); } @@ -1372,9 +1362,9 @@ readgram (void) { bucket *sdummy; - /* Since the action was written out with this rule's */ - /* number, we must give the new rule this number */ - /* by inserting the new rule before it. */ + /* Since the action was written out with this rule's + number, we must give the new rule this number by + inserting the new rule before it. */ /* Make a dummy nonterminal, a gensym. */ sdummy = gensym (); @@ -1395,7 +1385,8 @@ readgram (void) p->next = crule1; crule1->next = crule; - /* insert the dummy generated by that rule into this rule. */ + /* Insert the dummy generated by that rule into this + rule. */ nitems++; p = XCALLOC (symbol_list, 1); p->sym = sdummy; diff --git a/src/symtab.h b/src/symtab.h index c68ec8fe..354fb8fd 100644 --- a/src/symtab.h +++ b/src/symtab.h @@ -39,7 +39,10 @@ typedef struct bucket { struct bucket *link; struct bucket *next; + + /* The key, name of the symbol. */ char *tag; + /* Its type. */ char *type_name; short value; short prec; -- 2.47.2