From b8458aa5ccca039e48c37a3947df3025e3acbcee Mon Sep 17 00:00:00 2001
From: Akim Demaille <akim@epita.fr>
Date: Mon, 20 Sep 2004 12:24:45 +0000
Subject: [PATCH] * 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.

---
 ChangeLog   | 11 +++++++++++
 data/glr.c  | 25 +++++++++++++++++++++----
 data/yacc.c | 32 ++++++++++++++++++++++----------
 3 files changed, 54 insertions(+), 14 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 388ad7f2..fad3a07d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+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.
diff --git a/data/glr.c b/data/glr.c
index 060b3283..68af5f1a 100644
--- a/data/glr.c
+++ b/data/glr.c
@@ -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;
 
diff --git a/data/yacc.c b/data/yacc.c
index 840e7cec..f1040ebd 100644
--- a/data/yacc.c
+++ b/data/yacc.c
@@ -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)
     ]{
-- 
2.47.2