changeset 19809:a941a65c7cb8

handle bison syntax changes in TeX parser * oct-tex-parser.in.yy: Rename from oct-tex-parser.yy. Substitute %API_PREFIX_DECL%. * build-aux/common.mk (subst-bison-api-decls): New macro. * libinterp/parse-tree/module.mk (oct-parse.yy): Use it. * libinterp/corefcn/module.mk (oct-tex-parser.yy): New rule. * libinterp/Makefile.am: Ensure that oct-tex-parser.yy is built early. Search for tests in generated .yy file, not .in.yy file. * oct-tex-lexer.in.ll: Define YYSTPE if needed.
author John W. Eaton <jwe@octave.org>
date Thu, 19 Feb 2015 18:05:07 -0500
parents 904912f18357
children 4cecd33915ef
files build-aux/common.mk libinterp/Makefile.am libinterp/corefcn/module.mk libinterp/corefcn/oct-tex-lexer.in.ll libinterp/corefcn/oct-tex-parser.in.yy libinterp/corefcn/oct-tex-parser.yy libinterp/parse-tree/module.mk
diffstat 7 files changed, 280 insertions(+), 252 deletions(-) [+]
line wrap: on
line diff
--- a/build-aux/common.mk	Thu Feb 19 17:33:59 2015 -0500
+++ b/build-aux/common.mk	Thu Feb 19 18:05:07 2015 -0500
@@ -729,6 +729,38 @@
 $(simple_move_if_change_rule)
 endef
 
+define subst-bison-api-decls
+  case "$(BISON_API_PREFIX_DECL_STYLE)" in \
+    *api*) \
+      case "$(BISON_API_PREFIX_DECL_STYLE)" in \
+       *brace*) \
+         api_prefix_decl='%define api.prefix {$(1)}'; ;; \
+       *) \
+         api_prefix_decl='%define api.prefix "$(1)"'; ;; \
+       esac; \
+      ;; \
+    *name*) \
+      case "$(BISON_API_PREFIX_DECL_STYLE)" in \
+        *brace*) \
+          api_prefix_decl='%name-prefix {$(1)}'; ;; \
+        *) \
+          api_prefix_decl='%name-prefix="$(1)"'; ;; \
+      esac; \
+    ;; \
+  esac; \
+  case "$(BISON_PUSH_PULL_DECL_STYLE)" in \
+    *quote*) quote='"' ;; \
+    *) quote="" ;; \
+  esac; \
+  case "$(BISON_PUSH_PULL_DECL_STYLE)" in \
+    *dash*) push_pull_decl="%define api.push-pull $${quote}both$${quote}"; ;; \
+    *underscore*) push_pull_decl="%define api.push_pull $${quote}both$${quote}"; ;; \
+  esac; \
+  $(SED) -e "s/%PUSH_PULL_DECL%/$$push_pull_decl/" \
+         -e "s/%API_PREFIX_DECL%/$$api_prefix_decl/" $< > $@-t
+  mv $@-t $@
+endef
+
 define test-file-commands
 ( echo "## DO NOT EDIT!  Generated automatically from $(<F) by Make."; $(GREP) '^%!' $< ) > $@-t
 mv $@-t $@
--- a/libinterp/Makefile.am	Thu Feb 19 17:33:59 2015 -0500
+++ b/libinterp/Makefile.am	Thu Feb 19 18:05:07 2015 -0500
@@ -63,13 +63,22 @@
   builtin-defun-decls.h \
   builtins.cc
 
+ULT_PARSER_SRC := \
+  corefcn/oct-tex-lexer.in.ll \
+  corefcn/oct-tex-parser.in.yy \
+  parse-tree/oct-parse.in.yy
+
+GENERATED_PARSER_FILES := \
+  corefcn/oct-tex-lexer.ll \
+  corefcn/oct-tex-parser.yy \
+  parse-tree/oct-parse.yy
+
 BUILT_DISTFILES = \
-  corefcn/oct-tex-lexer.ll \
+  $(GENERATED_PARSER_FILES) \
   corefcn/oct-tex-parser.h \
   corefcn/oct-tex-symbols.cc \
   parse-tree/oct-gperf.h \
-  parse-tree/oct-parse.h \
-  parse-tree/oct-parse.yy
+  parse-tree/oct-parse.h
 
 ## Files that are created during build process and installed,
 ## BUT not distributed in tarball.
@@ -203,7 +212,7 @@
 ## Section for defining and creating DEF_FILES
 
 ULT_DIST_SRC := \
-  $(filter-out corefcn/oct-tex-lexer.ll parse-tree/oct-parse.yy, $(DIST_SRC)) corefcn/oct-tex-lexer.in.ll parse-tree/oct-parse.in.yy
+  $(filter-out $(GENERATED_PARSER_FILES), $(DIST_SRC)) $(ULT_PARSER_SRC)
 
 SRC_DEF_FILES := $(shell $(srcdir)/find-defun-files.sh "$(srcdir)" $(ULT_DIST_SRC))
 
--- a/libinterp/corefcn/module.mk	Thu Feb 19 17:33:59 2015 -0500
+++ b/libinterp/corefcn/module.mk	Thu Feb 19 18:05:07 2015 -0500
@@ -5,6 +5,7 @@
   corefcn/mxarray.in.h \
   corefcn/oct-errno.in.cc \
   corefcn/oct-tex-lexer.in.ll \
+  corefcn/oct-tex-parser.in.yy \
   corefcn/oct-tex-symbols.in
 
 ## Options functions for Fortran packages like LSODE, DASPK.
@@ -330,6 +331,8 @@
 corefcn/oct-tex-lexer.cc: LEX_OUTPUT_ROOT := lex.octave_tex_
 corefcn/oct-tex-parser.h: corefcn/oct-tex-parser.yy
 
+corefcn/oct-tex-parser.yy: corefcn/oct-tex-parser.in.yy
+	$(call subst-bison-api-decls,octave_tex_)
 
 noinst_LTLIBRARIES += \
   corefcn/libcorefcn.la \
--- a/libinterp/corefcn/oct-tex-lexer.in.ll	Thu Feb 19 17:33:59 2015 -0500
+++ b/libinterp/corefcn/oct-tex-lexer.in.ll	Thu Feb 19 18:05:07 2015 -0500
@@ -47,6 +47,17 @@
 #include "txt-eng.h"
 #include "oct-tex-parser.h"
 
+// FIXME: with bison 3.x, OCTAVE_TEX_STYPE appears in the generated
+// oct-parse.h file, but there is no definition for YYSTYPE, which is
+// needed by the code that is generated by flex.  I can't seem to find a
+// way to tell flex to use OCTAVE_TEX_STYPE instead of YYSTYPE in the code
+// it generates, or to tell bison to provide the definition of YYSTYPE
+// in the generated oct-parse.h file.
+
+#if defined (OCTAVE_TEX_STYPE_IS_DECLARED) && ! defined YYSTYPE
+#define YYSTYPE OCTAVE_TEX_STYPE
+#endif
+
 #if defined (GNULIB_NAMESPACE)
 // Calls to the following functions appear in the generated output from
 // flex without the namespace tag.  Redefine them so we will use them
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libinterp/corefcn/oct-tex-parser.in.yy	Thu Feb 19 18:05:07 2015 -0500
@@ -0,0 +1,220 @@
+/*
+
+Copyright (C) 2013-2015 Michael Goffioul
+
+This file is part of Octave.
+
+Octave is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+Octave is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with Octave; see the file COPYING.  If not, see
+<http://www.gnu.org/licenses/>.
+
+*/
+
+%{
+#define YYDEBUG 1
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "txt-eng.h"
+#include "oct-tex-parser.h"
+
+extern int octave_tex_lex (YYSTYPE *, void *);
+static void yyerror (text_parser_tex& parser, const char *s);
+
+#if defined (GNULIB_NAMESPACE)
+// Calls to the following functions appear in the generated output from
+// Bison without the namespace tag.  Redefine them so we will use them
+// via the gnulib namespace.
+#define fclose GNULIB_NAMESPACE::fclose
+#define fprintf GNULIB_NAMESPACE::fprintf
+#define malloc GNULIB_NAMESPACE::malloc
+#endif
+
+#define scanner parser.get_scanner ()
+%}
+
+%API_PREFIX_DECL%
+
+%define api.pure
+%parse-param { text_parser_tex& parser }
+%lex-param { void *scanner }
+
+%code requires {#include <string>}
+
+%union {
+  /* Leaf symbols produced by the scanner */
+  char                       ch;
+  double                     num;
+  int                        sym;
+
+  /* Used for string buffering */
+  std::string*               str;
+
+  /* Objects produced by the parser */
+  text_element*              e_base;
+  text_element_list*         e_list;
+}
+
+%token BF IT SL RM
+%token FONTNAME FONTSIZE
+%token COLOR COLOR_RGB
+%token START END SUPER SUB
+%token<ch> CH
+%token<num> NUM
+%token<sym> SYM
+
+%type<str> simple_string
+%type<e_base> string_element symbol_element
+%type<e_base> superscript_element subscript_element combined_script_element
+%type<e_base> font_modifier_element fontname_element fontsize_element color_element
+%type<e_list> string_element_list scoped_string_element_list
+
+/* Make sure there's no memory leak on parse error. */
+%destructor { } <ch> <num> <sym>
+%destructor { delete $$; } <*>
+
+%nonassoc SCRIPT
+%nonassoc SUB SUPER
+
+%nonassoc STR
+%nonassoc CH
+
+%start string
+
+%%
+
+simple_string			: CH
+				  { $$ = new std::string (1, $1); }
+				| simple_string CH
+				  { $1->append (1, $2); $$ = $1; }
+				;
+
+symbol_element			: SYM
+				  { $$ = new text_element_symbol ($1); }
+				;
+
+font_modifier_element		: BF
+				  { $$ = new text_element_fontstyle (text_element_fontstyle::bold); }
+				| IT
+				  { $$ = new text_element_fontstyle (text_element_fontstyle::italic); }
+				| SL
+				  { $$ = new text_element_fontstyle (text_element_fontstyle::oblique); }
+				| RM
+				  { $$ = new text_element_fontstyle (text_element_fontstyle::normal); }
+				;
+
+fontsize_element		: FONTSIZE START NUM END
+				  { $$ = new text_element_fontsize ($3); }
+				;
+
+fontname_element		: FONTNAME START simple_string END
+				  {
+				    $$ = new text_element_fontname (*$3);
+				    delete $3;
+				  }
+				;
+
+color_element			: COLOR START simple_string END
+				  {
+				    $$ = new text_element_color (*$3);
+				    delete $3;
+				  }
+				| COLOR_RGB START NUM NUM NUM END
+				  {
+				    $$ = new text_element_color ($3, $4, $5);
+				  }
+				;
+
+string_element			: simple_string %prec STR
+				  {
+				    $$ = new text_element_string (*$1);
+				    delete $1;
+				  }
+				| scoped_string_element_list
+				  /* This is just to avoid a warning in bison. */
+				  { $$ = $1; }
+				| symbol_element
+				| font_modifier_element
+				| fontsize_element
+				| fontname_element
+				| color_element
+				| superscript_element %prec SCRIPT
+				| subscript_element %prec SCRIPT
+				| combined_script_element
+				;
+
+superscript_element		: SUPER CH
+				  { $$ = new text_element_superscript ($2); }
+				| SUPER scoped_string_element_list
+				  { $$ = new text_element_superscript ($2); }
+				| SUPER symbol_element
+				  { $$ = new text_element_superscript ($2); }
+				;
+
+subscript_element		: SUB CH
+				  { $$ = new text_element_subscript ($2); }
+				| SUB scoped_string_element_list
+				  { $$ = new text_element_subscript ($2); }
+				| SUB symbol_element
+				  { $$ = new text_element_subscript ($2); }
+				;
+
+combined_script_element		: subscript_element superscript_element
+				  { $$ = new text_element_combined ($1, $2); }
+				| superscript_element subscript_element
+				  { $$ = new text_element_combined ($1, $2); }
+				;
+
+string_element_list		: string_element
+				  { $$ = new text_element_list ($1); }
+				| string_element_list string_element
+				  { $1->push_back ($2); $$ = $1; }
+				;
+
+scoped_string_element_list	: START string_element_list END
+				  { $$ = $2; }
+				| START END
+				  { $$ = new text_element_list (); }
+				;
+
+string				: /* empty */
+				  { parser.set_parse_result (new text_element_string ("")); }
+				| string_element_list
+				  { parser.set_parse_result ($1); }
+				;
+
+%%
+
+text_element*
+text_parser_tex::parse (const std::string& s)
+{
+  octave_tex_debug = 0;
+
+  if (init_lexer (s))
+    {
+      result = 0;
+
+      if (octave_tex_parse (*this) == 0)
+        return result;
+    }
+
+  return new text_element_string (s);
+}
+
+static void
+yyerror (text_parser_tex&, const char *s)
+{
+  fprintf (stderr, "TeX parse error: %s\n", s);
+}
--- a/libinterp/corefcn/oct-tex-parser.yy	Thu Feb 19 17:33:59 2015 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,219 +0,0 @@
-/*
-
-Copyright (C) 2013-2015 Michael Goffioul
-
-This file is part of Octave.
-
-Octave is free software; you can redistribute it and/or modify it
-under the terms of the GNU General Public License as published by the
-Free Software Foundation; either version 3 of the License, or (at your
-option) any later version.
-
-Octave is distributed in the hope that it will be useful, but WITHOUT
-ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with Octave; see the file COPYING.  If not, see
-<http://www.gnu.org/licenses/>.
-
-*/
-
-%{
-#define YYDEBUG 1
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "txt-eng.h"
-#include "oct-tex-parser.h"
-
-extern int octave_tex_lex (YYSTYPE *, void *);
-static void yyerror (text_parser_tex& parser, const char *s);
-
-#if defined (GNULIB_NAMESPACE)
-// Calls to the following functions appear in the generated output from
-// Bison without the namespace tag.  Redefine them so we will use them
-// via the gnulib namespace.
-#define fclose GNULIB_NAMESPACE::fclose
-#define fprintf GNULIB_NAMESPACE::fprintf
-#define malloc GNULIB_NAMESPACE::malloc
-#endif
-
-#define scanner parser.get_scanner ()
-%}
-
-%name-prefix="octave_tex_"
-%define api.pure
-%parse-param { text_parser_tex& parser }
-%lex-param { void *scanner }
-
-%code requires {#include <string>}
-
-%union {
-  /* Leaf symbols produced by the scanner */
-  char                       ch;
-  double                     num;
-  int                        sym;
-
-  /* Used for string buffering */
-  std::string*               str;
-
-  /* Objects produced by the parser */
-  text_element*              e_base;
-  text_element_list*         e_list;
-}
-
-%token BF IT SL RM
-%token FONTNAME FONTSIZE
-%token COLOR COLOR_RGB
-%token START END SUPER SUB
-%token<ch> CH
-%token<num> NUM
-%token<sym> SYM
-
-%type<str> simple_string
-%type<e_base> string_element symbol_element
-%type<e_base> superscript_element subscript_element combined_script_element
-%type<e_base> font_modifier_element fontname_element fontsize_element color_element
-%type<e_list> string_element_list scoped_string_element_list
-
-/* Make sure there's no memory leak on parse error. */
-%destructor { } <ch> <num> <sym>
-%destructor { delete $$; } <*>
-
-%nonassoc SCRIPT
-%nonassoc SUB SUPER
-
-%nonassoc STR
-%nonassoc CH
-
-%start string
-
-%%
-
-simple_string			: CH
-				  { $$ = new std::string (1, $1); }
-				| simple_string CH
-				  { $1->append (1, $2); $$ = $1; }
-				;
-
-symbol_element			: SYM
-				  { $$ = new text_element_symbol ($1); }
-				;
-
-font_modifier_element		: BF
-				  { $$ = new text_element_fontstyle (text_element_fontstyle::bold); }
-				| IT
-				  { $$ = new text_element_fontstyle (text_element_fontstyle::italic); }
-				| SL
-				  { $$ = new text_element_fontstyle (text_element_fontstyle::oblique); }
-				| RM
-				  { $$ = new text_element_fontstyle (text_element_fontstyle::normal); }
-				;
-
-fontsize_element		: FONTSIZE START NUM END
-				  { $$ = new text_element_fontsize ($3); }
-				;
-
-fontname_element		: FONTNAME START simple_string END
-				  {
-				    $$ = new text_element_fontname (*$3);
-				    delete $3;
-				  }
-				;
-
-color_element			: COLOR START simple_string END
-				  {
-				    $$ = new text_element_color (*$3);
-				    delete $3;
-				  }
-				| COLOR_RGB START NUM NUM NUM END
-				  {
-				    $$ = new text_element_color ($3, $4, $5);
-				  }
-				;
-
-string_element			: simple_string %prec STR
-				  {
-				    $$ = new text_element_string (*$1);
-				    delete $1;
-				  }
-				| scoped_string_element_list
-				  /* This is just to avoid a warning in bison. */
-				  { $$ = $1; }
-				| symbol_element
-				| font_modifier_element
-				| fontsize_element
-				| fontname_element
-				| color_element
-				| superscript_element %prec SCRIPT
-				| subscript_element %prec SCRIPT
-				| combined_script_element
-				;
-
-superscript_element		: SUPER CH
-				  { $$ = new text_element_superscript ($2); }
-				| SUPER scoped_string_element_list
-				  { $$ = new text_element_superscript ($2); }
-				| SUPER symbol_element
-				  { $$ = new text_element_superscript ($2); }
-				;
-
-subscript_element		: SUB CH
-				  { $$ = new text_element_subscript ($2); }
-				| SUB scoped_string_element_list
-				  { $$ = new text_element_subscript ($2); }
-				| SUB symbol_element
-				  { $$ = new text_element_subscript ($2); }
-				;
-
-combined_script_element		: subscript_element superscript_element
-				  { $$ = new text_element_combined ($1, $2); }
-				| superscript_element subscript_element
-				  { $$ = new text_element_combined ($1, $2); }
-				;
-
-string_element_list		: string_element
-				  { $$ = new text_element_list ($1); }
-				| string_element_list string_element
-				  { $1->push_back ($2); $$ = $1; }
-				;
-
-scoped_string_element_list	: START string_element_list END
-				  { $$ = $2; }
-				| START END
-				  { $$ = new text_element_list (); }
-				;
-
-string				: /* empty */
-				  { parser.set_parse_result (new text_element_string ("")); }
-				| string_element_list
-				  { parser.set_parse_result ($1); }
-				;
-
-%%
-
-text_element*
-text_parser_tex::parse (const std::string& s)
-{
-  octave_tex_debug = 0;
-
-  if (init_lexer (s))
-    {
-      result = 0;
-
-      if (octave_tex_parse (*this) == 0)
-        return result;
-    }
-
-  return new text_element_string (s);
-}
-
-static void
-yyerror (text_parser_tex&, const char *s)
-{
-  fprintf (stderr, "TeX parse error: %s\n", s);
-}
--- a/libinterp/parse-tree/module.mk	Thu Feb 19 17:33:59 2015 -0500
+++ b/libinterp/parse-tree/module.mk	Thu Feb 19 18:05:07 2015 -0500
@@ -90,35 +90,7 @@
 	rm -f $@-t1
 
 parse-tree/oct-parse.yy: parse-tree/oct-parse.in.yy
-	case "$(BISON_API_PREFIX_DECL_STYLE)" in \
-	  *api*) \
-	    case "$(BISON_API_PREFIX_DECL_STYLE)" in \
-	     *brace*) \
-	       api_prefix_decl='%define api.prefix {octave_}'; ;; \
-	     *) \
-	       api_prefix_decl='%define api.prefix "octave_"'; ;; \
-             esac; \
-            ;; \
-	  *name*) \
-	    case "$(BISON_API_PREFIX_DECL_STYLE)" in \
-	      *brace*) \
-	        api_prefix_decl='%name-prefix {octave_}'; ;; \
-	      *) \
-	        api_prefix_decl='%name-prefix="octave_"'; ;; \
-            esac; \
-          ;; \
-	esac; \
-	case "$(BISON_PUSH_PULL_DECL_STYLE)" in \
-	  *quote*) quote='"' ;; \
-	  *) quote="" ;; \
-	esac; \
-	case "$(BISON_PUSH_PULL_DECL_STYLE)" in \
-	  *dash*) push_pull_decl="%define api.push-pull $${quote}both$${quote}"; ;; \
-	  *underscore*) push_pull_decl="%define api.push_pull $${quote}both$${quote}"; ;; \
-	esac; \
-	$(SED) -e "s/%PUSH_PULL_DECL%/$$push_pull_decl/" \
-	       -e "s/%API_PREFIX_DECL%/$$api_prefix_decl/" $< > $@-t
-	mv $@-t $@
+	$(call subst-bison-api-decls,octave_)
 
 noinst_LTLIBRARIES += \
   parse-tree/libparse-tree.la \