X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Flexer%2Flexer.c;h=aa681c80306b65f0cfb7f2c72f3edfae479ccead;hb=774441e68b4d2e3a4b5c6975e9614dcd4369955e;hp=317aac73e66354ad12e4c20bd69abcf1a223159a;hpb=5d6e6b3bb69323d1211e34411a8389a7e17f72ec;p=pspp diff --git a/src/language/lexer/lexer.c b/src/language/lexer/lexer.c index 317aac73e6..aa681c8030 100644 --- a/src/language/lexer/lexer.c +++ b/src/language/lexer/lexer.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 1997-9, 2000, 2006, 2009 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2006, 2009, 2010 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -40,11 +40,6 @@ #define _(msgid) gettext (msgid) #define N_(msgid) msgid - -#define DUMP_TOKENS 0 - - - struct lexer { struct string line_buffer; @@ -83,10 +78,6 @@ enum string_type }; static int parse_string (struct lexer *, enum string_type); - -#if DUMP_TOKENS -static void dump_token (struct lexer *); -#endif /* Initialization. */ @@ -176,19 +167,16 @@ lex_get (struct lexer *lexer) return; } - /* If a token was pushed ahead, return it. */ - if (lexer->put_token) - { - restore_token (lexer); -#if DUMP_TOKENS - dump_token (lexer); -#endif - return; - } + /* If a token was pushed ahead, return it. */ + if (lexer->put_token) + { + restore_token (lexer); + return; + } - for (;;) - { - /* Skip whitespace. */ + for (;;) + { + /* Skip whitespace. */ while (c_isspace ((unsigned char) *lexer->prog)) lexer->prog++; @@ -199,27 +187,18 @@ lex_get (struct lexer *lexer) { lexer->dot = 0; lexer->token = '.'; -#if DUMP_TOKENS - dump_token (lexer); -#endif return; } else if (!lex_get_line (lexer)) { lexer->prog = NULL; lexer->token = T_STOP; -#if DUMP_TOKENS - dump_token (lexer); -#endif return; } if (lexer->put_token) { restore_token (lexer); -#if DUMP_TOKENS - dump_token (lexer); -#endif return; } } @@ -394,10 +373,6 @@ lex_get (struct lexer *lexer) } break; } - -#if DUMP_TOKENS - dump_token (lexer); -#endif } /* Parses an identifier at the current position into tokid and @@ -440,31 +415,34 @@ lex_sbc_missing (struct lexer *lexer, const char *sbc) void lex_error (struct lexer *lexer, const char *message, ...) { - char *token_rep; - char where[128]; + struct string s; + + ds_init_empty (&s); - token_rep = lex_token_representation (lexer); if (lexer->token == T_STOP) - strcpy (where, "end of file"); + ds_put_cstr (&s, _("Syntax error at end of file")); else if (lexer->token == '.') - strcpy (where, "end of command"); + ds_put_cstr (&s, _("Syntax error at end of command")); else - snprintf (where, sizeof where, "`%s'", token_rep); - free (token_rep); + { + char *token_rep = lex_token_representation (lexer); + ds_put_format (&s, _("Syntax error at `%s'"), token_rep); + free (token_rep); + } if (message) { - char buf[1024]; va_list args; + ds_put_cstr (&s, ": "); + va_start (args, message); - vsnprintf (buf, 1024, message, args); + ds_put_vformat (&s, message, args); va_end (args); - - msg (SE, _("Syntax error %s at %s."), buf, where); } - else - msg (SE, _("Syntax error at %s."), where); + + msg (SE, "%s.", ds_cstr (&s)); + ds_destroy (&s); } /* Checks that we're at end of command. @@ -625,7 +603,7 @@ lex_force_match (struct lexer *lexer, int t) bool lex_force_string (struct lexer *lexer) { - if (lexer->token == T_STRING) + if (lex_is_string (lexer)) return true; else { @@ -1221,60 +1199,6 @@ finish: return T_STRING; } -#if DUMP_TOKENS -/* Reads one token from the lexer and writes a textual representation - on stdout for debugging purposes. */ -static void -dump_token (struct lexer *lexer) -{ - { - const char *curfn; - int curln; - - curln = getl_source_location (lexer->ss); - curfn = getl_source_name (lexer->ss); - if (curfn) - fprintf (stderr, "%s:%d\t", curfn, curln); - } - - switch (lexer->token) - { - case T_ID: - fprintf (stderr, "ID\t%s\n", lexer->tokid); - break; - - case T_POS_NUM: - case T_NEG_NUM: - fprintf (stderr, "NUM\t%f\n", lexer->tokval); - break; - - case T_STRING: - fprintf (stderr, "STRING\t\"%s\"\n", ds_cstr (&lexer->tokstr)); - break; - - case T_STOP: - fprintf (stderr, "STOP\n"); - break; - - case T_EXP: - fprintf (stderr, "MISC\tEXP\""); - break; - - case 0: - fprintf (stderr, "MISC\tEOF\n"); - break; - - default: - if (lex_is_keyword (lexer->token)) - fprintf (stderr, "KEYWORD\t%s\n", lex_token_name (lexer->token)); - else - fprintf (stderr, "PUNCT\t%c\n", lexer->token); - break; - } -} -#endif /* DUMP_TOKENS */ - - /* Token Accessor Functions */ int