lexer: New functions lex_spec_missing(), lex_spec_only_once().
authorBen Pfaff <blp@cs.stanford.edu>
Sat, 5 Nov 2011 23:34:56 +0000 (16:34 -0700)
committerBen Pfaff <blp@cs.stanford.edu>
Sun, 6 Nov 2011 16:19:23 +0000 (08:19 -0800)
These functions don't have many users yet but they make logical
sense to me.

src/language/dictionary/mrsets.c
src/language/lexer/lexer.c
src/language/lexer/lexer.h
tests/language/dictionary/mrsets.at

index 621cdc884b1e2fff1eaa256a30314243e242f201..2f7c8f6d29ea1601cb23bb7d0b78048dc0eb014a 100644 (file)
@@ -205,14 +205,12 @@ parse_group (struct lexer *lexer, struct dictionary *dict,
 
   if (mrset->name == NULL)
     {
-      msg (SE, _("Required %s specification missing from %s subcommand."),
-           "NAME", subcommand_name);
+      lex_spec_missing (lexer, subcommand_name, "NAME");
       goto error;
     }
   else if (mrset->n_vars == 0)
     {
-      msg (SE, _("Required %s specification missing from %s subcommand."),
-           "VARIABLES", subcommand_name);
+      lex_spec_missing (lexer, subcommand_name, "VARIABLES");
       goto error;
     }
 
@@ -221,8 +219,7 @@ parse_group (struct lexer *lexer, struct dictionary *dict,
       /* Check that VALUE is specified and is valid for the VARIABLES. */
       if (!has_value)
         {
-          msg (SE, _("Required %s specification missing from %s subcommand."),
-               "VALUE", subcommand_name);
+          lex_spec_missing (lexer, subcommand_name, "VALUE");
           goto error;
         }
       else if (var_is_alpha (mrset->vars[0]))
index e3725681c9c6a207332987046e5e9bee721008ee..bbb005938fc8b0962a1447f3cafd43fb2ecabad3 100644 (file)
@@ -362,6 +362,24 @@ lex_sbc_missing (const char *sbc)
   msg (SE, _("Required subcommand %s was not specified."), sbc);
 }
 
+/* Reports an error to the effect that specification SPEC may only be specified
+   once within subcommand SBC. */
+void
+lex_spec_only_once (struct lexer *lexer, const char *sbc, const char *spec)
+{
+  lex_error (lexer, _("%s may only be specified once within subcommand %s"),
+             spec, sbc);
+}
+
+/* Reports an error to the effect that specification SPEC is missing within
+   subcommand SBC. */
+void
+lex_spec_missing (struct lexer *lexer, const char *sbc, const char *spec)
+{
+  lex_error (lexer, _("Required %s specification missing from %s subcommand"),
+             sbc, spec);
+}
+
 /* Prints a syntax error message containing the current token and
    given message MESSAGE (if non-null). */
 void
index 2a7055a5ce73fdcfa9efafa3ae02905eebac49ad..17129c2bbe2fa9eae26e4db0045515118febcb76 100644 (file)
@@ -160,6 +160,11 @@ void lex_error_expecting (struct lexer *, const char *, ...) SENTINEL(0);
 void lex_sbc_only_once (const char *);
 void lex_sbc_missing (const char *);
 
+void lex_spec_only_once (struct lexer *, const char *subcommand,
+                         const char *specification);
+void lex_spec_missing (struct lexer *, const char *subcommand,
+                       const char *specification);
+
 void lex_error_valist (struct lexer *, const char *, va_list)
   PRINTF_FORMAT (2, 0);
 void lex_next_error_valist (struct lexer *lexer, int n0, int n1,
index 04abfc7d4be373d24f0a0d7f19a57ba2c71ec952..edff6ae25360129f58180965f12cec68d99f2a61 100644 (file)
@@ -239,7 +239,7 @@ AT_DATA([mrsets.sps],
 MRSETS /MCGROUP VARIABLES=a b c.
 ])
 AT_CHECK([pspp -O format=csv mrsets.sps], [1],
-  [mrsets.sps:6: error: MRSETS: Required NAME specification missing from MCGROUP subcommand.
+  [mrsets.sps:6.32: error: MRSETS: Syntax error at end of command: Required MCGROUP specification missing from NAME subcommand.
 ])
 AT_CLEANUP
 
@@ -249,7 +249,7 @@ AT_DATA([mrsets.sps],
 MRSETS /MCGROUP NAME=$Mcgroup.
 ])
 AT_CHECK([pspp -O format=csv mrsets.sps], [1],
-  [mrsets.sps:6: error: MRSETS: Required VARIABLES specification missing from MCGROUP subcommand.
+  [mrsets.sps:6.30: error: MRSETS: Syntax error at end of command: Required MCGROUP specification missing from VARIABLES subcommand.
 ])
 AT_CLEANUP