X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flexer.c;h=568a87e316654c45b3b979460d8805bf0c9f8261;hb=fad826ff86720f76220b05e00dc7dfa46e418859;hp=e573bbb7818f9b3cce8d07fe9edd9b930c8936bc;hpb=eeb3352d718b0cd85afab3f7a7466fcac7791c1c;p=pspp-builds.git diff --git a/src/lexer.c b/src/lexer.c index e573bbb7..568a87e3 100644 --- a/src/lexer.c +++ b/src/lexer.c @@ -44,14 +44,14 @@ /* Current token. */ int token; -/* T_NUM: the token's value. */ +/* T_POS_NUM, T_NEG_NUM: the token's value. */ double tokval; /* T_ID: the identifier. */ -char tokid[9]; +char tokid[LONG_NAME_LEN + 1]; /* T_ID, T_STRING: token string value. - For T_ID, this is not truncated to 8 characters as is tokid. */ + For T_ID, this is not truncated to SHORT_NAME_LEN characters as is tokid. */ struct string tokstr; /* Static variables. */ @@ -81,7 +81,6 @@ static struct string put_tokstr; static double put_tokval; static void unexpected_eof (void); -static inline int check_id (const char *id, size_t len); static void convert_numeric_string_to_char_string (int type); static int parse_string (int type); @@ -117,8 +116,8 @@ restore_token (void) assert (put_token != 0); token = put_token; ds_replace (&tokstr, ds_c_str (&put_tokstr)); - strncpy (tokid, ds_c_str (&put_tokstr), 8); - tokid[8] = 0; + strncpy (tokid, ds_c_str (&put_tokstr), SHORT_NAME_LEN); + tokid[SHORT_NAME_LEN] = 0; tokval = put_tokval; put_token = 0; } @@ -138,6 +137,8 @@ save_token (void) void lex_get (void) { + int i; + /* If a token was pushed ahead, return it. */ if (put_token) { @@ -224,8 +225,11 @@ lex_get (void) token = '-'; break; } + token = T_NEG_NUM; } - + else + token = T_POS_NUM; + /* Parse the number, copying it into tokstr. */ while (isdigit ((unsigned char) *prog)) ds_putc (&tokstr, *prog++); @@ -256,7 +260,6 @@ lex_get (void) ds_putc (&tokstr, '0'); } - token = T_NUM; break; } @@ -353,15 +356,19 @@ lex_get (void) } /* Copy id to tokstr. */ - ds_putc (&tokstr, toupper ((unsigned char) *prog++)); + ds_putc (&tokstr, *prog++); while (CHAR_IS_IDN (*prog)) - ds_putc (&tokstr, toupper ((unsigned char) *prog++)); + ds_putc (&tokstr, *prog++); - /* Copy tokstr to tokid, truncating it to 8 characters. */ - strncpy (tokid, ds_c_str (&tokstr), 8); - tokid[8] = 0; + /* Copy tokstr to tokid, truncating it to LONG_NAME_LEN characters.*/ + strncpy (tokid, ds_c_str (&tokstr), LONG_NAME_LEN); + tokid[LONG_NAME_LEN] = 0; - token = check_id (ds_c_str (&tokstr), ds_length (&tokstr)); + /* Convert to upper case */ + for ( i = 0 ; i < ds_length(&tokstr) ; ++i ) + tokstr.string[i] = toupper(tokstr.string[i]); + + token = lex_id_to_token (ds_c_str (&tokstr), ds_length (&tokstr)); break; default: @@ -425,11 +432,27 @@ lex_end_of_command (void) /* Token testing functions. */ -/* Returns nonzero if the current token is an integer. */ -int -lex_integer_p (void) +/* Returns true if the current token is a number. */ +bool +lex_is_number (void) +{ + return token == T_POS_NUM || token == T_NEG_NUM; +} + +/* Returns the value of the current token, which must be a + floating point number. */ +double +lex_number (void) +{ + assert (lex_is_number ()); + return tokval; +} + +/* Returns true iff the current token is an integer. */ +bool +lex_is_integer (void) { - return (token == T_NUM + return (lex_is_number () && tokval != NOT_LONG && tokval >= LONG_MIN && tokval <= LONG_MAX @@ -441,26 +464,9 @@ lex_integer_p (void) long lex_integer (void) { - assert (lex_integer_p ()); - return tokval; -} -/* Returns nonzero if the current token is an floating point. */ -int -lex_double_p (void) -{ - return ( token == T_NUM - && tokval != NOT_DOUBLE ); -} - -/* Returns the value of the current token, which must be a - floating point number. */ -double -lex_double (void) -{ - assert (lex_double_p ()); + assert (lex_is_integer ()); return tokval; } - /* Token matching functions. */ @@ -498,7 +504,7 @@ lex_match_id (const char *s) int lex_match_int (int x) { - if (lex_integer_p () && lex_integer () == x) + if (lex_is_integer () && lex_integer () == x) { lex_get (); return 1; @@ -563,7 +569,7 @@ lex_force_string (void) int lex_force_int (void) { - if (lex_integer_p ()) + if (lex_is_integer ()) return 1; else { @@ -577,7 +583,7 @@ lex_force_int (void) int lex_force_num (void) { - if (token == T_NUM) + if (lex_is_number ()) return 1; else { @@ -635,6 +641,23 @@ lex_id_match (const char *kw, const char *tok) { return lex_id_match_len (kw, strlen (kw), tok, strlen (tok)); } + +/* Returns the proper token type, either T_ID or a reserved keyword + enum, for ID[], which must contain LEN characters. */ +int +lex_id_to_token (const char *id, size_t len) +{ + const char **kwp; + + if (len < 2 || len > 4) + return T_ID; + + for (kwp = keywords; *kwp; kwp++) + if (!strcasecmp (*kwp, id)) + return T_FIRST_KEYWORD + (kwp - keywords); + + return T_ID; +} /* Weird token functions. */ @@ -697,8 +720,8 @@ lex_put_back_id (const char *id) save_token (); token = T_ID; ds_replace (&tokstr, id); - strncpy (tokid, ds_c_str (&tokstr), 8); - tokid[8] = 0; + strncpy (tokid, ds_c_str (&tokstr), SHORT_NAME_LEN); + tokid[SHORT_NAME_LEN] = 0; } /* Weird line processing functions. */ @@ -877,7 +900,8 @@ lex_token_representation (void) switch (token) { case T_ID: - case T_NUM: + case T_POS_NUM: + case T_NEG_NUM: return xstrdup (ds_c_str (&tokstr)); break; @@ -952,9 +976,9 @@ lex_token_representation (void) void lex_negative_to_dash (void) { - if (token == T_NUM && tokval < 0.0) + if (token == T_NEG_NUM) { - token = T_NUM; + token = T_POS_NUM; tokval = -tokval; ds_replace (&tokstr, ds_c_str (&tokstr) + 1); save_token (); @@ -1000,23 +1024,6 @@ unexpected_eof (void) msg (FE, _("Unexpected end of file.")); } -/* Returns the proper token type, either T_ID or a reserved keyword - enum, for ID[], which must contain LEN characters. */ -static inline int -check_id (const char *id, size_t len) -{ - const char **kwp; - - if (len < 2 || len > 4) - return T_ID; - - for (kwp = keywords; *kwp; kwp++) - if (!strcmp (*kwp, id)) - return T_FIRST_KEYWORD + (kwp - keywords); - - return T_ID; -} - /* When invoked, tokstr contains a string of binary, octal, or hex digits, for values of TYPE of 0, 1, or 2, respectively. The string is converted to characters having the specified values. */ @@ -1216,7 +1223,8 @@ dump_token (void) fprintf (stderr, "ID\t%s\n", tokid); break; - case T_NUM: + case T_POS_NUM: + case T_NEG_NUM: fprintf (stderr, "NUM\t%f\n", tokval); break;