lexer: New function lex_force_string_or_id().
[pspp-builds.git] / src / language / lexer / q2c.c
index 73602bd6699d956d253b9cb0607efa47fdc46230..5473e1120946c1ed14a5ae95f89c5c2e21edfd37 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 1997-9, 2000, 2008, 2010 Free Software Foundation, Inc.
+   Copyright (C) 1997-9, 2000, 2008, 2010, 2011 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
@@ -1425,7 +1425,7 @@ make_match (const char *t)
   else if (strchr (t, hyphen_proxy))
     {
       char *c = unmunge (t);
-      sprintf (s, "lex_match_hyphenated_word (lexer, \"%s\")", c);
+      sprintf (s, "lex_match_phrase (lexer, \"%s\")", c);
       free (c);
     }
   else
@@ -1498,12 +1498,11 @@ dump_specifier_parse (const specifier *spec, const subcommand *sbc)
                }
              else
                {
-                 dump (1, "if (!lex_match (lexer, T_RPAREN))");
+                 dump (1, "if (!lex_match (lexer, T_LPAREN))");
                  dump (1, "{");
-                 dump (0, "msg (SE, _(\"`(' expected after %s "
-                       "specifier of %s subcommand.\"));",
-                       s->specname, sbc->name);
-                 dump (0, "goto lossage;");
+                 dump (0, "lex_error_expecting (lexer, \"`('\", "
+                        "NULL_SENTINEL);");
+                  dump (0, "goto lossage;");
                  dump (-1, "}");
                  outdent ();
                }
@@ -1511,38 +1510,22 @@ dump_specifier_parse (const specifier *spec, const subcommand *sbc)
 
          if (s->value == VAL_INT)
            {
-             dump (1, "if (!lex_is_integer (lexer))");
-             dump (1, "{");
-             dump (0, "msg (SE, _(\"%s specifier of %s subcommand "
-                   "requires an integer argument.\"));",
-                   s->specname, sbc->name);
+             dump (1, "if (!lex_force_int (lexer))");
              dump (0, "goto lossage;");
-             dump (-1, "}");
              dump (-1, "p->%s%s = lex_integer (lexer);",
                    sbc->prefix, st_lower (s->valname));
            }
          else if (s->value == VAL_DBL)
            {
-             dump (1, "if (!lex_is_number (lexer))");
-             dump (1, "{");
-             dump (0, "msg (SE, _(\"Number expected after %s "
-                   "specifier of %s subcommand.\"));",
-                   s->specname, sbc->name);
+             dump (1, "if (!lex_force_num (lexer))");
              dump (0, "goto lossage;");
-             dump (-1, "}");
              dump (-1, "p->%s%s = lex_tokval (lexer);", sbc->prefix,
                    st_lower (s->valname));
            }
           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));
@@ -1577,13 +1560,8 @@ dump_specifier_parse (const specifier *spec, const subcommand *sbc)
 
          if (s->valtype == VT_PAREN)
            {
-             dump (1, "if (!lex_match (lexer, T_RPAREN))");
-             dump (1, "{");
-             dump (0, "msg (SE, _(\"`)' expected after argument for "
-                   "%s specifier of %s.\"));",
-                   s->specname, sbc->name);
+             dump (1, "if (!lex_force_match (lexer, T_RPAREN))");
              dump (0, "goto lossage;");
-             dump (-1, "}");
              outdent ();
              if (s->optvalue)
                {
@@ -1836,12 +1814,12 @@ dump_parser (int persistent)
       if (def->type == SBC_VARLIST)
        dump (1, "if (lex_token (lexer) == T_ID "
               "&& dict_lookup_var (dataset_dict (ds), lex_tokcstr (lexer)) != NULL "
-             "&& lex_look_ahead (lexer) != '=')");
+             "&& lex_next_token (lexer, 1) != T_EQUALS)");
       else
        {
          dump (0, "if ((lex_token (lexer) == T_ID "
                 "&& dict_lookup_var (dataset_dict (ds), lex_tokcstr (lexer)) "
-               "&& lex_look_ahead () != '=')");
+               "&& lex_next_token (lexer, 1) != T_EQUALS)");
          dump (1, "     || token == T_ALL)");
        }
       dump (1, "{");
@@ -1891,8 +1869,7 @@ dump_parser (int persistent)
          {
            dump (1, "if (p->sbc_%s > 1)", st_lower (sbc->name));
            dump (1, "{");
-           dump (0, "msg (SE, _(\"%s subcommand may be given only once.\"));",
-                 sbc->name);
+            dump (0, "lex_sbc_only_once (\"%s\");", sbc->name);
            dump (0, "goto lossage;");
            dump (-1, "}");
            outdent ();
@@ -1946,8 +1923,7 @@ dump_parser (int persistent)
          {
            dump (0, "if ( 0 == p->sbc_%s)", st_lower (sbc->name));
            dump (1, "{");
-           dump (0, "msg (SE, _(\"%s subcommand must be given.\"));",
-                 sbc->name);
+           dump (0, "lex_sbc_missing (\"%s\");", sbc->name);
            dump (0, "goto lossage;");
            dump (-1, "}");
            dump_blank_line (0);
@@ -2128,17 +2104,19 @@ main (int argc, char *argv[])
          indent = 0;
 
          dump (0, "#include <stdlib.h>");
-         dump (0, "#include <libpspp/assertion.h>");
-         dump (0, "#include <libpspp/message.h>");
-         dump (0, "#include <language/lexer/lexer.h>");
-         dump (0, "#include <language/lexer/variable-parser.h>");
-          dump (0, "#include <data/settings.h>");
-         dump (0, "#include <libpspp/str.h>");
-          dump (0, "#include <language/lexer/subcommand-list.h>");
-         dump (0, "#include <data/variable.h>");
+          dump_blank_line (0);
+
+          dump (0, "#include \"data/settings.h\"");
+         dump (0, "#include \"data/variable.h\"");
+         dump (0, "#include \"language/lexer/lexer.h\"");
+          dump (0, "#include \"language/lexer/subcommand-list.h\"");
+         dump (0, "#include \"language/lexer/variable-parser.h\"");
+         dump (0, "#include \"libpspp/assertion.h\"");
+         dump (0, "#include \"libpspp/message.h\"");
+         dump (0, "#include \"libpspp/str.h\"");
          dump_blank_line (0);
 
-          dump (0, "#include \"xalloc.h\"");
+          dump (0, "#include \"gl/xalloc.h\"");
          dump_blank_line (0);
 
           dump (0, "#include \"gettext.h\"");