* data/yacc.c (YY_LOCATION_PRINT): Use YYLTYPE_IS_TRIVIAL as a
authorAkim Demaille <akim@epita.fr>
Mon, 20 Sep 2004 12:24:45 +0000 (12:24 +0000)
committerAkim Demaille <akim@epita.fr>
Mon, 20 Sep 2004 12:24:45 +0000 (12:24 +0000)
clearer criterion to define it.
(parse): Initialize the initial location when YYLTYPE_IS_TRIVIAL.
When reducing on an empty RHS, use the latest stacked location as
location.
yylloc is not always available.
* data/glr.c: Likewise.
Also, honor initial-actions.

ChangeLog
data/glr.c
data/yacc.c

index 388ad7f..fad3a07 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,16 @@
 2004-09-20  Akim Demaille  <akim@epita.fr>
 
+       * data/yacc.c (YY_LOCATION_PRINT): Use YYLTYPE_IS_TRIVIAL as a
+       clearer criterion to define it.
+       (parse): Initialize the initial location when YYLTYPE_IS_TRIVIAL.
+       When reducing on an empty RHS, use the latest stacked location as
+       location.
+       yylloc is not always available.
+       * data/glr.c: Likewise.
+       Also, honor initial-actions.
+
+2004-09-20  Akim Demaille  <akim@epita.fr>
+
        * data/yacc.c (YY_LOCATION_PRINT): New.
        Define when we know YYLTYPE's structure, i.e., when the default
        YYLLOC_DEFAULT is used.
index 060b328..68af5f1 100644 (file)
@@ -427,9 +427,9 @@ static const ]b4_int_type_for([b4_stos])[ yystos[] =
 
 #ifndef YYLLOC_DEFAULT
 # define YYLLOC_DEFAULT(yyCurrent, yyRhs, YYN)                 \
-   ((yyCurrent).first_line = YYRHSLOC(yyRhs, 1).first_line,    \
+   ((yyCurrent).first_line   = YYRHSLOC(yyRhs, 1).first_line,  \
     (yyCurrent).first_column = YYRHSLOC(yyRhs, 1).first_column,        \
-    (yyCurrent).last_line = YYRHSLOC(yyRhs, YYN).last_line,    \
+    (yyCurrent).last_line    = YYRHSLOC(yyRhs, YYN).last_line, \
     (yyCurrent).last_column  = YYRHSLOC(yyRhs, YYN).last_column)
 
 /* YY_LOCATION_PRINT -- Print the location on the stream.
@@ -720,7 +720,7 @@ yyuserAction (yyRuleNum yyn, int yyrhslen, yyGLRStackItem* yyvsp,
   if (yyrhslen == 0)
     {
       *yyvalp = yyval_default;
-      *yylocp = yyloc_default;
+      *yylocp = yyvsp[0].yystate.yyloc;
     }
   else
     {
@@ -1825,7 +1825,24 @@ yyrecoverSyntaxError (yyGLRStack* yystack,
   if (setjmp (yystack.yyexception_buffer) != 0)
     goto yyDone;
 
-  yyglrShift (&yystack, 0, 0, 0, yyval_default, &yyloc_default]b4_user_args[);
+  yylval = yyval_default;
+]b4_location_if([
+#if YYLTYPE_IS_TRIVIAL
+  yylloc.first_line   = yylloc.last_line   = 1;
+  yylloc.first_column = yylloc.last_column = 0;
+#endif
+])
+m4_ifdef([b4_initial_action], [
+m4_pushdef([b4_at_dollar],     [(yylval)])dnl
+m4_pushdef([b4_dollar_dollar], [(yylloc)])dnl
+  /* User initialization code. */
+  b4_initial_action
+m4_popdef([b4_dollar_dollar])dnl
+m4_popdef([b4_at_dollar])dnl
+/* Line __line__ of glr.c.  */
+b4_syncline([@oline@], [@ofile@])])dnl
+[
+  yyglrShift (&yystack, 0, 0, 0, yylval, &yylloc]b4_user_args[);
   yytoken = YYEMPTY;
   yyposn = 0;
 
index 840e7ce..f1040eb 100644 (file)
@@ -514,18 +514,21 @@ while (0)
     (Current).first_column = (Rhs)[1].first_column,    \
     (Current).last_line    = (Rhs)[N].last_line,       \
     (Current).last_column  = (Rhs)[N].last_column)
+#endif
+
 
 /* YY_LOCATION_PRINT -- Print the location on the stream.
    This macro was not mandated originally: define only if we know
    we won't break user code: when these are the locations we know.  */
 
-# define YY_LOCATION_PRINT(File, Loc)                  \
-    fprintf (File, "%d.%d-%d.%d",                      \
-             (Loc).first_line, (Loc).first_column,     \
-             (Loc).last_line,  (Loc).last_column)
-#endif
-
 #ifndef YY_LOCATION_PRINT
+# if YYLTYPE_IS_TRIVIAL
+#  define YY_LOCATION_PRINT(File, Loc)                 \
+     fprintf (File, "%d.%d-%d.%d",                     \
+              (Loc).first_line, (Loc).first_column,    \
+              (Loc).last_line,  (Loc).last_column)
+# endif
+#else
 # define YY_LOCATION_PRINT(File, Loc) ((void) 0)
 #endif
 
@@ -815,8 +818,14 @@ b4_c_function_def([yyparse], [int], b4_parse_param)
 
   yyssp = yyss;
   yyvsp = yyvs;
-]b4_location_if([  yylsp = yyls;])[
-]m4_ifdef([b4_initial_action], [
+]b4_location_if([[  yylsp = yyls;
+#if YYLTYPE_IS_TRIVIAL
+  /* Initialize the default location before parsing starts.  */
+  yyls[0].first_line   = yyls[0].last_line   = 1;
+  yyls[0].first_column = yyls[0].last_column = 0;
+#endif
+]])
+m4_ifdef([b4_initial_action], [
 m4_pushdef([b4_at_dollar],     [(*yylsp)])dnl
 m4_pushdef([b4_dollar_dollar], [(*yyvsp)])dnl
   /* User initialization code. */
@@ -1008,8 +1017,11 @@ yyreduce:
   yyval = yyvsp[1-yylen];
 
 ]b4_location_if(
-[  /* Default location. */
-  YYLLOC_DEFAULT (yyloc, yylsp - yylen, yylen);])[
+[[  /* Default location. */
+  if (yylen)
+    YYLLOC_DEFAULT (yyloc, yylsp - yylen, yylen);
+  else
+    yyloc = yylsp[0];]])[
   YY_REDUCE_PRINT (yyn);
   switch (yyn)
     ]{