lexer: New function lex_force_string_or_id().
authorBen Pfaff <blp@cs.stanford.edu>
Sun, 6 Nov 2011 03:02:54 +0000 (20:02 -0700)
committerBen Pfaff <blp@cs.stanford.edu>
Sun, 6 Nov 2011 16:19:23 +0000 (08:19 -0800)
This new function removes a string from q2c.c that requires
translation but currently cannot be translated.

src/language/lexer/lexer.c
src/language/lexer/lexer.h
src/language/lexer/q2c.c
src/language/utilities/include.c

index bbb005938fc8b0962a1447f3cafd43fb2ecabad3..e72a3e47bc9637d93ad3c1f764b7099686df6d3d 100644 (file)
@@ -625,6 +625,21 @@ lex_force_string (struct lexer *lexer)
     }
 }
 
+/* If the current token is a string or an identifier, does nothing and returns
+   true.  Otherwise, reports an error and returns false.
+
+   This is meant for use in syntactic situations where we want to encourage the
+   user to supply a quoted string, but for compatibility we also accept
+   identifiers.  (One example of such a situation is file names.)  Therefore,
+   the error message issued when the current token is wrong only says that a
+   string is expected and doesn't mention that an identifier would also be
+   accepted. */
+bool
+lex_force_string_or_id (struct lexer *lexer)
+{
+  return lex_is_integer (lexer) || lex_force_string (lexer);
+}
+
 /* If the current token is an integer, does nothing and returns true.
    Otherwise, reports an error and returns false. */
 bool
index 17129c2bbe2fa9eae26e4db0045515118febcb76..a6be161fe100ceb5919871b05601f1efd2e03e2f 100644 (file)
@@ -128,6 +128,7 @@ bool lex_force_int (struct lexer *);
 bool lex_force_num (struct lexer *);
 bool lex_force_id (struct lexer *);
 bool lex_force_string (struct lexer *);
+bool lex_force_string_or_id (struct lexer *);
 
 /* Token accessors. */
 enum token_type lex_token (const struct lexer *);
index 48f7d33b2832112e5550e3092b47b6774056b921..5473e1120946c1ed14a5ae95f89c5c2e21edfd37 100644 (file)
@@ -1524,14 +1524,8 @@ dump_specifier_parse (const specifier *spec, const subcommand *sbc)
            }
           else if (s->value == VAL_STRING)
             {
-              dump (1, "if (lex_token (lexer) != T_ID "
-                    "&& !lex_is_string (lexer))");
-              dump (1, "{");
-              dump (0, "msg (SE, _(\"%s specifier of %s subcommand "
-                    "requires a string argument.\"));",
-                   s->specname, sbc->name);
+              dump (1, "if (!lex_force_string_or_id (lexer))");
              dump (0, "goto lossage;");
-             dump (-1, "}");
               dump (-1, "free (p->%s%s);", sbc->prefix, st_lower (s->valname));
               dump (0, "p->%s%s = ss_xstrdup (ss_tokss (lexer));",
                     sbc->prefix, st_lower (s->valname));
index 89da3b9bf517b86f7dff167a0acec0842c014852..a05456e2a2e8ff7366556865d1eb1e40b023f239 100644 (file)
@@ -59,12 +59,8 @@ do_insert (struct lexer *lexer, struct dataset *ds, enum variant variant)
   if (lex_match_id (lexer, "FILE"))
     lex_match (lexer, T_EQUALS);
 
-  /* File name can be identifier or string. */
-  if (lex_token (lexer) != T_ID && !lex_is_string (lexer))
-    {
-      lex_error (lexer, _("expecting file name"));
-      return CMD_FAILURE;
-    }
+  if (!lex_force_string_or_id (lexer))
+    return CMD_FAILURE;
 
   relative_name = utf8_to_filename (lex_tokcstr (lexer)); 
   filename = include_path_search (relative_name);