diff --git a/NEWS b/NEWS index ade1a70b..d676d6d0 100644 --- a/NEWS +++ b/NEWS @@ -17,6 +17,12 @@ GNU Bison NEWS (2013-07-25), "%error-verbose" is deprecated in favor of "%define parse.error verbose". +** Deprecated features + + The YYPRINT macro, which works only with yacc.c and only for tokens, was + obsoleted long ago by %printer, introduced in Bison 1.50 (November 2002). + It is deprecated and its support will be removed eventually. + ** New features *** Improved syntax error messages diff --git a/README-hacking.md b/README-hacking.md index 0914cb1f..5e64f95b 100644 --- a/README-hacking.md +++ b/README-hacking.md @@ -57,6 +57,31 @@ Actually, Bison has legacy code that we should replace with gnulib modules ### Skeletons We try to use the "typical" coding style for each language. +#### CPP +We indent the CPP directives this way: + +``` +#if FOO +# if BAR +# define BAZ +# endif +#endif +``` + +Don't indent with leading spaces in the skeletons (it's ok in the grammar +files though, e.g., in `%code {...}` blocks). + +On occasions, use `cppi -c` to see where we stand. We don't aim at full +correctness: depending `-d`, some bits can be in the *.c file, or the *.h +file within the double-inclusion cpp-guards. In that case, favor the case +of the *.h file, but don't waste time on this. + +Don't hesitate to leave a comment on the `#endif` (e.g., `#endif /* FOO +*/`), especially for long blocks. + +There is no conistency on `! defined` vs. `!defined`. The day gnulib +decides, we'll follow them. + #### C/C++ Follow the GNU Coding Standards. diff --git a/data/skeletons/c.m4 b/data/skeletons/c.m4 index fa1f9e1e..1a1e3afd 100644 --- a/data/skeletons/c.m4 +++ b/data/skeletons/c.m4 @@ -965,8 +965,8 @@ m4_define([b4_yy_location_print_define], This macro was not mandated originally: define only if we know we won't break user code: when these are the locations we know. */ -#ifndef YY_LOCATION_PRINT -# if defined ]b4_api_PREFIX[LTYPE_IS_TRIVIAL && ]b4_api_PREFIX[LTYPE_IS_TRIVIAL +# ifndef YY_LOCATION_PRINT +# if defined ]b4_api_PREFIX[LTYPE_IS_TRIVIAL && ]b4_api_PREFIX[LTYPE_IS_TRIVIAL /* Print *YYLOCP on YYO. Private, do not rely on its existence. */ @@ -996,17 +996,17 @@ yy_location_print_ (FILE *yyo, YYLTYPE const * const yylocp) return res; } -# define YY_LOCATION_PRINT(File, Loc) \ +# define YY_LOCATION_PRINT(File, Loc) \ yy_location_print_ (File, &(Loc)) -# else -# define YY_LOCATION_PRINT(File, Loc) ((void) 0) -# endif -#endif]], +# else +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +# endif +# endif /* !defined YY_LOCATION_PRINT */]], [[/* This macro is provided for backward compatibility. */ -#ifndef YY_LOCATION_PRINT -# define YY_LOCATION_PRINT(File, Loc) ((void) 0) -#endif]]) +# ifndef YY_LOCATION_PRINT +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +# endif]]) ]) # b4_yyloc_default diff --git a/data/skeletons/yacc.c b/data/skeletons/yacc.c index 0fc0c9e5..f52d11a5 100644 --- a/data/skeletons/yacc.c +++ b/data/skeletons/yacc.c @@ -695,14 +695,14 @@ yysymbol_name (yysymbol_kind_t yysymbol) }]])[ #endif -# ifdef YYPRINT +#ifdef YYPRINT /* YYTOKNUM[NUM] -- (External) token number corresponding to the (internal) symbol number NUM (which must be that of a token). */ static const ]b4_int_type_for([b4_toknum])[ yytoknum[] = { ]b4_toknum[ }; -# endif +#endif #define YYPACT_NINF (]b4_pact_ninf[) @@ -1405,10 +1405,10 @@ yysyntax_error (YYPTRDIFF_T *yymsg_alloc, char **yymsg, switch (yycount) { -# define YYCASE_(N, S) \ +#define YYCASE_(N, S) \ case N: \ yyformat = S; \ - break + break default: /* Avoid compiler warnings. */ YYCASE_(0, YY_("syntax error")); YYCASE_(1, YY_("syntax error, unexpected %s")); @@ -1416,7 +1416,7 @@ yysyntax_error (YYPTRDIFF_T *yymsg_alloc, char **yymsg, YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s")); YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s")); YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s")); -# undef YYCASE_ +#undef YYCASE_ } /* Compute error message size. Don't count the "%s"s, but reserve @@ -1698,7 +1698,7 @@ yysetstate: YYSTACK_RELOCATE (yyss_alloc, yyss); YYSTACK_RELOCATE (yyvs_alloc, yyvs);]b4_locations_if([ YYSTACK_RELOCATE (yyls_alloc, yyls);])[ -# undef YYSTACK_RELOCATE +# undef YYSTACK_RELOCATE if (yyss1 != yyssa) YYSTACK_FREE (yyss1); } diff --git a/src/parse-gram.c b/src/parse-gram.c index f4f1c708..63842113 100644 --- a/src/parse-gram.c +++ b/src/parse-gram.c @@ -689,7 +689,7 @@ yysymbol_name (yysymbol_kind_t yysymbol) } #endif -# ifdef YYPRINT +#ifdef YYPRINT /* YYTOKNUM[NUM] -- (External) token number corresponding to the (internal) symbol number NUM (which must be that of a token). */ static const yytype_int16 yytoknum[] = @@ -702,7 +702,7 @@ static const yytype_int16 yytoknum[] = 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315 }; -# endif +#endif #define YYPACT_NINF (-80) @@ -977,8 +977,8 @@ do { \ This macro was not mandated originally: define only if we know we won't break user code: when these are the locations we know. */ -#ifndef YY_LOCATION_PRINT -# if defined GRAM_LTYPE_IS_TRIVIAL && GRAM_LTYPE_IS_TRIVIAL +# ifndef YY_LOCATION_PRINT +# if defined GRAM_LTYPE_IS_TRIVIAL && GRAM_LTYPE_IS_TRIVIAL /* Print *YYLOCP on YYO. Private, do not rely on its existence. */ @@ -1008,13 +1008,13 @@ yy_location_print_ (FILE *yyo, YYLTYPE const * const yylocp) return res; } -# define YY_LOCATION_PRINT(File, Loc) \ +# define YY_LOCATION_PRINT(File, Loc) \ yy_location_print_ (File, &(Loc)) -# else -# define YY_LOCATION_PRINT(File, Loc) ((void) 0) -# endif -#endif +# else +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +# endif +# endif /* !defined YY_LOCATION_PRINT */ # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ @@ -1906,7 +1906,7 @@ yysetstate: YYSTACK_RELOCATE (yyss_alloc, yyss); YYSTACK_RELOCATE (yyvs_alloc, yyvs); YYSTACK_RELOCATE (yyls_alloc, yyls); -# undef YYSTACK_RELOCATE +# undef YYSTACK_RELOCATE if (yyss1 != yyssa) YYSTACK_FREE (yyss1); }