]> git.saurik.com Git - bison.git/blobdiff - src/parse-gram.y
* tests/Makefile.am ($(srcdir)/package.m4): Bison now ships
[bison.git] / src / parse-gram.y
index 2d00e0357acb819dac707ddf3498e37d5afd98a7..6e9faa743d6da5d99a6a4e2dc76b59e525a4d365 100644 (file)
@@ -30,6 +30,7 @@
 
 %{
 #include "system.h"
 
 %{
 #include "system.h"
+#include "complain.h"
 #include "muscle_tab.h"
 #include "files.h"
 #include "getargs.h"
 #include "muscle_tab.h"
 #include "files.h"
 #include "getargs.h"
@@ -63,11 +64,11 @@ do {                                                        \
    correctly typed access to it.  */
 #define yycontrol ((gram_control_t *) gram_control)
 
    correctly typed access to it.  */
 #define yycontrol ((gram_control_t *) gram_control)
 
-/* Request detailed parse error messages, and pass them to
-   GRAM_ERROR. */
+/* Request detailed parse error messages, and pass them to GRAM_ERROR.
+   FIXME: depends on the undocumented availability of YYLLOC.t */
 #undef  yyerror
 #define yyerror(Msg) \
 #undef  yyerror
 #define yyerror(Msg) \
-        gram_error (yycontrol, &yylloc, Msg)
+        gram_error (&yylloc, Msg)
 
 #define YYPRINT(File, Type, Value) \
         yyprint (File, Type, &Value)
 
 #define YYPRINT(File, Type, Value) \
         yyprint (File, Type, &Value)
@@ -77,7 +78,7 @@ symbol_class current_class = unknown_sym;
 char *current_type = 0;
 symbol_t *current_lhs;
 location_t current_lhs_location;
 char *current_type = 0;
 symbol_t *current_lhs;
 location_t current_lhs_location;
-associativity current_assoc;
+assoc_t current_assoc;
 int current_prec = 0;
 braced_code_t current_braced_code = action_braced_code;
 %}
 int current_prec = 0;
 braced_code_t current_braced_code = action_braced_code;
 %}
@@ -90,10 +91,10 @@ braced_code_t current_braced_code = action_braced_code;
   symbol_list_t *list;
   int integer;
   char *string;
   symbol_list_t *list;
   int integer;
   char *string;
-  associativity assoc;
+  assoc_t assoc;
 };
 
 };
 
-/* Define the tokens together with there human representation. */
+/* Define the tokens together with their human representation.  */
 %token GRAM_EOF 0 "end of string"
 %token STRING CHARACTER
 %token INT
 %token GRAM_EOF 0 "end of string"
 %token STRING CHARACTER
 %token INT
@@ -303,14 +304,14 @@ symbol_def:
     {
       symbol_class_set ($1, current_class, @1);
       symbol_type_set ($1, current_type, @1);
     {
       symbol_class_set ($1, current_class, @1);
       symbol_type_set ($1, current_type, @1);
-      symbol_make_alias ($1, $2);
+      symbol_make_alias ($1, $2, @$);
     }
 | ID INT string_as_id
     {
       symbol_class_set ($1, current_class, @1);
       symbol_type_set ($1, current_type, @1);
       symbol_user_token_number_set ($1, $2, @2);
     }
 | ID INT string_as_id
     {
       symbol_class_set ($1, current_class, @1);
       symbol_type_set ($1, current_type, @1);
       symbol_user_token_number_set ($1, $2, @2);
-      symbol_make_alias ($1, $3);
+      symbol_make_alias ($1, $3, @$);
     }
 ;
 
     }
 ;
 
@@ -338,6 +339,14 @@ grammar:
 rules_or_grammar_declaration:
   rules
 | grammar_declaration ";"
 rules_or_grammar_declaration:
   rules
 | grammar_declaration ";"
+    {
+      if (yacc_flag)
+       complain_at (@$, _("POSIX forbids declarations in the grammar"));
+    }
+| error ";"
+    {
+      yyerrok;
+    }
 ;
 
 rules:
 ;
 
 rules:
@@ -368,7 +377,7 @@ rhs:
 symbol:
   ID              { $$ = $1; }
 | string_as_id    { $$ = $1; }
 symbol:
   ID              { $$ = $1; }
 | string_as_id    { $$ = $1; }
-| CHARACTER       { $$ = getsym ($1, @1); }
+| CHARACTER       { $$ = symbol_get ($1, @1); }
 ;
 
 action:
 ;
 
 action:
@@ -380,7 +389,7 @@ action:
 string_as_id:
   STRING
     {
 string_as_id:
   STRING
     {
-      $$ = getsym ($1, @1);
+      $$ = symbol_get ($1, @1);
       symbol_class_set ($$, token_sym, @1);
     }
 ;
       symbol_class_set ($$, token_sym, @1);
     }
 ;
@@ -450,9 +459,7 @@ yyprint (FILE *file,
 }
 
 void
 }
 
 void
-gram_error (gram_control_t *control ATTRIBUTE_UNUSED,
-           location_t *yylloc, const char *msg)
+gram_error (location_t *yylloc, const char *msg)
 {
 {
-  LOCATION_PRINT (stderr, *yylloc);
-  fprintf (stderr, ": %s\n", msg);
+  complain_at (*yylloc, "%s", msg);
 }
 }