Mercurial > octave-nkf
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 \