On 11/14/15 22:46, Stuart Henderson wrote:
> On 2015/11/14 21:39, Jérémie Courrèges-Anglas wrote:
>>
>> I'll commit this tomorrow unless I hear objections.
> 
> I think it's the least bad option for now. The regex problem is
> solved with this...
> 
> Index: patches/patch-data_c++_m4
> ===================================================================
> RCS file: patches/patch-data_c++_m4
> diff -N patches/patch-data_c++_m4
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ patches/patch-data_c++_m4 14 Nov 2015 21:00:09 -0000
> @@ -0,0 +1,15 @@
> +$OpenBSD$
> +--- data/c++.m4.orig Sat Nov 14 20:54:33 2015
> ++++ data/c++.m4      Sat Nov 14 20:56:33 2015
> +@@ -100,9 +100,9 @@ m4_define([b4_namespace_open],
> + m4_define([b4_namespace_close],
> + [b4_user_code([b4_percent_define_get_syncline([[api.namespace]])
> + m4_bpatsubst(m4_dquote(m4_bpatsubst(m4_dquote(b4_namespace_ref[ ]),
> +-                                    [^\(.\)[         
> ]*\(::\)?\([^][:]\|:[^:]\)*],
> ++                                    [^\(.\)[         
> ]*\(::\)?\([^]:[]\|:[^:]\)*],
> +                                     [\1])),
> +-             [::\([^][:]\|:[^:]\)*], [} ])[} // ]b4_namespace_ref])])
> ++             [::\([^]:[]\|:[^:]\)*], [} ])[} // ]b4_namespace_ref])])
> + 
> + 
> + # b4_token_enums
> 
> ... but then we run into problems with this from m4sugar
> 
> m4_translit(m4_dquote(m4_format(m4_dquote(m4_for(
>   ,1,255,,[[%c]]))m4_for([i],1,255,,[,i]))), [$*-], [*$])-)
> 
> "null definition" ... m4_for itself is earlier in the file but I think
> that may require m4 scuba gear to dissect ;)
> 
> Anyway I'm OK with this update with the changes we talked about offlist,
> but if anyone has ideas about either ways to change m4sugar to work
> better with our m4, or ways to change m4 to support it, it would
> be very nice...
> 
> 
Haven't looked at the most recent diff for the Makefile, so might have
changed.

Not easy to switch to m4 as implied. More is required than the
CONFIGURE_ENV change. ac_cv_prog_gnu_m4_gnu gets forced to yes/no "-g"
setting is ignored, as M4_GNU = "" or "--gnu" in configure, so I patched
configure, also possible as an alternative to bring back/update the
output.c patch. Patching configure causes gnu m4 problems, when tests
fail, as the changed configure causes some regeneration, and wants
autoconf or more (I just move the configure patch out the way).




Did ask about fixing m4 long ago, no reply = nothing was done my me. Now
stated have a look.



m4 - Think I'm down to about the last problem with m4.....

$ diff -u bison-3.0.4{.gm4,}/bison-3.0.4/examples/calc++/calc++-parser.cc
--- bison-3.0.4.gm4/bison-3.0.4/examples/calc++/calc++-parser.cc Thu Nov
12 01:25:32 2015
+++ bison-3.0.4/bison-3.0.4/examples/calc++/calc++-parser.cc Sat Nov 14
13:09:05 2015
@@ -1010,7 +1010,7 @@
// The symbols being reduced.
for (int yyi = 0; yyi < yynrhs; yyi++)
YY_SYMBOL_PRINT (" $" << yyi + 1 << " =",
- yystack_[(yynrhs) - (yyi + 1)]);
+ yystack_[......................]);
}
#endif // YYDEBUG


This gets over that last problem with the first example, which compiles.
But hit the same sort of issue on the second example, but not so easy to
get around, looks like I need to fix properly.

$ cat patches/patch-data_lalr1_cc
$OpenBSD$
--- data/lalr1.cc.orig  Fri Jan 23 06:52:50 2015
+++ data/lalr1.cc       Sat Nov 14 22:44:24 2015
@@ -1159,7 +1159,7 @@ b4_error_verbose_if([state_type yystate, const symbol_
     // The symbols being reduced.
     for (int yyi = 0; yyi < yynrhs; yyi++)
       YY_SYMBOL_PRINT ("   $" << yyi + 1 << " =",
-                       ]b4_rhs_data(yynrhs, yyi + 1)[);
+                       yystack_[(yynrhs) - (yyi + 1)]);
   }
 #endif // ]b4_api_PREFIX[DEBUG



The patch you want is this, for c++.m4...., it works for both m4 and gnu
m4 others don't.

$ cat patches/patch-data_c++_m4
$OpenBSD$
--- data/c++.m4.orig Fri Jan 16 14:47:42 2015
+++ data/c++.m4 Thu Nov 12 01:20:00 2015
@@ -100,9 +100,9 @@ m4_define([b4_namespace_open],
m4_define([b4_namespace_close],
[b4_user_code([b4_percent_define_get_syncline([[api.namespace]])
m4_bpatsubst(m4_dquote(m4_bpatsubst(m4_dquote(b4_namespace_ref[ ]),
- [^\(.\)[ ]*\(::\)?\([^][:]\|:[^:]\)*],
+ [^\(.\)[ ]*\(::\)?\([ -9;-Z^-~]\|:[^:]\)*],
[\1])),
- [::\([^][:]\|:[^:]\)*], [} ])[} // ]b4_namespace_ref])])
+ [::\([        -9;-Z\^-~]\|:[^:]\)*], [} ])[} // ]b4_namespace_ref])])


It's tab-9 not space-9 in the above.... Could scan the RE string, and
convert [^[]:] into this.


Next problem is m4 only supports a single digit macro arguments,
I updated m4's eval.c to support multiple digits

Bison tests with m4 go wrong on expanding this....

m4_pushdef(_m4_f,
$1[$4]$2[]$1[$5]$2[]$1[$6]$2[]$1[$7]$2[]$1[$8]$2[]$1[$9]$2[]$1[$10]$2[]$1[$11]$2[]_m4_popdef([_m4_f]))

where the number of arguments depends on the number of tokens defined.
Instead of $10 you get $1 followed by 0 with m4 or m4 -g.


m4_f comes from autoconf lib/m4sugar/foreach.m4, in versions 2.63b -
2.64 of autoconf and later. Just a rare case that m_f is used with more
than 9 arguments. foreach.m4 from autoconf is duplicated in a few/lot of
ports for building. Could be possible to change bison.m4 etc to avoid
using m_f, other ports / autoconf could break at some point if using
m_f, some may have switched to gnu m4.




The next issue is with comments // appear on the line above,
data/c-like.m4, RE patten matching, looks for non-empty lines to insert
// in front, may have been simpler to put /* */ around the multi-line
comments

patsubst( , [
\(.\), [
// \1])

But . also matches new line as next character, can replace with

patsubst( , [
\([^
]\), [
// \1])

and works, gnum4.c, putsubst has REG_NEWLINE added if not mimic_gnu,
adding REG_NEWLINE for all cases fixes, but breaks something else.
Needed an extra check, if the patten contains newline, need to switch to
REG_NEWLINE if gnu_mimic, also patsubst and regexp not setting flags the
same way could give different results for the same RE. (May need a
closer look). gnum4.c fixed for this flag adjustment moved into the
twiddle routine used by both patsubst and regexp when mimicking gnu m4.



Still have these additional changes from previous fix in 2011

http://marc.info/?l=openbsd-ports&m=130023382518651&w=2

$ cvs -R -q up -Pd regress/usr.bin/m4 usr.bin/m4
M regress/usr.bin/m4/gnutranslit2.out
M regress/usr.bin/m4/translit2.m4
M regress/usr.bin/m4/translit2.out
M usr.bin/m4/eval.c
M usr.bin/m4/extern.h
M usr.bin/m4/gnum4.c
M usr.bin/m4/m4.1
M usr.bin/m4/main.c
M usr.bin/m4/mdef.h
M usr.bin/m4/misc.c
M usr.bin/m4/trace.c

back to back range expansion eg [a-d-a] gives abcdcba.
m4wrap nesting keeps line/file as well as wrap text in stack, otherwise
gives last file included / EOF line number.
better mimicking gnu m4 output with -g option / trace. m4 /gnu m4 if
macro over multiple lines m4 outputs the line number of the end of the
macro parameters, gnu m4 outputs the line number of the beginning.
__line__, __file__ builtins mimic gnu m4 with -g option, the correct
__file__ helps when tracing m4.

I haven't seen the same error as your getting, or can't remember it.
Might be something in these fixes. Or are you getting the result of
running with -g missing. Just came to me, it's the RE you used in
c++.m4, doesn't do quite what you think, that's another possibility, had
some error there.




Second test example fails, again it's only a small block of generated
code, m4 itself is not falling over.


Going to be a while, need to do a full release build with m4, and then
ports bulk to test. Go ahead as is, with the Bison update.



Reply via email to