examples: include the generated header

Akim Demaille <[email protected]>
Newsgroups gmane.comp.parsers.bison.patches
Message-ID <[email protected]>
Because they use ylwrap, these examples actually duplicate parse.h into parse.c.


commit 964fb2aa6f610db61c2af717f036dcada52b8766
Author: Akim Demaille <[email protected]>
Date:   Sun Jul 5 07:21:07 2020 +0200

    examples: include the generated header
    
    * examples/c/bistromathic/parse.y, examples/c/lexcalc/parse.y,
    * examples/c/reccalc/parse.y: here.
    Add some comments.
    
    * src/parse-gram.y (api_version): Pull out of handle_require.
    Bump to 3.7.

diff --git a/examples/c/bistromathic/parse.y b/examples/c/bistromathic/parse.y
index 6d86c77f..bb93af0f 100644
--- a/examples/c/bistromathic/parse.y
+++ b/examples/c/bistromathic/parse.y
@@ -1,5 +1,6 @@
-%require "3.6"
+%require "3.7"
 
+// Emitted on top of the implementation file.
 %code top {
   #include <ctype.h>  // isdigit
   #include <locale.h> // LC_ALL
@@ -24,6 +25,7 @@
   #endif
 }
 
+// Emitted in the header file, before the definition of YYSTYPE.
 %code requires {
   // Function type.
   typedef double (func_t) (double);
@@ -46,6 +48,7 @@
   symrec *getsym (char const *name);
 }
 
+// Emitted in the header file, after the definition of YYSTYPE.
 %code provides {
 # ifndef __attribute__
 #  ifndef __GNUC__
@@ -57,6 +60,7 @@
     __attribute__ ((__format__ (__printf__, 2, 3)));
 }
 
+// Emitted in the implementation file.
 %code {
   #if defined ENABLE_NLS && ENABLE_NLS
   # define _(Msgid)  gettext (Msgid)
@@ -68,6 +72,9 @@
   int done = 0;
 }
 
+// Include the header in the implementation rather than duplicating it.
+%define api.header.include {"parse.h"}
+
 // Don't share global variables between the scanner and the parser.
 %define api.pure full
 
diff --git a/examples/c/lexcalc/parse.y b/examples/c/lexcalc/parse.y
index 41546cb3..6db00c9b 100644
--- a/examples/c/lexcalc/parse.y
+++ b/examples/c/lexcalc/parse.y
@@ -19,6 +19,9 @@
 #include <stdlib.h> // getenv.
 }
 
+// Include the header in the implementation rather than duplicating it.
+%define api.header.include {"parse.h"}
+
 // Don't share global variables between the scanner and the parser.
 %define api.pure full
 
diff --git a/examples/c/reccalc/parse.y b/examples/c/reccalc/parse.y
index bcea1b83..c11f9b66 100644
--- a/examples/c/reccalc/parse.y
+++ b/examples/c/reccalc/parse.y
@@ -46,14 +46,29 @@
   result parse (void);
 }
 
+// Include the header in the implementation rather than duplicating it.
+%define api.header.include {"parse.h"}
+
+// Don't share global variables between the scanner and the parser.
 %define api.pure full
+
+// To avoid name clashes (e.g., with C's EOF) prefix token definitions
+// with TOK_ (e.g., TOK_EOF).
 %define api.token.prefix {TOK_}
+
+// Generate YYSTYPE from the types assigned to symbols.
 %define api.value.type union
-%define parse.error verbose
+
+// Error messages with "unexpected XXX, expected XXX...".
+%define parse.error detailed
+
+// Enable run-time traces (yydebug).
 %define parse.trace
+
+// Generate the parser description file (parse.output).
 %verbose
 
- // Scanner and error count are exchanged between main, yyparse and yylex.
+// Scanner and error count are exchanged between main, yyparse and yylex.
 %param {yyscan_t scanner}{result *res}
 
 %token
diff --git a/src/parse-gram.y b/src/parse-gram.y
index 01b2f1bb..4581fc73 100644
--- a/src/parse-gram.y
+++ b/src/parse-gram.y
@@ -58,6 +58,10 @@
   #include "scan-code.h"
   #include "scan-gram.h"
 
+  /* Pretend to be at least that version, to check features published
+     in that version while developping it.  */
+  static const char* api_version = "3.7";
+
   static int current_prec = 0;
   static location current_lhs_loc;
   static named_ref *current_lhs_named_ref;
@@ -1082,9 +1086,6 @@ handle_require (location const *loc, char const *version_quoted)
     }
   else
     {
-      /* Pretend to be at least that version, to check features published
-         in that version while developping it.  */
-      const char* api_version = "3.6";
       const char* package_version =
         0 < strverscmp (api_version, PACKAGE_VERSION)
         ? api_version : PACKAGE_VERSION;
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.