gprofng doesn't build with gcc 5.5
authorVladimir Mezentsev <vladimir.mezentsev@oracle.com>
Sun, 10 Apr 2022 07:59:06 +0000 (00:59 -0700)
committerVladimir Mezentsev <vladimir.mezentsev@oracle.com>
Tue, 12 Apr 2022 01:07:26 +0000 (18:07 -0700)
gprofng/ChangeLog
2022-04-07  Vladimir Mezentsev  <vladimir.mezentsev@oracle.com>

PR gprofng/29026
* configure.ac: Check version of bison.
* src/Makefile.am (QLParser.yy): Run bison
* src/QLParser.yy: Adapted for bison 3.04 or later.
* src/DbeSession.cc: make some params const.
* src/DbeSession.h: Likewise.
* configure: Regenerate.
* Makefile.in: Regenerate.
* src/Makefile.in: Regenerate.
* src/QLParser.tab.cc: Deleted.
* src/QLParser.tab.hh: Deleted.
* doc/Makefile.in: Regenerate.
* gp-display-html/Makefile.in: Regenerate.
* libcollector/configure: Regenerate.

13 files changed:
gprofng/Makefile.in
gprofng/configure
gprofng/configure.ac
gprofng/doc/Makefile.in
gprofng/gp-display-html/Makefile.in
gprofng/libcollector/configure
gprofng/src/DbeSession.cc
gprofng/src/DbeSession.h
gprofng/src/Makefile.am
gprofng/src/Makefile.in
gprofng/src/QLParser.tab.cc [deleted file]
gprofng/src/QLParser.tab.hh [deleted file]
gprofng/src/QLParser.yy

index e77b06d60e4ae9475223ff675a1c8acd16d09360..fd5279b4df13ca21061bfc833797a0bb6ada62bc 100644 (file)
@@ -238,6 +238,7 @@ AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
+BISON = @BISON@
 BUILD_SUBDIRS = @BUILD_SUBDIRS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
index 08af658da8ebf09f1f1bbaa028c407e198b43642..6e38a14069613764d9faf0637c203957dfb40e65 100755 (executable)
@@ -681,6 +681,7 @@ LD
 FGREP
 SED
 LIBTOOL
+BISON
 ac_ct_AR
 AR
 RANLIB
@@ -6042,6 +6043,80 @@ unknown)
 esac
 
 
+  for ac_prog in bison
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_BISON+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$BISON"; then
+  ac_cv_prog_BISON="$BISON" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_BISON="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+BISON=$ac_cv_prog_BISON
+if test -n "$BISON"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BISON" >&5
+$as_echo "$BISON" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$BISON" && break
+done
+
+  if test -z "$BISON"; then
+    ac_verc_fail=yes
+  else
+    cat >conftest.y <<_ACEOF
+%require "3.0.4"
+%%
+exp:
+_ACEOF
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bison 3.0.4 or newer" >&5
+$as_echo_n "checking for bison 3.0.4 or newer... " >&6; }
+    ac_prog_version=`$BISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'`
+    : ${ac_prog_version:='v. ?.??'}
+    if $BISON conftest.y -o conftest.c 2>/dev/null; then
+      ac_prog_version="$ac_prog_version, ok"
+      ac_verc_fail=no
+    else
+      ac_prog_version="$ac_prog_version, bad"
+      ac_verc_fail=yes
+    fi
+    rm -f conftest.y conftest.c
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_prog_version" >&5
+$as_echo "$ac_prog_version" >&6; }
+  fi
+  if test $ac_verc_fail = yes; then
+    BISON=:
+  fi
+
+
+if test x$BISON = "x:"; then
+  as_fn_error $? "Building gprofng requires bison 3.0.4 or later." "$LINENO" 5
+fi
+
 # Check whether --enable-shared was given.
 if test "${enable_shared+set}" = set; then :
   enableval=$enable_shared; p=${PACKAGE-default}
@@ -12146,7 +12221,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 12149 "configure"
+#line 12224 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -12252,7 +12327,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 12255 "configure"
+#line 12330 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
index 550dd80d3315668db4552892b8f5f1e4d549ed45..80bbc8569f599d62cb796de7b58f11718ff149d4 100644 (file)
@@ -29,6 +29,10 @@ AC_PROG_CXX
 AC_PROG_INSTALL
 AC_PROG_RANLIB
 AM_PROG_AR
+gl_PROG_BISON([BISON],[3.0.4])
+if test x$BISON = "x:"; then
+  AC_MSG_ERROR([Building gprofng requires bison 3.0.4 or later.])
+fi
 
 AC_DISABLE_SHARED
 LT_INIT
index 03d9e242d9a3565ca5da4b2f8bce5a2f3565cddb..4050586f6a8a56919b7547afbe45f21061946a10 100644 (file)
@@ -222,6 +222,7 @@ AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
+BISON = @BISON@
 BUILD_SUBDIRS = @BUILD_SUBDIRS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
index e75703c9a0b717dc5a9eccaa52c0596ae84594a2..a222b955343e7191482c8d1fd2ddf944fdf9d0c5 100644 (file)
@@ -186,6 +186,7 @@ AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
+BISON = @BISON@
 BUILD_SUBDIRS = @BUILD_SUBDIRS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
index 9fea098168d6e83796b207443162c4281cda9f9d..0afa31d0819bb255b82dd10d9f3a8a2d84667375 100755 (executable)
@@ -6349,25 +6349,31 @@ else
      lt_nm_to_check="$lt_nm_to_check nm"
    fi
  fi
- for lt_tmp_nm in $lt_nm_to_check; do
+ for lt_tmp_nm in "$lt_nm_to_check"; do
    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
      IFS="$lt_save_ifs"
      test -z "$ac_dir" && ac_dir=.
-     case "$lt_tmp_nm" in
+     # Strip out any user-provided options from the nm to test twice,
+     # the first time to test to see if nm (rather than its options) has
+     # an explicit path, the second time to yield a file which can be
+     # nm'ed itself.
+     tmp_nm_path="`$ECHO "$lt_tmp_nm" | sed 's, -.*$,,'`"
+     case "$tmp_nm_path" in
      */*|*\\*) tmp_nm="$lt_tmp_nm";;
      *) tmp_nm="$ac_dir/$lt_tmp_nm";;
      esac
-     if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+     tmp_nm_to_nm="`$ECHO "$tmp_nm" | sed 's, -.*$,,'`"
+     if test -f "$tmp_nm_to_nm" || test -f "$tmp_nm_to_nm$ac_exeext" ; then
        # Check to see if the nm accepts a BSD-compat flag.
        # Adding the `sed 1q' prevents false positives on HP-UX, which says:
        #   nm: unknown option "B" ignored
-       case `"$tmp_nm" -B "$tmp_nm" 2>&1 | grep -v '^ *$' | sed '1q'` in
+       case `"$tmp_nm" -B "$tmp_nm_to_nm" 2>&1 | grep -v '^ *$' | sed '1q'` in
        *$tmp_nm*) lt_cv_path_NM="$tmp_nm -B"
         break
         ;;
        *)
-        case `"$tmp_nm" -p "$tmp_nm" 2>&1 | grep -v '^ *$' | sed '1q'` in
+        case `"$tmp_nm" -p "$tmp_nm_to_nm" 2>&1 | grep -v '^ *$' | sed '1q'` in
         *$tmp_nm*)
           lt_cv_path_NM="$tmp_nm -p"
           break
@@ -12058,7 +12064,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 12061 "configure"
+#line 12067 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -12164,7 +12170,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 12167 "configure"
+#line 12173 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
index 43701148a6edc3062a68014baa692331fd102e3d..94b8f6b762bbd114239efdca52ad798659030551 100644 (file)
 #include "IndexObject.h"
 #include "PathTree.h"
 #include "Print.h"
+
+// Bison 3.0 doesn't define YY_NULLPTR. I copied this from QLParser.tab.cc.
+// Why this is not in QLParser.tab.hh ? YY_NULLPTR is used in QLParser.tab.hh
+# ifndef YY_NULLPTR
+#  if defined __cplusplus && 201103L <= __cplusplus
+#   define YY_NULLPTR nullptr
+#  else
+#   define YY_NULLPTR 0
+#  endif
+# endif
 #include "QLParser.tab.hh"
 #include "DbeView.h"
 #include "MemorySpace.h"
@@ -2954,7 +2964,7 @@ DbeSession::append (SourceFile *sf)
 }
 
 UserLabel *
-DbeSession::findUserLabel (char *name)
+DbeSession::findUserLabel (const char *name)
 {
   for (int i = 0, sz = userLabels ? userLabels->size () : 0; i < sz; i++)
     {
@@ -2966,7 +2976,7 @@ DbeSession::findUserLabel (char *name)
 }
 
 Expression *
-DbeSession::findObjDefByName (char *name)
+DbeSession::findObjDefByName (const char *name)
 {
   Expression *expr = NULL;
 
@@ -2994,25 +3004,13 @@ DbeSession::findObjDefByName (char *name)
 Expression *
 DbeSession::ql_parse (const char *expr_spec)
 {
-  /* (This slight duplication means we don't need to worry about copy
-     constructors for the QL::Result, nor about the lifetime of the
-     expr_spec.)  */
-  if (expr_spec != NULL)
-    {
-      QL::Result result (expr_spec);
-      QL::Parser qlparser (result);
-      if (qlparser () != 0)
-       return NULL;
-      return result ();
-    }
-  else
-    {
-      QL::Result result;
-      QL::Parser qlparser (result);
-      if (qlparser () != 0)
-       return NULL;
-      return result ();
-    }
+  if (expr_spec == NULL)
+    expr_spec = "";
+  QL::Result result (expr_spec);
+  QL::Parser qlparser (result);
+  if (qlparser.parse () != 0)
+    return NULL;
+  return result ();
 }
 
 Vector<void*> *
index 0a5c01c7679b9cf16eedea26b5d9d7ea1ba2cfeb..0173f1a891ce6cedb790fc315861ba769f2b5075 100644 (file)
@@ -332,7 +332,7 @@ public:
   char* getPropUName (int propId);
 
   Vector<UserLabel*> *userLabels; // List of er_labels
-  UserLabel *findUserLabel (char *name);
+  UserLabel *findUserLabel (const char *name);
   DbeJarFile *get_JarFile (const char *name);
   void append (UserLabel *lbl);
   void append (SourceFile *sf);
@@ -341,7 +341,7 @@ public:
   void set_need_refind ();
 
   // Find user defined object by name
-  Expression *findObjDefByName (char *);
+  Expression *findObjDefByName (const char *);
   void get_filter_keywords (Vector<void*> *res);
 
   // Get the Settings class object
index 47fd8c9302bd050e9ee78d5a5f757360ea831a73..0718ab61162a014a1992c275d43e9fdba9ba1804 100644 (file)
@@ -113,6 +113,9 @@ AM_CFLAGS = $(GPROFNG_CFLAGS) $(PTHREAD_CFLAGS) \
        $(GPROFNG_NO_SWITCH_CFLAGS)
 AM_CXXFLAGS = $(AM_CFLAGS)
 
+QLParser.tab.cc QLParser.tab.hh: QLParser.yy
+       $(BISON) $^
+
 man_MANS = gprofng.1 \
        gp-archive.1 \
        gp-collect-app.1 \
@@ -121,7 +124,8 @@ man_MANS = gprofng.1 \
 
 MAINTAINERCLEANFILES = $(man_MANS)
 
-EXTRA_DIST = $(man_MANS)
+BUILT_SOURCES = QLParser.tab.hh
+EXTRA_DIST = QLParser.yy $(man_MANS)
 
 
 pkglib_LTLIBRARIES = $(LIBGPROFNG)
index 7d3f9c6f7d0a2cf426705a0ca788bf64ba481341..1de9b36c2b77d8fa2ad05a2554c92c9b0b4dd3f4 100644 (file)
@@ -310,6 +310,7 @@ AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
+BISON = @BISON@
 BUILD_SUBDIRS = @BUILD_SUBDIRS@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
@@ -550,7 +551,8 @@ man_MANS = gprofng.1 \
        gp-display-text.1
 
 MAINTAINERCLEANFILES = $(man_MANS)
-EXTRA_DIST = $(man_MANS)
+BUILT_SOURCES = QLParser.tab.hh
+EXTRA_DIST = QLParser.yy $(man_MANS)
 pkglib_LTLIBRARIES = $(LIBGPROFNG)
 libgprofng_la_SOURCES = $(CCSOURCES) $(CSOURCES)
 libgprofng_la_LDFLAGS = -version-info 0:0:0
@@ -593,7 +595,8 @@ gp_display_text_LDADD = $(LIBGPROFNG) $(CLOCK_GETTIME_LINK) $(ZLIB)
 @BUILD_MAN_TRUE@  | sed 's/See also:/\.SH SEE ALSO/' | sed 's/Documentation:/.SH DOCUMENTATION/' \
 @BUILD_MAN_TRUE@  | sed 's/Limitations:/.SH LIMITATIONS/'
 
-all: all-am
+all: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) all-am
 
 .SUFFIXES:
 .SUFFIXES: .c .cc .lo .o .obj
@@ -1027,13 +1030,15 @@ distdir: $(DISTFILES)
          top_distdir="$(top_distdir)" distdir="$(distdir)" \
          dist-hook
 check-am: all-am
-check: check-am
+check: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) check-am
 all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(MANS) $(DATA)
 installdirs:
        for dir in "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(dbedir)"; do \
          test -z "$$dir" || $(MKDIR_P) "$$dir"; \
        done
-install: install-am
+install: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) install-am
 install-exec: install-exec-am
 install-data: install-data-am
 uninstall: uninstall-am
@@ -1063,6 +1068,7 @@ distclean-generic:
 maintainer-clean-generic:
        @echo "This command is intended for maintainers to use"
        @echo "it deletes files that may require special tools to rebuild."
+       -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
        -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
 clean: clean-am
 
@@ -1138,7 +1144,7 @@ uninstall-am: uninstall-binPROGRAMS uninstall-dbeDATA uninstall-man \
 
 uninstall-man: uninstall-man1
 
-.MAKE: install-am install-strip
+.MAKE: all check install install-am install-strip
 
 .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \
        clean-binPROGRAMS clean-generic clean-libtool \
@@ -1161,6 +1167,9 @@ uninstall-man: uninstall-man1
 .PRECIOUS: Makefile
 
 
+QLParser.tab.cc QLParser.tab.hh: QLParser.yy
+       $(BISON) $^
+
 @BUILD_MAN_TRUE@gprofng.1: $(srcdir)/gprofng.cc $(common_mandeps) | ./gprofng$(EXEEXT)
 @BUILD_MAN_TRUE@       $(AM_V_GEN)_BUILDING_MANPAGE=1 $(HELP2MAN) $(HELP2MAN_OPT) \
 @BUILD_MAN_TRUE@         --name=$(TEXT_GPROFNG) ./gprofng$(EXEEXT) $(H2M_FILTER) > $@
diff --git a/gprofng/src/QLParser.tab.cc b/gprofng/src/QLParser.tab.cc
deleted file mode 100644 (file)
index 4517b2e..0000000
+++ /dev/null
@@ -1,1453 +0,0 @@
-// A Bison parser, made by GNU Bison 3.7.5.
-
-// Skeleton implementation for Bison LALR(1) parsers in C++
-
-// Copyright (C) 2002-2015, 2018-2021 Free Software Foundation, Inc.
-
-// This program 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.
-
-// This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.
-
-// As a special exception, you may create a larger work that contains
-// part or all of the Bison parser skeleton and distribute that work
-// under terms of your choice, so long as that work isn't itself a
-// parser generator using the skeleton or a modified version thereof
-// as a parser skeleton.  Alternatively, if you modify or redistribute
-// the parser skeleton itself, you may (at your option) remove this
-// special exception, which will cause the skeleton and the resulting
-// Bison output files to be licensed under the GNU General Public
-// License without this special exception.
-
-// This special exception was added by the Free Software Foundation in
-// version 2.2 of Bison.
-
-// DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual,
-// especially those whose name start with YY_ or yy_.  They are
-// private implementation details that can be changed or removed.
-
-// "%code top" blocks.
-#line 28 "QLParser.yy"
-
-#include <stdio.h>
-#include <string.h>
-#include <string>
-
-#line 45 "QLParser.tab.cc"
-
-
-
-
-#include "QLParser.tab.hh"
-
-
-// Unqualified %code blocks.
-#line 42 "QLParser.yy"
-
-namespace QL
-{
-  static QL::Parser::symbol_type yylex (QL::Result &result);
-}
-
-#line 61 "QLParser.tab.cc"
-
-
-#ifndef YY_
-# if defined YYENABLE_NLS && YYENABLE_NLS
-#  if ENABLE_NLS
-#   include <libintl.h> // FIXME: INFRINGES ON USER NAME SPACE.
-#   define YY_(msgid) dgettext ("bison-runtime", msgid)
-#  endif
-# endif
-# ifndef YY_
-#  define YY_(msgid) msgid
-# endif
-#endif
-
-
-// Whether we are compiled with exception support.
-#ifndef YY_EXCEPTIONS
-# if defined __GNUC__ && !defined __EXCEPTIONS
-#  define YY_EXCEPTIONS 0
-# else
-#  define YY_EXCEPTIONS 1
-# endif
-#endif
-
-
-
-// Enable debugging if requested.
-#if YYDEBUG
-
-// A pseudo ostream that takes yydebug_ into account.
-# define YYCDEBUG if (yydebug_) (*yycdebug_)
-
-# define YY_SYMBOL_PRINT(Title, Symbol)         \
-  do {                                          \
-    if (yydebug_)                               \
-    {                                           \
-      *yycdebug_ << Title << ' ';               \
-      yy_print_ (*yycdebug_, Symbol);           \
-      *yycdebug_ << '\n';                       \
-    }                                           \
-  } while (false)
-
-# define YY_REDUCE_PRINT(Rule)          \
-  do {                                  \
-    if (yydebug_)                       \
-      yy_reduce_print_ (Rule);          \
-  } while (false)
-
-# define YY_STACK_PRINT()               \
-  do {                                  \
-    if (yydebug_)                       \
-      yy_stack_print_ ();                \
-  } while (false)
-
-#else // !YYDEBUG
-
-# define YYCDEBUG if (false) std::cerr
-# define YY_SYMBOL_PRINT(Title, Symbol)  YY_USE (Symbol)
-# define YY_REDUCE_PRINT(Rule)           static_cast<void> (0)
-# define YY_STACK_PRINT()                static_cast<void> (0)
-
-#endif // !YYDEBUG
-
-#define yyerrok         (yyerrstatus_ = 0)
-#define yyclearin       (yyla.clear ())
-
-#define YYACCEPT        goto yyacceptlab
-#define YYABORT         goto yyabortlab
-#define YYERROR         goto yyerrorlab
-#define YYRECOVERING()  (!!yyerrstatus_)
-
-#line 50 "QLParser.yy"
-namespace QL {
-#line 135 "QLParser.tab.cc"
-
-  /// Build a parser object.
-  Parser::Parser (QL::Result &result_yyarg)
-#if YYDEBUG
-    : yydebug_ (false),
-      yycdebug_ (&std::cerr),
-#else
-    :
-#endif
-      result (result_yyarg)
-  {}
-
-  Parser::~Parser ()
-  {}
-
-  Parser::syntax_error::~syntax_error () YY_NOEXCEPT YY_NOTHROW
-  {}
-
-  /*---------------.
-  | symbol kinds.  |
-  `---------------*/
-
-
-
-  // by_state.
-  Parser::by_state::by_state () YY_NOEXCEPT
-    : state (empty_state)
-  {}
-
-  Parser::by_state::by_state (const by_state& that) YY_NOEXCEPT
-    : state (that.state)
-  {}
-
-  void
-  Parser::by_state::clear () YY_NOEXCEPT
-  {
-    state = empty_state;
-  }
-
-  void
-  Parser::by_state::move (by_state& that)
-  {
-    state = that.state;
-    that.clear ();
-  }
-
-  Parser::by_state::by_state (state_type s) YY_NOEXCEPT
-    : state (s)
-  {}
-
-  Parser::symbol_kind_type
-  Parser::by_state::kind () const YY_NOEXCEPT
-  {
-    if (state == empty_state)
-      return symbol_kind::S_YYEMPTY;
-    else
-      return YY_CAST (symbol_kind_type, yystos_[+state]);
-  }
-
-  Parser::stack_symbol_type::stack_symbol_type ()
-  {}
-
-  Parser::stack_symbol_type::stack_symbol_type (YY_RVREF (stack_symbol_type) that)
-    : super_type (YY_MOVE (that.state))
-  {
-    switch (that.kind ())
-    {
-      case symbol_kind::S_NUM: // "number"
-      case symbol_kind::S_NAME: // "name"
-      case symbol_kind::S_FNAME: // FNAME
-      case symbol_kind::S_JGROUP: // JGROUP
-      case symbol_kind::S_JPARENT: // JPARENT
-      case symbol_kind::S_QSTR: // QSTR
-      case symbol_kind::S_FILEIOVFD: // FILEIOVFD
-      case symbol_kind::S_exp: // exp
-      case symbol_kind::S_term: // term
-        value.YY_MOVE_OR_COPY< Expression * > (YY_MOVE (that.value));
-        break;
-
-      default:
-        break;
-    }
-
-#if 201103L <= YY_CPLUSPLUS
-    // that is emptied.
-    that.state = empty_state;
-#endif
-  }
-
-  Parser::stack_symbol_type::stack_symbol_type (state_type s, YY_MOVE_REF (symbol_type) that)
-    : super_type (s)
-  {
-    switch (that.kind ())
-    {
-      case symbol_kind::S_NUM: // "number"
-      case symbol_kind::S_NAME: // "name"
-      case symbol_kind::S_FNAME: // FNAME
-      case symbol_kind::S_JGROUP: // JGROUP
-      case symbol_kind::S_JPARENT: // JPARENT
-      case symbol_kind::S_QSTR: // QSTR
-      case symbol_kind::S_FILEIOVFD: // FILEIOVFD
-      case symbol_kind::S_exp: // exp
-      case symbol_kind::S_term: // term
-        value.move< Expression * > (YY_MOVE (that.value));
-        break;
-
-      default:
-        break;
-    }
-
-    // that is emptied.
-    that.kind_ = symbol_kind::S_YYEMPTY;
-  }
-
-#if YY_CPLUSPLUS < 201103L
-  Parser::stack_symbol_type&
-  Parser::stack_symbol_type::operator= (const stack_symbol_type& that)
-  {
-    state = that.state;
-    switch (that.kind ())
-    {
-      case symbol_kind::S_NUM: // "number"
-      case symbol_kind::S_NAME: // "name"
-      case symbol_kind::S_FNAME: // FNAME
-      case symbol_kind::S_JGROUP: // JGROUP
-      case symbol_kind::S_JPARENT: // JPARENT
-      case symbol_kind::S_QSTR: // QSTR
-      case symbol_kind::S_FILEIOVFD: // FILEIOVFD
-      case symbol_kind::S_exp: // exp
-      case symbol_kind::S_term: // term
-        value.copy< Expression * > (that.value);
-        break;
-
-      default:
-        break;
-    }
-
-    return *this;
-  }
-
-  Parser::stack_symbol_type&
-  Parser::stack_symbol_type::operator= (stack_symbol_type& that)
-  {
-    state = that.state;
-    switch (that.kind ())
-    {
-      case symbol_kind::S_NUM: // "number"
-      case symbol_kind::S_NAME: // "name"
-      case symbol_kind::S_FNAME: // FNAME
-      case symbol_kind::S_JGROUP: // JGROUP
-      case symbol_kind::S_JPARENT: // JPARENT
-      case symbol_kind::S_QSTR: // QSTR
-      case symbol_kind::S_FILEIOVFD: // FILEIOVFD
-      case symbol_kind::S_exp: // exp
-      case symbol_kind::S_term: // term
-        value.move< Expression * > (that.value);
-        break;
-
-      default:
-        break;
-    }
-
-    // that is emptied.
-    that.state = empty_state;
-    return *this;
-  }
-#endif
-
-  template <typename Base>
-  void
-  Parser::yy_destroy_ (const char* yymsg, basic_symbol<Base>& yysym) const
-  {
-    if (yymsg)
-      YY_SYMBOL_PRINT (yymsg, yysym);
-  }
-
-#if YYDEBUG
-  template <typename Base>
-  void
-  Parser::yy_print_ (std::ostream& yyo, const basic_symbol<Base>& yysym) const
-  {
-    std::ostream& yyoutput = yyo;
-    YY_USE (yyoutput);
-    if (yysym.empty ())
-      yyo << "empty symbol";
-    else
-      {
-        symbol_kind_type yykind = yysym.kind ();
-        yyo << (yykind < YYNTOKENS ? "token" : "nterm")
-            << ' ' << yysym.name () << " (";
-        YY_USE (yykind);
-        yyo << ')';
-      }
-  }
-#endif
-
-  void
-  Parser::yypush_ (const char* m, YY_MOVE_REF (stack_symbol_type) sym)
-  {
-    if (m)
-      YY_SYMBOL_PRINT (m, sym);
-    yystack_.push (YY_MOVE (sym));
-  }
-
-  void
-  Parser::yypush_ (const char* m, state_type s, YY_MOVE_REF (symbol_type) sym)
-  {
-#if 201103L <= YY_CPLUSPLUS
-    yypush_ (m, stack_symbol_type (s, std::move (sym)));
-#else
-    stack_symbol_type ss (s, sym);
-    yypush_ (m, ss);
-#endif
-  }
-
-  void
-  Parser::yypop_ (int n)
-  {
-    yystack_.pop (n);
-  }
-
-#if YYDEBUG
-  std::ostream&
-  Parser::debug_stream () const
-  {
-    return *yycdebug_;
-  }
-
-  void
-  Parser::set_debug_stream (std::ostream& o)
-  {
-    yycdebug_ = &o;
-  }
-
-
-  Parser::debug_level_type
-  Parser::debug_level () const
-  {
-    return yydebug_;
-  }
-
-  void
-  Parser::set_debug_level (debug_level_type l)
-  {
-    yydebug_ = l;
-  }
-#endif // YYDEBUG
-
-  Parser::state_type
-  Parser::yy_lr_goto_state_ (state_type yystate, int yysym)
-  {
-    int yyr = yypgoto_[yysym - YYNTOKENS] + yystate;
-    if (0 <= yyr && yyr <= yylast_ && yycheck_[yyr] == yystate)
-      return yytable_[yyr];
-    else
-      return yydefgoto_[yysym - YYNTOKENS];
-  }
-
-  bool
-  Parser::yy_pact_value_is_default_ (int yyvalue)
-  {
-    return yyvalue == yypact_ninf_;
-  }
-
-  bool
-  Parser::yy_table_value_is_error_ (int yyvalue)
-  {
-    return yyvalue == yytable_ninf_;
-  }
-
-  int
-  Parser::operator() ()
-  {
-    return parse ();
-  }
-
-  int
-  Parser::parse ()
-  {
-    int yyn;
-    /// Length of the RHS of the rule being reduced.
-    int yylen = 0;
-
-    // Error handling.
-    int yynerrs_ = 0;
-    int yyerrstatus_ = 0;
-
-    /// The lookahead symbol.
-    symbol_type yyla;
-
-    /// The return value of parse ().
-    int yyresult;
-
-#if YY_EXCEPTIONS
-    try
-#endif // YY_EXCEPTIONS
-      {
-    YYCDEBUG << "Starting parse\n";
-
-
-    /* Initialize the stack.  The initial state will be set in
-       yynewstate, since the latter expects the semantical and the
-       location values to have been already stored, initialize these
-       stacks with a primary value.  */
-    yystack_.clear ();
-    yypush_ (YY_NULLPTR, 0, YY_MOVE (yyla));
-
-  /*-----------------------------------------------.
-  | yynewstate -- push a new symbol on the stack.  |
-  `-----------------------------------------------*/
-  yynewstate:
-    YYCDEBUG << "Entering state " << int (yystack_[0].state) << '\n';
-    YY_STACK_PRINT ();
-
-    // Accept?
-    if (yystack_[0].state == yyfinal_)
-      YYACCEPT;
-
-    goto yybackup;
-
-
-  /*-----------.
-  | yybackup.  |
-  `-----------*/
-  yybackup:
-    // Try to take a decision without lookahead.
-    yyn = yypact_[+yystack_[0].state];
-    if (yy_pact_value_is_default_ (yyn))
-      goto yydefault;
-
-    // Read a lookahead token.
-    if (yyla.empty ())
-      {
-        YYCDEBUG << "Reading a token\n";
-#if YY_EXCEPTIONS
-        try
-#endif // YY_EXCEPTIONS
-          {
-            symbol_type yylookahead (yylex (result));
-            yyla.move (yylookahead);
-          }
-#if YY_EXCEPTIONS
-        catch (const syntax_error& yyexc)
-          {
-            YYCDEBUG << "Caught exception: " << yyexc.what() << '\n';
-            error (yyexc);
-            goto yyerrlab1;
-          }
-#endif // YY_EXCEPTIONS
-      }
-    YY_SYMBOL_PRINT ("Next token is", yyla);
-
-    if (yyla.kind () == symbol_kind::S_YYerror)
-    {
-      // The scanner already issued an error message, process directly
-      // to error recovery.  But do not keep the error token as
-      // lookahead, it is too special and may lead us to an endless
-      // loop in error recovery. */
-      yyla.kind_ = symbol_kind::S_YYUNDEF;
-      goto yyerrlab1;
-    }
-
-    /* If the proper action on seeing token YYLA.TYPE is to reduce or
-       to detect an error, take that action.  */
-    yyn += yyla.kind ();
-    if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yyla.kind ())
-      {
-        goto yydefault;
-      }
-
-    // Reduce or error.
-    yyn = yytable_[yyn];
-    if (yyn <= 0)
-      {
-        if (yy_table_value_is_error_ (yyn))
-          goto yyerrlab;
-        yyn = -yyn;
-        goto yyreduce;
-      }
-
-    // Count tokens shifted since error; after three, turn off error status.
-    if (yyerrstatus_)
-      --yyerrstatus_;
-
-    // Shift the lookahead token.
-    yypush_ ("Shifting", state_type (yyn), YY_MOVE (yyla));
-    goto yynewstate;
-
-
-  /*-----------------------------------------------------------.
-  | yydefault -- do the default action for the current state.  |
-  `-----------------------------------------------------------*/
-  yydefault:
-    yyn = yydefact_[+yystack_[0].state];
-    if (yyn == 0)
-      goto yyerrlab;
-    goto yyreduce;
-
-
-  /*-----------------------------.
-  | yyreduce -- do a reduction.  |
-  `-----------------------------*/
-  yyreduce:
-    yylen = yyr2_[yyn];
-    {
-      stack_symbol_type yylhs;
-      yylhs.state = yy_lr_goto_state_ (yystack_[yylen].state, yyr1_[yyn]);
-      /* Variants are always initialized to an empty instance of the
-         correct type. The default '$$ = $1' action is NOT applied
-         when using variants.  */
-      switch (yyr1_[yyn])
-    {
-      case symbol_kind::S_NUM: // "number"
-      case symbol_kind::S_NAME: // "name"
-      case symbol_kind::S_FNAME: // FNAME
-      case symbol_kind::S_JGROUP: // JGROUP
-      case symbol_kind::S_JPARENT: // JPARENT
-      case symbol_kind::S_QSTR: // QSTR
-      case symbol_kind::S_FILEIOVFD: // FILEIOVFD
-      case symbol_kind::S_exp: // exp
-      case symbol_kind::S_term: // term
-        yylhs.value.emplace< Expression * > ();
-        break;
-
-      default:
-        break;
-    }
-
-
-
-      // Perform the reduction.
-      YY_REDUCE_PRINT (yyn);
-#if YY_EXCEPTIONS
-      try
-#endif // YY_EXCEPTIONS
-        {
-          switch (yyn)
-            {
-  case 2: // S: %empty
-#line 104 "QLParser.yy"
-                                { result.out = new Expression (Expression::OP_NUM, (uint64_t) 1); }
-#line 577 "QLParser.tab.cc"
-    break;
-
-  case 3: // S: exp
-#line 105 "QLParser.yy"
-                                { result.out = new Expression (yystack_[0].value.as < Expression * > ()); }
-#line 583 "QLParser.tab.cc"
-    break;
-
-  case 4: // exp: exp DEG exp
-#line 107 "QLParser.yy"
-                                { yylhs.value.as < Expression * > () = new Expression (Expression::OP_DEG, yystack_[2].value.as < Expression * > (), yystack_[0].value.as < Expression * > ()); }
-#line 589 "QLParser.tab.cc"
-    break;
-
-  case 5: // exp: exp MUL exp
-#line 108 "QLParser.yy"
-                                { yylhs.value.as < Expression * > () = new Expression (Expression::OP_MUL, yystack_[2].value.as < Expression * > (), yystack_[0].value.as < Expression * > ()); }
-#line 595 "QLParser.tab.cc"
-    break;
-
-  case 6: // exp: exp DIV exp
-#line 109 "QLParser.yy"
-                                { yylhs.value.as < Expression * > () = new Expression (Expression::OP_DIV, yystack_[2].value.as < Expression * > (), yystack_[0].value.as < Expression * > ()); }
-#line 601 "QLParser.tab.cc"
-    break;
-
-  case 7: // exp: exp REM exp
-#line 110 "QLParser.yy"
-                                { yylhs.value.as < Expression * > () = new Expression (Expression::OP_REM, yystack_[2].value.as < Expression * > (), yystack_[0].value.as < Expression * > ()); }
-#line 607 "QLParser.tab.cc"
-    break;
-
-  case 8: // exp: exp ADD exp
-#line 111 "QLParser.yy"
-                                { yylhs.value.as < Expression * > () = new Expression (Expression::OP_ADD, yystack_[2].value.as < Expression * > (), yystack_[0].value.as < Expression * > ()); }
-#line 613 "QLParser.tab.cc"
-    break;
-
-  case 9: // exp: exp MINUS exp
-#line 112 "QLParser.yy"
-                                { yylhs.value.as < Expression * > () = new Expression (Expression::OP_MINUS, yystack_[2].value.as < Expression * > (), yystack_[0].value.as < Expression * > ()); }
-#line 619 "QLParser.tab.cc"
-    break;
-
-  case 10: // exp: exp LS exp
-#line 113 "QLParser.yy"
-                                { yylhs.value.as < Expression * > () = new Expression (Expression::OP_LS, yystack_[2].value.as < Expression * > (), yystack_[0].value.as < Expression * > ()); }
-#line 625 "QLParser.tab.cc"
-    break;
-
-  case 11: // exp: exp RS exp
-#line 114 "QLParser.yy"
-                                { yylhs.value.as < Expression * > () = new Expression (Expression::OP_RS, yystack_[2].value.as < Expression * > (), yystack_[0].value.as < Expression * > ()); }
-#line 631 "QLParser.tab.cc"
-    break;
-
-  case 12: // exp: exp LT exp
-#line 115 "QLParser.yy"
-                                { yylhs.value.as < Expression * > () = new Expression (Expression::OP_LT, yystack_[2].value.as < Expression * > (), yystack_[0].value.as < Expression * > ()); }
-#line 637 "QLParser.tab.cc"
-    break;
-
-  case 13: // exp: exp LE exp
-#line 116 "QLParser.yy"
-                                { yylhs.value.as < Expression * > () = new Expression (Expression::OP_LE, yystack_[2].value.as < Expression * > (), yystack_[0].value.as < Expression * > ()); }
-#line 643 "QLParser.tab.cc"
-    break;
-
-  case 14: // exp: exp GT exp
-#line 117 "QLParser.yy"
-                                { yylhs.value.as < Expression * > () = new Expression (Expression::OP_GT, yystack_[2].value.as < Expression * > (), yystack_[0].value.as < Expression * > ()); }
-#line 649 "QLParser.tab.cc"
-    break;
-
-  case 15: // exp: exp GE exp
-#line 118 "QLParser.yy"
-                                { yylhs.value.as < Expression * > () = new Expression (Expression::OP_GE, yystack_[2].value.as < Expression * > (), yystack_[0].value.as < Expression * > ()); }
-#line 655 "QLParser.tab.cc"
-    break;
-
-  case 16: // exp: exp EQ exp
-#line 119 "QLParser.yy"
-                                { yylhs.value.as < Expression * > () = new Expression (Expression::OP_EQ, yystack_[2].value.as < Expression * > (), yystack_[0].value.as < Expression * > ()); }
-#line 661 "QLParser.tab.cc"
-    break;
-
-  case 17: // exp: exp NE exp
-#line 120 "QLParser.yy"
-                                { yylhs.value.as < Expression * > () = new Expression (Expression::OP_NE, yystack_[2].value.as < Expression * > (), yystack_[0].value.as < Expression * > ()); }
-#line 667 "QLParser.tab.cc"
-    break;
-
-  case 18: // exp: exp BITAND exp
-#line 121 "QLParser.yy"
-                                { yylhs.value.as < Expression * > () = new Expression (Expression::OP_BITAND, yystack_[2].value.as < Expression * > (), yystack_[0].value.as < Expression * > ()); }
-#line 673 "QLParser.tab.cc"
-    break;
-
-  case 19: // exp: exp BITXOR exp
-#line 122 "QLParser.yy"
-                                { yylhs.value.as < Expression * > () = new Expression (Expression::OP_BITXOR, yystack_[2].value.as < Expression * > (), yystack_[0].value.as < Expression * > ()); }
-#line 679 "QLParser.tab.cc"
-    break;
-
-  case 20: // exp: exp BITOR exp
-#line 123 "QLParser.yy"
-                                { yylhs.value.as < Expression * > () = new Expression (Expression::OP_BITOR, yystack_[2].value.as < Expression * > (), yystack_[0].value.as < Expression * > ()); }
-#line 685 "QLParser.tab.cc"
-    break;
-
-  case 21: // exp: exp AND exp
-#line 124 "QLParser.yy"
-                                { yylhs.value.as < Expression * > () = new Expression (Expression::OP_AND, yystack_[2].value.as < Expression * > (), yystack_[0].value.as < Expression * > ()); }
-#line 691 "QLParser.tab.cc"
-    break;
-
-  case 22: // exp: exp OR exp
-#line 125 "QLParser.yy"
-                                { yylhs.value.as < Expression * > () = new Expression (Expression::OP_OR, yystack_[2].value.as < Expression * > (), yystack_[0].value.as < Expression * > ()); }
-#line 697 "QLParser.tab.cc"
-    break;
-
-  case 23: // exp: exp NEQV exp
-#line 126 "QLParser.yy"
-                                { yylhs.value.as < Expression * > () = new Expression (Expression::OP_NEQV, yystack_[2].value.as < Expression * > (), yystack_[0].value.as < Expression * > ()); }
-#line 703 "QLParser.tab.cc"
-    break;
-
-  case 24: // exp: exp EQV exp
-#line 127 "QLParser.yy"
-                                { yylhs.value.as < Expression * > () = new Expression (Expression::OP_EQV, yystack_[2].value.as < Expression * > (), yystack_[0].value.as < Expression * > ()); }
-#line 709 "QLParser.tab.cc"
-    break;
-
-  case 25: // exp: exp QWE exp COLON exp
-#line 128 "QLParser.yy"
-                                { Expression colon = Expression (Expression::OP_COLON, yystack_[2].value.as < Expression * > (), yystack_[0].value.as < Expression * > ());
-                                 yylhs.value.as < Expression * > () = new Expression (Expression::OP_QWE, yystack_[4].value.as < Expression * > (), &colon); }
-#line 716 "QLParser.tab.cc"
-    break;
-
-  case 26: // exp: exp COMMA exp
-#line 130 "QLParser.yy"
-                                { yylhs.value.as < Expression * > () = new Expression (Expression::OP_COMMA, yystack_[2].value.as < Expression * > (), yystack_[0].value.as < Expression * > ()); }
-#line 722 "QLParser.tab.cc"
-    break;
-
-  case 27: // exp: exp IN exp
-#line 131 "QLParser.yy"
-                                { yylhs.value.as < Expression * > () = new Expression (Expression::OP_IN, yystack_[2].value.as < Expression * > (), yystack_[0].value.as < Expression * > ()); }
-#line 728 "QLParser.tab.cc"
-    break;
-
-  case 28: // exp: exp SOME IN exp
-#line 132 "QLParser.yy"
-                                { yylhs.value.as < Expression * > () = new Expression (Expression::OP_SOMEIN, yystack_[3].value.as < Expression * > (), yystack_[0].value.as < Expression * > ()); }
-#line 734 "QLParser.tab.cc"
-    break;
-
-  case 29: // exp: exp ORDR IN exp
-#line 133 "QLParser.yy"
-                                { yylhs.value.as < Expression * > () = new Expression (Expression::OP_ORDRIN, yystack_[3].value.as < Expression * > (), yystack_[0].value.as < Expression * > ()); }
-#line 740 "QLParser.tab.cc"
-    break;
-
-  case 30: // exp: term
-#line 134 "QLParser.yy"
-                                { yylhs.value.as < Expression * > () = new Expression (yystack_[0].value.as < Expression * > ()); }
-#line 746 "QLParser.tab.cc"
-    break;
-
-  case 31: // term: MINUS term
-#line 136 "QLParser.yy"
-                                { Expression num = Expression (Expression::OP_NUM, (uint64_t) 0);
-                                 yylhs.value.as < Expression * > () = new Expression (Expression::OP_MINUS, &num, yystack_[0].value.as < Expression * > ()); }
-#line 753 "QLParser.tab.cc"
-    break;
-
-  case 32: // term: NOT term
-#line 138 "QLParser.yy"
-                                { yylhs.value.as < Expression * > () = new Expression (Expression::OP_NOT, yystack_[0].value.as < Expression * > (), NULL); }
-#line 759 "QLParser.tab.cc"
-    break;
-
-  case 33: // term: BITNOT term
-#line 139 "QLParser.yy"
-                                { yylhs.value.as < Expression * > () = new Expression (Expression::OP_BITNOT, yystack_[0].value.as < Expression * > (), NULL); }
-#line 765 "QLParser.tab.cc"
-    break;
-
-  case 34: // term: "(" exp ")"
-#line 140 "QLParser.yy"
-                                { yylhs.value.as < Expression * > () = new Expression (yystack_[1].value.as < Expression * > ()); }
-#line 771 "QLParser.tab.cc"
-    break;
-
-  case 35: // term: FNAME "(" QSTR ")"
-#line 141 "QLParser.yy"
-                                { yylhs.value.as < Expression * > () = new Expression (Expression::OP_FUNC, yystack_[3].value.as < Expression * > (), yystack_[1].value.as < Expression * > ()); }
-#line 777 "QLParser.tab.cc"
-    break;
-
-  case 36: // term: HASPROP "(" "name" ")"
-#line 142 "QLParser.yy"
-                                 { yylhs.value.as < Expression * > () = new Expression (Expression::OP_HASPROP, yystack_[1].value.as < Expression * > (), NULL); }
-#line 783 "QLParser.tab.cc"
-    break;
-
-  case 37: // term: JGROUP "(" QSTR ")"
-#line 143 "QLParser.yy"
-                                { yylhs.value.as < Expression * > () = new Expression (Expression::OP_JAVA, yystack_[3].value.as < Expression * > (), yystack_[1].value.as < Expression * > ()); }
-#line 789 "QLParser.tab.cc"
-    break;
-
-  case 38: // term: JPARENT "(" QSTR ")"
-#line 144 "QLParser.yy"
-                                 { yylhs.value.as < Expression * > () = new Expression (Expression::OP_JAVA, yystack_[3].value.as < Expression * > (), yystack_[1].value.as < Expression * > ()); }
-#line 795 "QLParser.tab.cc"
-    break;
-
-  case 39: // term: FILEIOVFD "(" QSTR ")"
-#line 145 "QLParser.yy"
-                                   { yylhs.value.as < Expression * > () = new Expression (Expression::OP_FILE, yystack_[3].value.as < Expression * > (), yystack_[1].value.as < Expression * > ()); }
-#line 801 "QLParser.tab.cc"
-    break;
-
-  case 40: // term: "number"
-#line 146 "QLParser.yy"
-                                { yylhs.value.as < Expression * > () = new Expression (yystack_[0].value.as < Expression * > ()); }
-#line 807 "QLParser.tab.cc"
-    break;
-
-  case 41: // term: "name"
-#line 147 "QLParser.yy"
-                                { yylhs.value.as < Expression * > () = new Expression (yystack_[0].value.as < Expression * > ()); }
-#line 813 "QLParser.tab.cc"
-    break;
-
-
-#line 817 "QLParser.tab.cc"
-
-            default:
-              break;
-            }
-        }
-#if YY_EXCEPTIONS
-      catch (const syntax_error& yyexc)
-        {
-          YYCDEBUG << "Caught exception: " << yyexc.what() << '\n';
-          error (yyexc);
-          YYERROR;
-        }
-#endif // YY_EXCEPTIONS
-      YY_SYMBOL_PRINT ("-> $$ =", yylhs);
-      yypop_ (yylen);
-      yylen = 0;
-
-      // Shift the result of the reduction.
-      yypush_ (YY_NULLPTR, YY_MOVE (yylhs));
-    }
-    goto yynewstate;
-
-
-  /*--------------------------------------.
-  | yyerrlab -- here on detecting error.  |
-  `--------------------------------------*/
-  yyerrlab:
-    // If not already recovering from an error, report this error.
-    if (!yyerrstatus_)
-      {
-        ++yynerrs_;
-        std::string msg = YY_("syntax error");
-        error (YY_MOVE (msg));
-      }
-
-
-    if (yyerrstatus_ == 3)
-      {
-        /* If just tried and failed to reuse lookahead token after an
-           error, discard it.  */
-
-        // Return failure if at end of input.
-        if (yyla.kind () == symbol_kind::S_YYEOF)
-          YYABORT;
-        else if (!yyla.empty ())
-          {
-            yy_destroy_ ("Error: discarding", yyla);
-            yyla.clear ();
-          }
-      }
-
-    // Else will try to reuse lookahead token after shifting the error token.
-    goto yyerrlab1;
-
-
-  /*---------------------------------------------------.
-  | yyerrorlab -- error raised explicitly by YYERROR.  |
-  `---------------------------------------------------*/
-  yyerrorlab:
-    /* Pacify compilers when the user code never invokes YYERROR and
-       the label yyerrorlab therefore never appears in user code.  */
-    if (false)
-      YYERROR;
-
-    /* Do not reclaim the symbols of the rule whose action triggered
-       this YYERROR.  */
-    yypop_ (yylen);
-    yylen = 0;
-    YY_STACK_PRINT ();
-    goto yyerrlab1;
-
-
-  /*-------------------------------------------------------------.
-  | yyerrlab1 -- common code for both syntax error and YYERROR.  |
-  `-------------------------------------------------------------*/
-  yyerrlab1:
-    yyerrstatus_ = 3;   // Each real token shifted decrements this.
-    // Pop stack until we find a state that shifts the error token.
-    for (;;)
-      {
-        yyn = yypact_[+yystack_[0].state];
-        if (!yy_pact_value_is_default_ (yyn))
-          {
-            yyn += symbol_kind::S_YYerror;
-            if (0 <= yyn && yyn <= yylast_
-                && yycheck_[yyn] == symbol_kind::S_YYerror)
-              {
-                yyn = yytable_[yyn];
-                if (0 < yyn)
-                  break;
-              }
-          }
-
-        // Pop the current state because it cannot handle the error token.
-        if (yystack_.size () == 1)
-          YYABORT;
-
-        yy_destroy_ ("Error: popping", yystack_[0]);
-        yypop_ ();
-        YY_STACK_PRINT ();
-      }
-    {
-      stack_symbol_type error_token;
-
-
-      // Shift the error token.
-      error_token.state = state_type (yyn);
-      yypush_ ("Shifting", YY_MOVE (error_token));
-    }
-    goto yynewstate;
-
-
-  /*-------------------------------------.
-  | yyacceptlab -- YYACCEPT comes here.  |
-  `-------------------------------------*/
-  yyacceptlab:
-    yyresult = 0;
-    goto yyreturn;
-
-
-  /*-----------------------------------.
-  | yyabortlab -- YYABORT comes here.  |
-  `-----------------------------------*/
-  yyabortlab:
-    yyresult = 1;
-    goto yyreturn;
-
-
-  /*-----------------------------------------------------.
-  | yyreturn -- parsing is finished, return the result.  |
-  `-----------------------------------------------------*/
-  yyreturn:
-    if (!yyla.empty ())
-      yy_destroy_ ("Cleanup: discarding lookahead", yyla);
-
-    /* Do not reclaim the symbols of the rule whose action triggered
-       this YYABORT or YYACCEPT.  */
-    yypop_ (yylen);
-    YY_STACK_PRINT ();
-    while (1 < yystack_.size ())
-      {
-        yy_destroy_ ("Cleanup: popping", yystack_[0]);
-        yypop_ ();
-      }
-
-    return yyresult;
-  }
-#if YY_EXCEPTIONS
-    catch (...)
-      {
-        YYCDEBUG << "Exception caught: cleaning lookahead and stack\n";
-        // Do not try to display the values of the reclaimed symbols,
-        // as their printers might throw an exception.
-        if (!yyla.empty ())
-          yy_destroy_ (YY_NULLPTR, yyla);
-
-        while (1 < yystack_.size ())
-          {
-            yy_destroy_ (YY_NULLPTR, yystack_[0]);
-            yypop_ ();
-          }
-        throw;
-      }
-#endif // YY_EXCEPTIONS
-  }
-
-  void
-  Parser::error (const syntax_error& yyexc)
-  {
-    error (yyexc.what ());
-  }
-
-#if YYDEBUG || 0
-  const char *
-  Parser::symbol_name (symbol_kind_type yysymbol)
-  {
-    return yytname_[yysymbol];
-  }
-#endif // #if YYDEBUG || 0
-
-
-
-
-
-  const signed char Parser::yypact_ninf_ = -3;
-
-  const signed char Parser::yytable_ninf_ = -1;
-
-  const short
-  Parser::yypact_[] =
-  {
-       0,     0,    -3,    -3,    -2,     1,     8,    13,    14,     0,
-       0,     0,     2,   142,    -3,    50,     7,    15,     9,    11,
-      12,    -3,    -3,    -3,    -3,     0,     6,    38,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    -3,    21,    22,    48,    49,    51,   188,     0,     0,
-     221,    96,    95,    95,    95,    95,    95,    95,    95,   141,
-     141,   141,   141,   141,   141,    17,    17,    17,    17,    17,
-      17,    17,    17,    -3,    -3,    -3,    -3,    -3,   188,   188,
-       0,   221
-  };
-
-  const signed char
-  Parser::yydefact_[] =
-  {
-       2,     0,    40,    41,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     3,    30,     0,     0,     0,     0,     0,
-       0,    31,    32,    33,     1,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    34,     0,     0,     0,     0,     0,    27,     0,     0,
-      26,     0,    21,    22,    24,    23,    18,    20,    19,    16,
-      17,    12,    14,    13,    15,    10,    11,     8,     9,     5,
-       6,     7,     4,    35,    36,    37,    38,    39,    28,    29,
-       0,    25
-  };
-
-  const signed char
-  Parser::yypgoto_[] =
-  {
-      -3,    -3,    -1,     4
-  };
-
-  const signed char
-  Parser::yydefgoto_[] =
-  {
-       0,    12,    13,    14
-  };
-
-  const signed char
-  Parser::yytable_[] =
-  {
-      15,    16,    24,     1,    17,     2,     3,     4,     5,     6,
-       7,    18,     8,    21,    22,    23,    19,    20,    52,    58,
-      54,    53,    55,    56,    57,    83,    84,    60,    61,    62,
-      63,    64,    65,    66,    67,    68,    69,    70,    71,    72,
-      73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
-       9,    59,    85,    86,    51,    87,     0,    88,    89,    10,
-       0,    11,     0,    25,    26,    27,    28,     0,    29,     0,
-       0,     0,    30,     0,    31,    50,    32,    33,    34,    35,
-      36,     0,    37,     0,    38,     0,    39,     0,    40,    91,
-      41,     0,    42,     0,    43,     0,    44,     0,    45,     0,
-      46,     0,    47,     0,    48,     0,    49,     0,    50,    25,
-      26,    27,    28,     0,    29,     0,    90,     0,    30,     0,
-      31,     0,    32,    33,    34,    35,    36,    37,    37,    38,
-      38,    39,    39,    40,    40,    41,    41,    42,    42,    43,
-      43,    44,    44,    45,    45,    46,    46,    47,    47,    48,
-      48,    49,    49,    50,    50,    25,    26,    27,    28,     0,
-      29,     0,     0,     0,    30,     0,    31,     0,    32,    33,
-      34,    35,    36,    -1,    37,    -1,    38,    -1,    39,    -1,
-      40,    -1,    41,    -1,    42,    43,    43,    44,    44,    45,
-      45,    46,    46,    47,    47,    48,    48,    49,    49,    50,
-      50,    -1,    -1,    -1,    28,     0,    29,     0,     0,     0,
-      30,     0,    31,     0,    32,    33,    34,    35,    36,     0,
-      37,     0,    38,     0,    39,     0,    40,     0,    41,     0,
-      42,     0,    43,     0,    44,     0,    45,     0,    46,    29,
-      47,     0,    48,    30,    49,    31,    50,    32,    33,    34,
-      35,    36,     0,    37,     0,    38,     0,    39,     0,    40,
-       0,    41,     0,    42,     0,    43,     0,    44,     0,    45,
-       0,    46,     0,    47,     0,    48,     0,    49,     0,    50
-  };
-
-  const signed char
-  Parser::yycheck_[] =
-  {
-       1,     3,     0,     3,     3,     5,     6,     7,     8,     9,
-      10,     3,    12,     9,    10,    11,     3,     3,    11,    13,
-      11,     6,    11,    11,    25,     4,     4,    28,    29,    30,
-      31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
-      41,    42,    43,    44,    45,    46,    47,    48,    49,    50,
-      50,    13,     4,     4,     4,     4,    -1,    58,    59,    59,
-      -1,    61,    -1,    13,    14,    15,    16,    -1,    18,    -1,
-      -1,    -1,    22,    -1,    24,    58,    26,    27,    28,    29,
-      30,    -1,    32,    -1,    34,    -1,    36,    -1,    38,    90,
-      40,    -1,    42,    -1,    44,    -1,    46,    -1,    48,    -1,
-      50,    -1,    52,    -1,    54,    -1,    56,    -1,    58,    13,
-      14,    15,    16,    -1,    18,    -1,    20,    -1,    22,    -1,
-      24,    -1,    26,    27,    28,    29,    30,    32,    32,    34,
-      34,    36,    36,    38,    38,    40,    40,    42,    42,    44,
-      44,    46,    46,    48,    48,    50,    50,    52,    52,    54,
-      54,    56,    56,    58,    58,    13,    14,    15,    16,    -1,
-      18,    -1,    -1,    -1,    22,    -1,    24,    -1,    26,    27,
-      28,    29,    30,    32,    32,    34,    34,    36,    36,    38,
-      38,    40,    40,    42,    42,    44,    44,    46,    46,    48,
-      48,    50,    50,    52,    52,    54,    54,    56,    56,    58,
-      58,    13,    14,    15,    16,    -1,    18,    -1,    -1,    -1,
-      22,    -1,    24,    -1,    26,    27,    28,    29,    30,    -1,
-      32,    -1,    34,    -1,    36,    -1,    38,    -1,    40,    -1,
-      42,    -1,    44,    -1,    46,    -1,    48,    -1,    50,    18,
-      52,    -1,    54,    22,    56,    24,    58,    26,    27,    28,
-      29,    30,    -1,    32,    -1,    34,    -1,    36,    -1,    38,
-      -1,    40,    -1,    42,    -1,    44,    -1,    46,    -1,    48,
-      -1,    50,    -1,    52,    -1,    54,    -1,    56,    -1,    58
-  };
-
-  const signed char
-  Parser::yystos_[] =
-  {
-       0,     3,     5,     6,     7,     8,     9,    10,    12,    50,
-      59,    61,    64,    65,    66,    65,     3,     3,     3,     3,
-       3,    66,    66,    66,     0,    13,    14,    15,    16,    18,
-      22,    24,    26,    27,    28,    29,    30,    32,    34,    36,
-      38,    40,    42,    44,    46,    48,    50,    52,    54,    56,
-      58,     4,    11,     6,    11,    11,    11,    65,    13,    13,
-      65,    65,    65,    65,    65,    65,    65,    65,    65,    65,
-      65,    65,    65,    65,    65,    65,    65,    65,    65,    65,
-      65,    65,    65,     4,     4,     4,     4,     4,    65,    65,
-      20,    65
-  };
-
-  const signed char
-  Parser::yyr1_[] =
-  {
-       0,    63,    64,    64,    65,    65,    65,    65,    65,    65,
-      65,    65,    65,    65,    65,    65,    65,    65,    65,    65,
-      65,    65,    65,    65,    65,    65,    65,    65,    65,    65,
-      65,    66,    66,    66,    66,    66,    66,    66,    66,    66,
-      66,    66
-  };
-
-  const signed char
-  Parser::yyr2_[] =
-  {
-       0,     2,     0,     1,     3,     3,     3,     3,     3,     3,
-       3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
-       3,     3,     3,     3,     3,     5,     3,     3,     4,     4,
-       1,     2,     2,     2,     3,     4,     4,     4,     4,     4,
-       1,     1
-  };
-
-
-#if YYDEBUG
-  // YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
-  // First, the terminals, then, starting at \a YYNTOKENS, nonterminals.
-  const char*
-  const Parser::yytname_[] =
-  {
-  "\"end of file\"", "error", "\"invalid token\"", "\"(\"", "\")\"",
-  "\"number\"", "\"name\"", "FNAME", "HASPROP", "JGROUP", "JPARENT",
-  "QSTR", "FILEIOVFD", "IN", "SOME", "ORDR", "COMMA", "\",\"", "QWE",
-  "\"?\"", "COLON", "\":\"", "AND", "\"&&\"", "OR", "\"|\"", "EQV", "NEQV",
-  "BITAND", "BITOR", "BITXOR", "\"^\"", "EQ", "\"=\"", "NE", "\"!=\"",
-  "LT", "\"<\"", "GT", "\">\"", "LE", "\"<=\"", "GE", "\">=\"", "LS",
-  "\"<<\"", "RS", "\">>\"", "ADD", "\"+\"", "MINUS", "\"-\"", "MUL",
-  "\"*\"", "DIV", "\"/\"", "REM", "\"%\"", "DEG", "NOT", "\"!\"", "BITNOT",
-  "\"~\"", "$accept", "S", "exp", "term", YY_NULLPTR
-  };
-#endif
-
-
-#if YYDEBUG
-  const unsigned char
-  Parser::yyrline_[] =
-  {
-       0,   104,   104,   105,   107,   108,   109,   110,   111,   112,
-     113,   114,   115,   116,   117,   118,   119,   120,   121,   122,
-     123,   124,   125,   126,   127,   128,   130,   131,   132,   133,
-     134,   136,   138,   139,   140,   141,   142,   143,   144,   145,
-     146,   147
-  };
-
-  void
-  Parser::yy_stack_print_ () const
-  {
-    *yycdebug_ << "Stack now";
-    for (stack_type::const_iterator
-           i = yystack_.begin (),
-           i_end = yystack_.end ();
-         i != i_end; ++i)
-      *yycdebug_ << ' ' << int (i->state);
-    *yycdebug_ << '\n';
-  }
-
-  void
-  Parser::yy_reduce_print_ (int yyrule) const
-  {
-    int yylno = yyrline_[yyrule];
-    int yynrhs = yyr2_[yyrule];
-    // Print the symbols being reduced, and their result.
-    *yycdebug_ << "Reducing stack by rule " << yyrule - 1
-               << " (line " << yylno << "):\n";
-    // The symbols being reduced.
-    for (int yyi = 0; yyi < yynrhs; yyi++)
-      YY_SYMBOL_PRINT ("   $" << yyi + 1 << " =",
-                       yystack_[(yynrhs) - (yyi + 1)]);
-  }
-#endif // YYDEBUG
-
-
-#line 50 "QLParser.yy"
-} // QL
-#line 1210 "QLParser.tab.cc"
-
-#line 149 "QLParser.yy"
-
-
-namespace QL
-{
-  static Parser::symbol_type
-  unget_ret (std::istream &in, char c, Parser::symbol_type tok)
-  {
-    in.putback (c);
-    return tok;
-  }
-
-  static Expression *
-  processName (char *name)
-  {
-    int propID = dbeSession->getPropIdByName (name);
-    if (propID != PROP_NONE)
-      {
-       Expression *expr = new Expression (Expression::OP_NUM, (uint64_t) propID);
-       Expression *ret = new Expression (Expression::OP_NAME, expr);
-       delete expr;
-       return ret;
-      }
-
-    // If a name is not statically known try user defined objects
-    Expression *expr = dbeSession->findObjDefByName (name);
-    if (expr != NULL)
-      return expr->copy();
-
-    throw Parser::syntax_error ("Name not found");
-  }
-
-  static Parser::symbol_type
-  yylex (QL::Result &result)
-  {
-    int base = 0;
-    int c;
-
-    do
-      c = result.in.get ();
-    while (result.in && (c == ' ' || c == '\t'));
-    if (!result.in)
-      return Parser::make_YYEOF ();
-
-    switch (c)
-      {
-      case '\n': return Parser::make_YYEOF ();
-      case '(': return Parser::make_LPAR () ;
-      case ')': return Parser::make_RPAR ();
-      case ',': return Parser::make_COMMA ();
-      case '%': return Parser::make_REM ();
-      case '/': return Parser::make_DIV ();
-      case '*': return Parser::make_MUL ();
-      case '-': return Parser::make_MINUS ();
-      case '+': return Parser::make_ADD ();
-      case '~': return Parser::make_BITNOT ();
-      case '^': return Parser::make_BITXOR ();
-      case '?': return Parser::make_QWE ();
-      case ':': return Parser::make_COLON ();
-      case '|':
-       c = result.in.get ();
-       if (c == '|')
-         return Parser::make_OR ();
-       else
-         return unget_ret (result.in, c, Parser::make_BITOR ());
-      case '&':
-       c = result.in.get ();
-       if (c == '&')
-         return Parser::make_AND ();
-       else
-         return unget_ret (result.in, c, Parser::make_BITAND ());
-      case '!':
-       c = result.in.get ();
-       if (c == '=')
-         return Parser::make_NE ();
-       else
-         return unget_ret (result.in, c, Parser::make_NOT ());
-      case '=':
-       c = result.in.get ();
-       if (c == '=')
-         return Parser::make_EQ ();
-       else
-         throw Parser::syntax_error ("Syntax error after =");
-      case '<':
-       c = result.in.get ();
-       if (c == '=')
-         return Parser::make_LE ();
-       else if (c == '<')
-         return Parser::make_LS ();
-       else
-         return unget_ret (result.in, c, Parser::make_LT ());
-      case '>':
-       c = result.in.get ();
-       if (c == '=')
-         return Parser::make_GE ();
-       else if (c == '>')
-         return Parser::make_RS ();
-       else
-         return unget_ret (result.in, c, Parser::make_GT ());
-      case '"':
-       {
-         int  maxsz = 16;
-         char *str = (char *) malloc (maxsz);
-         char *ptr = str;
-
-         for (;;)
-           {
-             c = result.in.get ();
-             if (!result.in)
-               {
-                 free (str);
-                 throw Parser::syntax_error ("Unclosed \"");
-               }
-
-             switch (c)
-               {
-               case '"':
-                 *ptr = (char)0;
-                 // XXX omazur: need new string type
-                 return Parser::make_QSTR (new Expression (Expression::OP_NUM, (uint64_t) str));
-               case 0:
-               case '\n':
-                 free (str);
-                 throw Parser::syntax_error ("Multiline strings are not supported");
-               default:
-                 if (ptr - str >= maxsz)
-                   {
-                     size_t len = ptr - str;
-                     maxsz = maxsz > 8192 ? maxsz + 8192 : maxsz * 2;
-                     char *new_s = (char *) realloc (str, maxsz);
-                     str = new_s;
-                     ptr = str + len;
-                   }
-                 *ptr++ = c;
-               }
-           }
-       }
-      default:
-       if (c == '0')
-         {
-           base = 8;
-           c = result.in.get ();
-           if ( c == 'x' )
-             {
-               base = 16;
-               c = result.in.get ();
-             }
-         }
-       else if (c >= '1' && c <='9')
-         base = 10;
-
-       if (base)
-         {
-           uint64_t lval = 0;
-           for (;;)
-             {
-               int digit = -1;
-               switch (c)
-                 {
-                 case '0': case '1': case '2': case '3':
-                 case '4': case '5': case '6': case '7':
-                   digit = c - '0';
-                   break;
-                 case '8': case '9':
-                   if (base > 8)
-                     digit = c - '0';
-                   break;
-                 case 'a': case 'b': case 'c':
-                 case 'd': case 'e': case 'f':
-                   if (base == 16)
-                     digit = c - 'a' + 10;
-                   break;
-                 case 'A': case 'B': case 'C':
-                 case 'D': case 'E': case 'F':
-                   if (base == 16)
-                     digit = c - 'A' + 10;
-                   break;
-                 }
-               if  (digit == -1)
-                 {
-                   result.in.putback (c);
-                   break;
-                 }
-               lval = lval * base + digit;
-               c = result.in.get ();
-             }
-           return Parser::make_NUM (new Expression (Expression::OP_NUM, lval));
-         }
-
-       if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))
-         {
-           char name[32];      // omazur XXX: accept any length
-           name[0] = (char)c;
-           for (size_t i = 1; i < sizeof (name); i++)
-             {
-               c = result.in.get ();
-               if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') ||
-                   (c >= '0' && c <= '9') || (c == '_'))
-                 name[i] = c;
-               else
-                 {
-                   name[i] = (char)0;
-                   result.in.putback (c);
-                   break;
-                 }
-             }
-
-           if (strcasecmp (name, NTXT ("IN")) == 0)
-             return Parser::make_IN ();
-           else if (strcasecmp (name, NTXT ("SOME")) == 0)
-             return Parser::make_SOME ();
-           else if (strcasecmp (name, NTXT ("ORDERED")) == 0)
-             return Parser::make_ORDR ();
-           else if (strcasecmp (name, NTXT ("TRUE")) == 0)
-             return Parser::make_NUM (new Expression (Expression::OP_NUM, (uint64_t) 1));
-           else if (strcasecmp (name, NTXT ("FALSE")) == 0)
-             return Parser::make_NUM (new Expression (Expression::OP_NUM, (uint64_t) 0));
-           else if (strcasecmp (name, NTXT ("FNAME")) == 0)
-             return Parser::make_FNAME (new Expression (Expression::OP_NUM, Expression::FUNC_FNAME));
-           else if (strcasecmp (name, NTXT ("HAS_PROP")) == 0)
-             return Parser::make_HASPROP ();
-           else if (strcasecmp (name, NTXT ("JGROUP")) == 0)
-             return Parser::make_JGROUP (new Expression (Expression::OP_NUM, Expression::JAVA_JGROUP));
-           else if (strcasecmp (name, NTXT ("JPARENT")) == 0 )
-             return Parser::make_JPARENT (new Expression (Expression::OP_NUM, Expression::JAVA_JPARENT));
-           else if (strcasecmp (name, NTXT ("DNAME")) == 0)
-             return Parser::make_FNAME (new Expression (Expression::OP_NUM, Expression::FUNC_DNAME));
-           else if (strcasecmp (name, NTXT ("FILEIOVFD")) == 0 )
-             return Parser::make_FILEIOVFD (new Expression (Expression::OP_NUM, (uint64_t) 0));
-
-           return Parser::make_NAME (processName (name));
-         }
-
-       throw Parser::syntax_error ("Syntax error");
-      }
-  }
-  void
-  Parser::error (const std::string &)
-  {
-    // do nothing for now
-  }
-}
-
diff --git a/gprofng/src/QLParser.tab.hh b/gprofng/src/QLParser.tab.hh
deleted file mode 100644 (file)
index eaf2cb5..0000000
+++ /dev/null
@@ -1,2038 +0,0 @@
-// A Bison parser, made by GNU Bison 3.7.5.
-
-// Skeleton interface for Bison LALR(1) parsers in C++
-
-// Copyright (C) 2002-2015, 2018-2021 Free Software Foundation, Inc.
-
-// This program 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.
-
-// This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.
-
-// As a special exception, you may create a larger work that contains
-// part or all of the Bison parser skeleton and distribute that work
-// under terms of your choice, so long as that work isn't itself a
-// parser generator using the skeleton or a modified version thereof
-// as a parser skeleton.  Alternatively, if you modify or redistribute
-// the parser skeleton itself, you may (at your option) remove this
-// special exception, which will cause the skeleton and the resulting
-// Bison output files to be licensed under the GNU General Public
-// License without this special exception.
-
-// This special exception was added by the Free Software Foundation in
-// version 2.2 of Bison.
-
-
-/**
- ** \file QLParser.tab.hh
- ** Define the QL::parser class.
- */
-
-// C++ LALR(1) parser skeleton written by Akim Demaille.
-
-// DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual,
-// especially those whose name start with YY_ or yy_.  They are
-// private implementation details that can be changed or removed.
-
-#ifndef YY_YY_QLPARSER_TAB_HH_INCLUDED
-# define YY_YY_QLPARSER_TAB_HH_INCLUDED
-// "%code requires" blocks.
-#line 33 "QLParser.yy"
-
-#include "QLParser.h"
-#include "DbeSession.h"
-#include "Expression.h"
-#include "Table.h"
-#include "i18n.h"
-
-#line 57 "QLParser.tab.hh"
-
-# include <cassert>
-# include <cstdlib> // std::abort
-# include <iostream>
-# include <stdexcept>
-# include <string>
-# include <vector>
-
-#if defined __cplusplus
-# define YY_CPLUSPLUS __cplusplus
-#else
-# define YY_CPLUSPLUS 199711L
-#endif
-
-// Support move semantics when possible.
-#if 201103L <= YY_CPLUSPLUS
-# define YY_MOVE           std::move
-# define YY_MOVE_OR_COPY   move
-# define YY_MOVE_REF(Type) Type&&
-# define YY_RVREF(Type)    Type&&
-# define YY_COPY(Type)     Type
-#else
-# define YY_MOVE
-# define YY_MOVE_OR_COPY   copy
-# define YY_MOVE_REF(Type) Type&
-# define YY_RVREF(Type)    const Type&
-# define YY_COPY(Type)     const Type&
-#endif
-
-// Support noexcept when possible.
-#if 201103L <= YY_CPLUSPLUS
-# define YY_NOEXCEPT noexcept
-# define YY_NOTHROW
-#else
-# define YY_NOEXCEPT
-# define YY_NOTHROW throw ()
-#endif
-
-// Support constexpr when possible.
-#if 201703 <= YY_CPLUSPLUS
-# define YY_CONSTEXPR constexpr
-#else
-# define YY_CONSTEXPR
-#endif
-
-#include <typeinfo>
-#ifndef YY_ASSERT
-# include <cassert>
-# define YY_ASSERT assert
-#endif
-
-
-#ifndef YY_ATTRIBUTE_PURE
-# if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__)
-#  define YY_ATTRIBUTE_PURE __attribute__ ((__pure__))
-# else
-#  define YY_ATTRIBUTE_PURE
-# endif
-#endif
-
-#ifndef YY_ATTRIBUTE_UNUSED
-# if defined __GNUC__ && 2 < __GNUC__ + (7 <= __GNUC_MINOR__)
-#  define YY_ATTRIBUTE_UNUSED __attribute__ ((__unused__))
-# else
-#  define YY_ATTRIBUTE_UNUSED
-# endif
-#endif
-
-/* Suppress unused-variable warnings by "using" E.  */
-#if ! defined lint || defined __GNUC__
-# define YY_USE(E) ((void) (E))
-#else
-# define YY_USE(E) /* empty */
-#endif
-
-#if defined __GNUC__ && ! defined __ICC && 407 <= __GNUC__ * 100 + __GNUC_MINOR__
-/* Suppress an incorrect diagnostic about yylval being uninitialized.  */
-# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN                            \
-    _Pragma ("GCC diagnostic push")                                     \
-    _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")              \
-    _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
-# define YY_IGNORE_MAYBE_UNINITIALIZED_END      \
-    _Pragma ("GCC diagnostic pop")
-#else
-# define YY_INITIAL_VALUE(Value) Value
-#endif
-#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
-# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
-# define YY_IGNORE_MAYBE_UNINITIALIZED_END
-#endif
-#ifndef YY_INITIAL_VALUE
-# define YY_INITIAL_VALUE(Value) /* Nothing. */
-#endif
-
-#if defined __cplusplus && defined __GNUC__ && ! defined __ICC && 6 <= __GNUC__
-# define YY_IGNORE_USELESS_CAST_BEGIN                          \
-    _Pragma ("GCC diagnostic push")                            \
-    _Pragma ("GCC diagnostic ignored \"-Wuseless-cast\"")
-# define YY_IGNORE_USELESS_CAST_END            \
-    _Pragma ("GCC diagnostic pop")
-#endif
-#ifndef YY_IGNORE_USELESS_CAST_BEGIN
-# define YY_IGNORE_USELESS_CAST_BEGIN
-# define YY_IGNORE_USELESS_CAST_END
-#endif
-
-# ifndef YY_CAST
-#  ifdef __cplusplus
-#   define YY_CAST(Type, Val) static_cast<Type> (Val)
-#   define YY_REINTERPRET_CAST(Type, Val) reinterpret_cast<Type> (Val)
-#  else
-#   define YY_CAST(Type, Val) ((Type) (Val))
-#   define YY_REINTERPRET_CAST(Type, Val) ((Type) (Val))
-#  endif
-# endif
-# ifndef YY_NULLPTR
-#  if defined __cplusplus
-#   if 201103L <= __cplusplus
-#    define YY_NULLPTR nullptr
-#   else
-#    define YY_NULLPTR 0
-#   endif
-#  else
-#   define YY_NULLPTR ((void*)0)
-#  endif
-# endif
-
-/* Debug traces.  */
-#ifndef YYDEBUG
-# define YYDEBUG 0
-#endif
-
-#line 50 "QLParser.yy"
-namespace QL {
-#line 192 "QLParser.tab.hh"
-
-
-
-
-  /// A Bison parser.
-  class Parser
-  {
-  public:
-#ifndef YYSTYPE
-  /// A buffer to store and retrieve objects.
-  ///
-  /// Sort of a variant, but does not keep track of the nature
-  /// of the stored data, since that knowledge is available
-  /// via the current parser state.
-  class semantic_type
-  {
-  public:
-    /// Type of *this.
-    typedef semantic_type self_type;
-
-    /// Empty construction.
-    semantic_type () YY_NOEXCEPT
-      : yybuffer_ ()
-      , yytypeid_ (YY_NULLPTR)
-    {}
-
-    /// Construct and fill.
-    template <typename T>
-    semantic_type (YY_RVREF (T) t)
-      : yytypeid_ (&typeid (T))
-    {
-      YY_ASSERT (sizeof (T) <= size);
-      new (yyas_<T> ()) T (YY_MOVE (t));
-    }
-
-#if 201103L <= YY_CPLUSPLUS
-    /// Non copyable.
-    semantic_type (const self_type&) = delete;
-    /// Non copyable.
-    self_type& operator= (const self_type&) = delete;
-#endif
-
-    /// Destruction, allowed only if empty.
-    ~semantic_type () YY_NOEXCEPT
-    {
-      YY_ASSERT (!yytypeid_);
-    }
-
-# if 201103L <= YY_CPLUSPLUS
-    /// Instantiate a \a T in here from \a t.
-    template <typename T, typename... U>
-    T&
-    emplace (U&&... u)
-    {
-      YY_ASSERT (!yytypeid_);
-      YY_ASSERT (sizeof (T) <= size);
-      yytypeid_ = & typeid (T);
-      return *new (yyas_<T> ()) T (std::forward <U>(u)...);
-    }
-# else
-    /// Instantiate an empty \a T in here.
-    template <typename T>
-    T&
-    emplace ()
-    {
-      YY_ASSERT (!yytypeid_);
-      YY_ASSERT (sizeof (T) <= size);
-      yytypeid_ = & typeid (T);
-      return *new (yyas_<T> ()) T ();
-    }
-
-    /// Instantiate a \a T in here from \a t.
-    template <typename T>
-    T&
-    emplace (const T& t)
-    {
-      YY_ASSERT (!yytypeid_);
-      YY_ASSERT (sizeof (T) <= size);
-      yytypeid_ = & typeid (T);
-      return *new (yyas_<T> ()) T (t);
-    }
-# endif
-
-    /// Instantiate an empty \a T in here.
-    /// Obsolete, use emplace.
-    template <typename T>
-    T&
-    build ()
-    {
-      return emplace<T> ();
-    }
-
-    /// Instantiate a \a T in here from \a t.
-    /// Obsolete, use emplace.
-    template <typename T>
-    T&
-    build (const T& t)
-    {
-      return emplace<T> (t);
-    }
-
-    /// Accessor to a built \a T.
-    template <typename T>
-    T&
-    as () YY_NOEXCEPT
-    {
-      YY_ASSERT (yytypeid_);
-      YY_ASSERT (*yytypeid_ == typeid (T));
-      YY_ASSERT (sizeof (T) <= size);
-      return *yyas_<T> ();
-    }
-
-    /// Const accessor to a built \a T (for %printer).
-    template <typename T>
-    const T&
-    as () const YY_NOEXCEPT
-    {
-      YY_ASSERT (yytypeid_);
-      YY_ASSERT (*yytypeid_ == typeid (T));
-      YY_ASSERT (sizeof (T) <= size);
-      return *yyas_<T> ();
-    }
-
-    /// Swap the content with \a that, of same type.
-    ///
-    /// Both variants must be built beforehand, because swapping the actual
-    /// data requires reading it (with as()), and this is not possible on
-    /// unconstructed variants: it would require some dynamic testing, which
-    /// should not be the variant's responsibility.
-    /// Swapping between built and (possibly) non-built is done with
-    /// self_type::move ().
-    template <typename T>
-    void
-    swap (self_type& that) YY_NOEXCEPT
-    {
-      YY_ASSERT (yytypeid_);
-      YY_ASSERT (*yytypeid_ == *that.yytypeid_);
-      std::swap (as<T> (), that.as<T> ());
-    }
-
-    /// Move the content of \a that to this.
-    ///
-    /// Destroys \a that.
-    template <typename T>
-    void
-    move (self_type& that)
-    {
-# if 201103L <= YY_CPLUSPLUS
-      emplace<T> (std::move (that.as<T> ()));
-# else
-      emplace<T> ();
-      swap<T> (that);
-# endif
-      that.destroy<T> ();
-    }
-
-# if 201103L <= YY_CPLUSPLUS
-    /// Move the content of \a that to this.
-    template <typename T>
-    void
-    move (self_type&& that)
-    {
-      emplace<T> (std::move (that.as<T> ()));
-      that.destroy<T> ();
-    }
-#endif
-
-    /// Copy the content of \a that to this.
-    template <typename T>
-    void
-    copy (const self_type& that)
-    {
-      emplace<T> (that.as<T> ());
-    }
-
-    /// Destroy the stored \a T.
-    template <typename T>
-    void
-    destroy ()
-    {
-      as<T> ().~T ();
-      yytypeid_ = YY_NULLPTR;
-    }
-
-  private:
-#if YY_CPLUSPLUS < 201103L
-    /// Non copyable.
-    semantic_type (const self_type&);
-    /// Non copyable.
-    self_type& operator= (const self_type&);
-#endif
-
-    /// Accessor to raw memory as \a T.
-    template <typename T>
-    T*
-    yyas_ () YY_NOEXCEPT
-    {
-      void *yyp = yybuffer_.yyraw;
-      return static_cast<T*> (yyp);
-     }
-
-    /// Const accessor to raw memory as \a T.
-    template <typename T>
-    const T*
-    yyas_ () const YY_NOEXCEPT
-    {
-      const void *yyp = yybuffer_.yyraw;
-      return static_cast<const T*> (yyp);
-     }
-
-    /// An auxiliary type to compute the largest semantic type.
-    union union_type
-    {
-      // "number"
-      // "name"
-      // FNAME
-      // JGROUP
-      // JPARENT
-      // QSTR
-      // FILEIOVFD
-      // exp
-      // term
-      char dummy1[sizeof (Expression *)];
-    };
-
-    /// The size of the largest semantic type.
-    enum { size = sizeof (union_type) };
-
-    /// A buffer to store semantic values.
-    union
-    {
-      /// Strongest alignment constraints.
-      long double yyalign_me;
-      /// A buffer large enough to store any of the semantic values.
-      char yyraw[size];
-    } yybuffer_;
-
-    /// Whether the content is built: if defined, the name of the stored type.
-    const std::type_info *yytypeid_;
-  };
-
-#else
-    typedef YYSTYPE semantic_type;
-#endif
-
-    /// Syntax errors thrown from user actions.
-    struct syntax_error : std::runtime_error
-    {
-      syntax_error (const std::string& m)
-        : std::runtime_error (m)
-      {}
-
-      syntax_error (const syntax_error& s)
-        : std::runtime_error (s.what ())
-      {}
-
-      ~syntax_error () YY_NOEXCEPT YY_NOTHROW;
-    };
-
-    /// Token kinds.
-    struct token
-    {
-      enum token_kind_type
-      {
-        L_YYEMPTY = -2,
-    L_YYEOF = 0,                   // "end of file"
-    L_YYerror = 256,               // error
-    L_YYUNDEF = 257,               // "invalid token"
-    L_LPAR = 258,                  // "("
-    L_RPAR = 259,                  // ")"
-    L_NUM = 260,                   // "number"
-    L_NAME = 261,                  // "name"
-    L_FNAME = 262,                 // FNAME
-    L_HASPROP = 263,               // HASPROP
-    L_JGROUP = 264,                // JGROUP
-    L_JPARENT = 265,               // JPARENT
-    L_QSTR = 266,                  // QSTR
-    L_FILEIOVFD = 267,             // FILEIOVFD
-    L_IN = 268,                    // IN
-    L_SOME = 269,                  // SOME
-    L_ORDR = 270,                  // ORDR
-    L_COMMA = 271,                 // COMMA
-    L_QWE = 273,                   // QWE
-    L_COLON = 275,                 // COLON
-    L_AND = 277,                   // AND
-    L_OR = 279,                    // OR
-    L_EQV = 281,                   // EQV
-    L_NEQV = 282,                  // NEQV
-    L_BITAND = 283,                // BITAND
-    L_BITOR = 284,                 // BITOR
-    L_BITXOR = 285,                // BITXOR
-    L_EQ = 287,                    // EQ
-    L_NE = 289,                    // NE
-    L_LT = 291,                    // LT
-    L_GT = 293,                    // GT
-    L_LE = 295,                    // LE
-    L_GE = 297,                    // GE
-    L_LS = 299,                    // LS
-    L_RS = 301,                    // RS
-    L_ADD = 303,                   // ADD
-    L_MINUS = 305,                 // MINUS
-    L_MUL = 307,                   // MUL
-    L_DIV = 309,                   // DIV
-    L_REM = 311,                   // REM
-    L_DEG = 313,                   // DEG
-    L_NOT = 314,                   // NOT
-    L_BITNOT = 316                 // BITNOT
-      };
-      /// Backward compatibility alias (Bison 3.6).
-      typedef token_kind_type yytokentype;
-    };
-
-    /// Token kind, as returned by yylex.
-    typedef token::yytokentype token_kind_type;
-
-    /// Backward compatibility alias (Bison 3.6).
-    typedef token_kind_type token_type;
-
-    /// Symbol kinds.
-    struct symbol_kind
-    {
-      enum symbol_kind_type
-      {
-        YYNTOKENS = 63, ///< Number of tokens.
-        S_YYEMPTY = -2,
-        S_YYEOF = 0,                             // "end of file"
-        S_YYerror = 1,                           // error
-        S_YYUNDEF = 2,                           // "invalid token"
-        S_LPAR = 3,                              // "("
-        S_RPAR = 4,                              // ")"
-        S_NUM = 5,                               // "number"
-        S_NAME = 6,                              // "name"
-        S_FNAME = 7,                             // FNAME
-        S_HASPROP = 8,                           // HASPROP
-        S_JGROUP = 9,                            // JGROUP
-        S_JPARENT = 10,                          // JPARENT
-        S_QSTR = 11,                             // QSTR
-        S_FILEIOVFD = 12,                        // FILEIOVFD
-        S_IN = 13,                               // IN
-        S_SOME = 14,                             // SOME
-        S_ORDR = 15,                             // ORDR
-        S_COMMA = 16,                            // COMMA
-        S_17_ = 17,                              // ","
-        S_QWE = 18,                              // QWE
-        S_19_ = 19,                              // "?"
-        S_COLON = 20,                            // COLON
-        S_21_ = 21,                              // ":"
-        S_AND = 22,                              // AND
-        S_23_ = 23,                              // "&&"
-        S_OR = 24,                               // OR
-        S_25_ = 25,                              // "|"
-        S_EQV = 26,                              // EQV
-        S_NEQV = 27,                             // NEQV
-        S_BITAND = 28,                           // BITAND
-        S_BITOR = 29,                            // BITOR
-        S_BITXOR = 30,                           // BITXOR
-        S_31_ = 31,                              // "^"
-        S_EQ = 32,                               // EQ
-        S_33_ = 33,                              // "="
-        S_NE = 34,                               // NE
-        S_35_ = 35,                              // "!="
-        S_LT = 36,                               // LT
-        S_37_ = 37,                              // "<"
-        S_GT = 38,                               // GT
-        S_39_ = 39,                              // ">"
-        S_LE = 40,                               // LE
-        S_41_ = 41,                              // "<="
-        S_GE = 42,                               // GE
-        S_43_ = 43,                              // ">="
-        S_LS = 44,                               // LS
-        S_45_ = 45,                              // "<<"
-        S_RS = 46,                               // RS
-        S_47_ = 47,                              // ">>"
-        S_ADD = 48,                              // ADD
-        S_49_ = 49,                              // "+"
-        S_MINUS = 50,                            // MINUS
-        S_51_ = 51,                              // "-"
-        S_MUL = 52,                              // MUL
-        S_53_ = 53,                              // "*"
-        S_DIV = 54,                              // DIV
-        S_55_ = 55,                              // "/"
-        S_REM = 56,                              // REM
-        S_57_ = 57,                              // "%"
-        S_DEG = 58,                              // DEG
-        S_NOT = 59,                              // NOT
-        S_60_ = 60,                              // "!"
-        S_BITNOT = 61,                           // BITNOT
-        S_62_ = 62,                              // "~"
-        S_YYACCEPT = 63,                         // $accept
-        S_S = 64,                                // S
-        S_exp = 65,                              // exp
-        S_term = 66                              // term
-      };
-    };
-
-    /// (Internal) symbol kind.
-    typedef symbol_kind::symbol_kind_type symbol_kind_type;
-
-    /// The number of tokens.
-    static const symbol_kind_type YYNTOKENS = symbol_kind::YYNTOKENS;
-
-    /// A complete symbol.
-    ///
-    /// Expects its Base type to provide access to the symbol kind
-    /// via kind ().
-    ///
-    /// Provide access to semantic value.
-    template <typename Base>
-    struct basic_symbol : Base
-    {
-      /// Alias to Base.
-      typedef Base super_type;
-
-      /// Default constructor.
-      basic_symbol ()
-        : value ()
-      {}
-
-#if 201103L <= YY_CPLUSPLUS
-      /// Move constructor.
-      basic_symbol (basic_symbol&& that)
-        : Base (std::move (that))
-        , value ()
-      {
-        switch (this->kind ())
-    {
-      case symbol_kind::S_NUM: // "number"
-      case symbol_kind::S_NAME: // "name"
-      case symbol_kind::S_FNAME: // FNAME
-      case symbol_kind::S_JGROUP: // JGROUP
-      case symbol_kind::S_JPARENT: // JPARENT
-      case symbol_kind::S_QSTR: // QSTR
-      case symbol_kind::S_FILEIOVFD: // FILEIOVFD
-      case symbol_kind::S_exp: // exp
-      case symbol_kind::S_term: // term
-        value.move< Expression * > (std::move (that.value));
-        break;
-
-      default:
-        break;
-    }
-
-      }
-#endif
-
-      /// Copy constructor.
-      basic_symbol (const basic_symbol& that);
-
-      /// Constructors for typed symbols.
-#if 201103L <= YY_CPLUSPLUS
-      basic_symbol (typename Base::kind_type t)
-        : Base (t)
-      {}
-#else
-      basic_symbol (typename Base::kind_type t)
-        : Base (t)
-      {}
-#endif
-
-#if 201103L <= YY_CPLUSPLUS
-      basic_symbol (typename Base::kind_type t, Expression *&& v)
-        : Base (t)
-        , value (std::move (v))
-      {}
-#else
-      basic_symbol (typename Base::kind_type t, const Expression *& v)
-        : Base (t)
-        , value (v)
-      {}
-#endif
-
-      /// Destroy the symbol.
-      ~basic_symbol ()
-      {
-        clear ();
-      }
-
-      /// Destroy contents, and record that is empty.
-      void clear () YY_NOEXCEPT
-      {
-        // User destructor.
-        symbol_kind_type yykind = this->kind ();
-        basic_symbol<Base>& yysym = *this;
-        (void) yysym;
-        switch (yykind)
-        {
-      case symbol_kind::S_NUM: // "number"
-#line 100 "QLParser.yy"
-                    { delete yysym.value.template as < Expression * > (); }
-#line 682 "QLParser.tab.hh"
-        break;
-
-      case symbol_kind::S_NAME: // "name"
-#line 100 "QLParser.yy"
-                    { delete yysym.value.template as < Expression * > (); }
-#line 688 "QLParser.tab.hh"
-        break;
-
-      case symbol_kind::S_FNAME: // FNAME
-#line 100 "QLParser.yy"
-                    { delete yysym.value.template as < Expression * > (); }
-#line 694 "QLParser.tab.hh"
-        break;
-
-      case symbol_kind::S_JGROUP: // JGROUP
-#line 100 "QLParser.yy"
-                    { delete yysym.value.template as < Expression * > (); }
-#line 700 "QLParser.tab.hh"
-        break;
-
-      case symbol_kind::S_JPARENT: // JPARENT
-#line 100 "QLParser.yy"
-                    { delete yysym.value.template as < Expression * > (); }
-#line 706 "QLParser.tab.hh"
-        break;
-
-      case symbol_kind::S_QSTR: // QSTR
-#line 100 "QLParser.yy"
-                    { delete yysym.value.template as < Expression * > (); }
-#line 712 "QLParser.tab.hh"
-        break;
-
-      case symbol_kind::S_FILEIOVFD: // FILEIOVFD
-#line 100 "QLParser.yy"
-                    { delete yysym.value.template as < Expression * > (); }
-#line 718 "QLParser.tab.hh"
-        break;
-
-      case symbol_kind::S_exp: // exp
-#line 100 "QLParser.yy"
-                    { delete yysym.value.template as < Expression * > (); }
-#line 724 "QLParser.tab.hh"
-        break;
-
-      case symbol_kind::S_term: // term
-#line 100 "QLParser.yy"
-                    { delete yysym.value.template as < Expression * > (); }
-#line 730 "QLParser.tab.hh"
-        break;
-
-       default:
-          break;
-        }
-
-        // Value type destructor.
-switch (yykind)
-    {
-      case symbol_kind::S_NUM: // "number"
-      case symbol_kind::S_NAME: // "name"
-      case symbol_kind::S_FNAME: // FNAME
-      case symbol_kind::S_JGROUP: // JGROUP
-      case symbol_kind::S_JPARENT: // JPARENT
-      case symbol_kind::S_QSTR: // QSTR
-      case symbol_kind::S_FILEIOVFD: // FILEIOVFD
-      case symbol_kind::S_exp: // exp
-      case symbol_kind::S_term: // term
-        value.template destroy< Expression * > ();
-        break;
-
-      default:
-        break;
-    }
-
-        Base::clear ();
-      }
-
-#if YYDEBUG || 0
-      /// The user-facing name of this symbol.
-      const char *name () const YY_NOEXCEPT
-      {
-        return Parser::symbol_name (this->kind ());
-      }
-#endif // #if YYDEBUG || 0
-
-
-      /// Backward compatibility (Bison 3.6).
-      symbol_kind_type type_get () const YY_NOEXCEPT;
-
-      /// Whether empty.
-      bool empty () const YY_NOEXCEPT;
-
-      /// Destructive move, \a s is emptied into this.
-      void move (basic_symbol& s);
-
-      /// The semantic value.
-      semantic_type value;
-
-    private:
-#if YY_CPLUSPLUS < 201103L
-      /// Assignment operator.
-      basic_symbol& operator= (const basic_symbol& that);
-#endif
-    };
-
-    /// Type access provider for token (enum) based symbols.
-    struct by_kind
-    {
-      /// Default constructor.
-      by_kind ();
-
-#if 201103L <= YY_CPLUSPLUS
-      /// Move constructor.
-      by_kind (by_kind&& that);
-#endif
-
-      /// Copy constructor.
-      by_kind (const by_kind& that);
-
-      /// The symbol kind as needed by the constructor.
-      typedef token_kind_type kind_type;
-
-      /// Constructor from (external) token numbers.
-      by_kind (kind_type t);
-
-      /// Record that this symbol is empty.
-      void clear () YY_NOEXCEPT;
-
-      /// Steal the symbol kind from \a that.
-      void move (by_kind& that);
-
-      /// The (internal) type number (corresponding to \a type).
-      /// \a empty when empty.
-      symbol_kind_type kind () const YY_NOEXCEPT;
-
-      /// Backward compatibility (Bison 3.6).
-      symbol_kind_type type_get () const YY_NOEXCEPT;
-
-      /// The symbol kind.
-      /// \a S_YYEMPTY when empty.
-      symbol_kind_type kind_;
-    };
-
-    /// Backward compatibility for a private implementation detail (Bison 3.6).
-    typedef by_kind by_type;
-
-    /// "External" symbols: returned by the scanner.
-    struct symbol_type : basic_symbol<by_kind>
-    {
-      /// Superclass.
-      typedef basic_symbol<by_kind> super_type;
-
-      /// Empty symbol.
-      symbol_type () {}
-
-      /// Constructor for valueless symbols, and symbols from each type.
-#if 201103L <= YY_CPLUSPLUS
-      symbol_type (int tok)
-        : super_type(token_type (tok))
-#else
-      symbol_type (int tok)
-        : super_type(token_type (tok))
-#endif
-      {
-        YY_ASSERT (tok == token::L_YYEOF
-                   || (token::L_YYerror <= tok && tok <= token::L_RPAR)
-                   || tok == token::L_HASPROP
-                   || (token::L_IN <= tok && tok <= 317));
-      }
-#if 201103L <= YY_CPLUSPLUS
-      symbol_type (int tok, Expression * v)
-        : super_type(token_type (tok), std::move (v))
-#else
-      symbol_type (int tok, const Expression *& v)
-        : super_type(token_type (tok), v)
-#endif
-      {
-        YY_ASSERT ((token::L_NUM <= tok && tok <= token::L_FNAME)
-                   || (token::L_JGROUP <= tok && tok <= token::L_FILEIOVFD));
-      }
-    };
-
-    /// Build a parser object.
-    Parser (QL::Result &result_yyarg);
-    virtual ~Parser ();
-
-#if 201103L <= YY_CPLUSPLUS
-    /// Non copyable.
-    Parser (const Parser&) = delete;
-    /// Non copyable.
-    Parser& operator= (const Parser&) = delete;
-#endif
-
-    /// Parse.  An alias for parse ().
-    /// \returns  0 iff parsing succeeded.
-    int operator() ();
-
-    /// Parse.
-    /// \returns  0 iff parsing succeeded.
-    virtual int parse ();
-
-#if YYDEBUG
-    /// The current debugging stream.
-    std::ostream& debug_stream () const YY_ATTRIBUTE_PURE;
-    /// Set the current debugging stream.
-    void set_debug_stream (std::ostream &);
-
-    /// Type for debugging levels.
-    typedef int debug_level_type;
-    /// The current debugging level.
-    debug_level_type debug_level () const YY_ATTRIBUTE_PURE;
-    /// Set the current debugging level.
-    void set_debug_level (debug_level_type l);
-#endif
-
-    /// Report a syntax error.
-    /// \param msg    a description of the syntax error.
-    virtual void error (const std::string& msg);
-
-    /// Report a syntax error.
-    void error (const syntax_error& err);
-
-#if YYDEBUG || 0
-    /// The user-facing name of the symbol whose (internal) number is
-    /// YYSYMBOL.  No bounds checking.
-    static const char *symbol_name (symbol_kind_type yysymbol);
-#endif // #if YYDEBUG || 0
-
-
-    // Implementation of make_symbol for each symbol type.
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_YYEOF ()
-      {
-        return symbol_type (token::L_YYEOF);
-      }
-#else
-      static
-      symbol_type
-      make_YYEOF ()
-      {
-        return symbol_type (token::L_YYEOF);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_YYerror ()
-      {
-        return symbol_type (token::L_YYerror);
-      }
-#else
-      static
-      symbol_type
-      make_YYerror ()
-      {
-        return symbol_type (token::L_YYerror);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_YYUNDEF ()
-      {
-        return symbol_type (token::L_YYUNDEF);
-      }
-#else
-      static
-      symbol_type
-      make_YYUNDEF ()
-      {
-        return symbol_type (token::L_YYUNDEF);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_LPAR ()
-      {
-        return symbol_type (token::L_LPAR);
-      }
-#else
-      static
-      symbol_type
-      make_LPAR ()
-      {
-        return symbol_type (token::L_LPAR);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_RPAR ()
-      {
-        return symbol_type (token::L_RPAR);
-      }
-#else
-      static
-      symbol_type
-      make_RPAR ()
-      {
-        return symbol_type (token::L_RPAR);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_NUM (Expression * v)
-      {
-        return symbol_type (token::L_NUM, std::move (v));
-      }
-#else
-      static
-      symbol_type
-      make_NUM (const Expression *& v)
-      {
-        return symbol_type (token::L_NUM, v);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_NAME (Expression * v)
-      {
-        return symbol_type (token::L_NAME, std::move (v));
-      }
-#else
-      static
-      symbol_type
-      make_NAME (const Expression *& v)
-      {
-        return symbol_type (token::L_NAME, v);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_FNAME (Expression * v)
-      {
-        return symbol_type (token::L_FNAME, std::move (v));
-      }
-#else
-      static
-      symbol_type
-      make_FNAME (const Expression *& v)
-      {
-        return symbol_type (token::L_FNAME, v);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_HASPROP ()
-      {
-        return symbol_type (token::L_HASPROP);
-      }
-#else
-      static
-      symbol_type
-      make_HASPROP ()
-      {
-        return symbol_type (token::L_HASPROP);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_JGROUP (Expression * v)
-      {
-        return symbol_type (token::L_JGROUP, std::move (v));
-      }
-#else
-      static
-      symbol_type
-      make_JGROUP (const Expression *& v)
-      {
-        return symbol_type (token::L_JGROUP, v);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_JPARENT (Expression * v)
-      {
-        return symbol_type (token::L_JPARENT, std::move (v));
-      }
-#else
-      static
-      symbol_type
-      make_JPARENT (const Expression *& v)
-      {
-        return symbol_type (token::L_JPARENT, v);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_QSTR (Expression * v)
-      {
-        return symbol_type (token::L_QSTR, std::move (v));
-      }
-#else
-      static
-      symbol_type
-      make_QSTR (const Expression *& v)
-      {
-        return symbol_type (token::L_QSTR, v);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_FILEIOVFD (Expression * v)
-      {
-        return symbol_type (token::L_FILEIOVFD, std::move (v));
-      }
-#else
-      static
-      symbol_type
-      make_FILEIOVFD (const Expression *& v)
-      {
-        return symbol_type (token::L_FILEIOVFD, v);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_IN ()
-      {
-        return symbol_type (token::L_IN);
-      }
-#else
-      static
-      symbol_type
-      make_IN ()
-      {
-        return symbol_type (token::L_IN);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_SOME ()
-      {
-        return symbol_type (token::L_SOME);
-      }
-#else
-      static
-      symbol_type
-      make_SOME ()
-      {
-        return symbol_type (token::L_SOME);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_ORDR ()
-      {
-        return symbol_type (token::L_ORDR);
-      }
-#else
-      static
-      symbol_type
-      make_ORDR ()
-      {
-        return symbol_type (token::L_ORDR);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_COMMA ()
-      {
-        return symbol_type (token::L_COMMA);
-      }
-#else
-      static
-      symbol_type
-      make_COMMA ()
-      {
-        return symbol_type (token::L_COMMA);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_QWE ()
-      {
-        return symbol_type (token::L_QWE);
-      }
-#else
-      static
-      symbol_type
-      make_QWE ()
-      {
-        return symbol_type (token::L_QWE);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_COLON ()
-      {
-        return symbol_type (token::L_COLON);
-      }
-#else
-      static
-      symbol_type
-      make_COLON ()
-      {
-        return symbol_type (token::L_COLON);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_AND ()
-      {
-        return symbol_type (token::L_AND);
-      }
-#else
-      static
-      symbol_type
-      make_AND ()
-      {
-        return symbol_type (token::L_AND);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_OR ()
-      {
-        return symbol_type (token::L_OR);
-      }
-#else
-      static
-      symbol_type
-      make_OR ()
-      {
-        return symbol_type (token::L_OR);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_EQV ()
-      {
-        return symbol_type (token::L_EQV);
-      }
-#else
-      static
-      symbol_type
-      make_EQV ()
-      {
-        return symbol_type (token::L_EQV);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_NEQV ()
-      {
-        return symbol_type (token::L_NEQV);
-      }
-#else
-      static
-      symbol_type
-      make_NEQV ()
-      {
-        return symbol_type (token::L_NEQV);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_BITAND ()
-      {
-        return symbol_type (token::L_BITAND);
-      }
-#else
-      static
-      symbol_type
-      make_BITAND ()
-      {
-        return symbol_type (token::L_BITAND);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_BITOR ()
-      {
-        return symbol_type (token::L_BITOR);
-      }
-#else
-      static
-      symbol_type
-      make_BITOR ()
-      {
-        return symbol_type (token::L_BITOR);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_BITXOR ()
-      {
-        return symbol_type (token::L_BITXOR);
-      }
-#else
-      static
-      symbol_type
-      make_BITXOR ()
-      {
-        return symbol_type (token::L_BITXOR);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_EQ ()
-      {
-        return symbol_type (token::L_EQ);
-      }
-#else
-      static
-      symbol_type
-      make_EQ ()
-      {
-        return symbol_type (token::L_EQ);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_NE ()
-      {
-        return symbol_type (token::L_NE);
-      }
-#else
-      static
-      symbol_type
-      make_NE ()
-      {
-        return symbol_type (token::L_NE);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_LT ()
-      {
-        return symbol_type (token::L_LT);
-      }
-#else
-      static
-      symbol_type
-      make_LT ()
-      {
-        return symbol_type (token::L_LT);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_GT ()
-      {
-        return symbol_type (token::L_GT);
-      }
-#else
-      static
-      symbol_type
-      make_GT ()
-      {
-        return symbol_type (token::L_GT);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_LE ()
-      {
-        return symbol_type (token::L_LE);
-      }
-#else
-      static
-      symbol_type
-      make_LE ()
-      {
-        return symbol_type (token::L_LE);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_GE ()
-      {
-        return symbol_type (token::L_GE);
-      }
-#else
-      static
-      symbol_type
-      make_GE ()
-      {
-        return symbol_type (token::L_GE);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_LS ()
-      {
-        return symbol_type (token::L_LS);
-      }
-#else
-      static
-      symbol_type
-      make_LS ()
-      {
-        return symbol_type (token::L_LS);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_RS ()
-      {
-        return symbol_type (token::L_RS);
-      }
-#else
-      static
-      symbol_type
-      make_RS ()
-      {
-        return symbol_type (token::L_RS);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_ADD ()
-      {
-        return symbol_type (token::L_ADD);
-      }
-#else
-      static
-      symbol_type
-      make_ADD ()
-      {
-        return symbol_type (token::L_ADD);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_MINUS ()
-      {
-        return symbol_type (token::L_MINUS);
-      }
-#else
-      static
-      symbol_type
-      make_MINUS ()
-      {
-        return symbol_type (token::L_MINUS);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_MUL ()
-      {
-        return symbol_type (token::L_MUL);
-      }
-#else
-      static
-      symbol_type
-      make_MUL ()
-      {
-        return symbol_type (token::L_MUL);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_DIV ()
-      {
-        return symbol_type (token::L_DIV);
-      }
-#else
-      static
-      symbol_type
-      make_DIV ()
-      {
-        return symbol_type (token::L_DIV);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_REM ()
-      {
-        return symbol_type (token::L_REM);
-      }
-#else
-      static
-      symbol_type
-      make_REM ()
-      {
-        return symbol_type (token::L_REM);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_DEG ()
-      {
-        return symbol_type (token::L_DEG);
-      }
-#else
-      static
-      symbol_type
-      make_DEG ()
-      {
-        return symbol_type (token::L_DEG);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_NOT ()
-      {
-        return symbol_type (token::L_NOT);
-      }
-#else
-      static
-      symbol_type
-      make_NOT ()
-      {
-        return symbol_type (token::L_NOT);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_BITNOT ()
-      {
-        return symbol_type (token::L_BITNOT);
-      }
-#else
-      static
-      symbol_type
-      make_BITNOT ()
-      {
-        return symbol_type (token::L_BITNOT);
-      }
-#endif
-
-
-  private:
-#if YY_CPLUSPLUS < 201103L
-    /// Non copyable.
-    Parser (const Parser&);
-    /// Non copyable.
-    Parser& operator= (const Parser&);
-#endif
-
-
-    /// Stored state numbers (used for stacks).
-    typedef signed char state_type;
-
-    /// Compute post-reduction state.
-    /// \param yystate   the current state
-    /// \param yysym     the nonterminal to push on the stack
-    static state_type yy_lr_goto_state_ (state_type yystate, int yysym);
-
-    /// Whether the given \c yypact_ value indicates a defaulted state.
-    /// \param yyvalue   the value to check
-    static bool yy_pact_value_is_default_ (int yyvalue);
-
-    /// Whether the given \c yytable_ value indicates a syntax error.
-    /// \param yyvalue   the value to check
-    static bool yy_table_value_is_error_ (int yyvalue);
-
-    static const signed char yypact_ninf_;
-    static const signed char yytable_ninf_;
-
-    /// Convert a scanner token kind \a t to a symbol kind.
-    /// In theory \a t should be a token_kind_type, but character literals
-    /// are valid, yet not members of the token_type enum.
-    static symbol_kind_type yytranslate_ (int t);
-
-#if YYDEBUG || 0
-    /// For a symbol, its name in clear.
-    static const char* const yytname_[];
-#endif // #if YYDEBUG || 0
-
-
-    // Tables.
-    // YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
-    // STATE-NUM.
-    static const short yypact_[];
-
-    // YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
-    // Performed when YYTABLE does not specify something else to do.  Zero
-    // means the default is an error.
-    static const signed char yydefact_[];
-
-    // YYPGOTO[NTERM-NUM].
-    static const signed char yypgoto_[];
-
-    // YYDEFGOTO[NTERM-NUM].
-    static const signed char yydefgoto_[];
-
-    // YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
-    // positive, shift that token.  If negative, reduce the rule whose
-    // number is the opposite.  If YYTABLE_NINF, syntax error.
-    static const signed char yytable_[];
-
-    static const signed char yycheck_[];
-
-    // YYSTOS[STATE-NUM] -- The (internal number of the) accessing
-    // symbol of state STATE-NUM.
-    static const signed char yystos_[];
-
-    // YYR1[YYN] -- Symbol number of symbol that rule YYN derives.
-    static const signed char yyr1_[];
-
-    // YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.
-    static const signed char yyr2_[];
-
-
-#if YYDEBUG
-    // YYRLINE[YYN] -- Source line where rule number YYN was defined.
-    static const unsigned char yyrline_[];
-    /// Report on the debug stream that the rule \a r is going to be reduced.
-    virtual void yy_reduce_print_ (int r) const;
-    /// Print the state stack on the debug stream.
-    virtual void yy_stack_print_ () const;
-
-    /// Debugging level.
-    int yydebug_;
-    /// Debug stream.
-    std::ostream* yycdebug_;
-
-    /// \brief Display a symbol kind, value and location.
-    /// \param yyo    The output stream.
-    /// \param yysym  The symbol.
-    template <typename Base>
-    void yy_print_ (std::ostream& yyo, const basic_symbol<Base>& yysym) const;
-#endif
-
-    /// \brief Reclaim the memory associated to a symbol.
-    /// \param yymsg     Why this token is reclaimed.
-    ///                  If null, print nothing.
-    /// \param yysym     The symbol.
-    template <typename Base>
-    void yy_destroy_ (const char* yymsg, basic_symbol<Base>& yysym) const;
-
-  private:
-    /// Type access provider for state based symbols.
-    struct by_state
-    {
-      /// Default constructor.
-      by_state () YY_NOEXCEPT;
-
-      /// The symbol kind as needed by the constructor.
-      typedef state_type kind_type;
-
-      /// Constructor.
-      by_state (kind_type s) YY_NOEXCEPT;
-
-      /// Copy constructor.
-      by_state (const by_state& that) YY_NOEXCEPT;
-
-      /// Record that this symbol is empty.
-      void clear () YY_NOEXCEPT;
-
-      /// Steal the symbol kind from \a that.
-      void move (by_state& that);
-
-      /// The symbol kind (corresponding to \a state).
-      /// \a symbol_kind::S_YYEMPTY when empty.
-      symbol_kind_type kind () const YY_NOEXCEPT;
-
-      /// The state number used to denote an empty symbol.
-      /// We use the initial state, as it does not have a value.
-      enum { empty_state = 0 };
-
-      /// The state.
-      /// \a empty when empty.
-      state_type state;
-    };
-
-    /// "Internal" symbol: element of the stack.
-    struct stack_symbol_type : basic_symbol<by_state>
-    {
-      /// Superclass.
-      typedef basic_symbol<by_state> super_type;
-      /// Construct an empty symbol.
-      stack_symbol_type ();
-      /// Move or copy construction.
-      stack_symbol_type (YY_RVREF (stack_symbol_type) that);
-      /// Steal the contents from \a sym to build this.
-      stack_symbol_type (state_type s, YY_MOVE_REF (symbol_type) sym);
-#if YY_CPLUSPLUS < 201103L
-      /// Assignment, needed by push_back by some old implementations.
-      /// Moves the contents of that.
-      stack_symbol_type& operator= (stack_symbol_type& that);
-
-      /// Assignment, needed by push_back by other implementations.
-      /// Needed by some other old implementations.
-      stack_symbol_type& operator= (const stack_symbol_type& that);
-#endif
-    };
-
-    /// A stack with random access from its top.
-    template <typename T, typename S = std::vector<T> >
-    class stack
-    {
-    public:
-      // Hide our reversed order.
-      typedef typename S::iterator iterator;
-      typedef typename S::const_iterator const_iterator;
-      typedef typename S::size_type size_type;
-      typedef typename std::ptrdiff_t index_type;
-
-      stack (size_type n = 200)
-        : seq_ (n)
-      {}
-
-#if 201103L <= YY_CPLUSPLUS
-      /// Non copyable.
-      stack (const stack&) = delete;
-      /// Non copyable.
-      stack& operator= (const stack&) = delete;
-#endif
-
-      /// Random access.
-      ///
-      /// Index 0 returns the topmost element.
-      const T&
-      operator[] (index_type i) const
-      {
-        return seq_[size_type (size () - 1 - i)];
-      }
-
-      /// Random access.
-      ///
-      /// Index 0 returns the topmost element.
-      T&
-      operator[] (index_type i)
-      {
-        return seq_[size_type (size () - 1 - i)];
-      }
-
-      /// Steal the contents of \a t.
-      ///
-      /// Close to move-semantics.
-      void
-      push (YY_MOVE_REF (T) t)
-      {
-        seq_.push_back (T ());
-        operator[] (0).move (t);
-      }
-
-      /// Pop elements from the stack.
-      void
-      pop (std::ptrdiff_t n = 1) YY_NOEXCEPT
-      {
-        for (; 0 < n; --n)
-          seq_.pop_back ();
-      }
-
-      /// Pop all elements from the stack.
-      void
-      clear () YY_NOEXCEPT
-      {
-        seq_.clear ();
-      }
-
-      /// Number of elements on the stack.
-      index_type
-      size () const YY_NOEXCEPT
-      {
-        return index_type (seq_.size ());
-      }
-
-      /// Iterator on top of the stack (going downwards).
-      const_iterator
-      begin () const YY_NOEXCEPT
-      {
-        return seq_.begin ();
-      }
-
-      /// Bottom of the stack.
-      const_iterator
-      end () const YY_NOEXCEPT
-      {
-        return seq_.end ();
-      }
-
-      /// Present a slice of the top of a stack.
-      class slice
-      {
-      public:
-        slice (const stack& stack, index_type range)
-          : stack_ (stack)
-          , range_ (range)
-        {}
-
-        const T&
-        operator[] (index_type i) const
-        {
-          return stack_[range_ - i];
-        }
-
-      private:
-        const stack& stack_;
-        index_type range_;
-      };
-
-    private:
-#if YY_CPLUSPLUS < 201103L
-      /// Non copyable.
-      stack (const stack&);
-      /// Non copyable.
-      stack& operator= (const stack&);
-#endif
-      /// The wrapped container.
-      S seq_;
-    };
-
-
-    /// Stack type.
-    typedef stack<stack_symbol_type> stack_type;
-
-    /// The stack.
-    stack_type yystack_;
-
-    /// Push a new state on the stack.
-    /// \param m    a debug message to display
-    ///             if null, no trace is output.
-    /// \param sym  the symbol
-    /// \warning the contents of \a s.value is stolen.
-    void yypush_ (const char* m, YY_MOVE_REF (stack_symbol_type) sym);
-
-    /// Push a new look ahead token on the state on the stack.
-    /// \param m    a debug message to display
-    ///             if null, no trace is output.
-    /// \param s    the state
-    /// \param sym  the symbol (for its value and location).
-    /// \warning the contents of \a sym.value is stolen.
-    void yypush_ (const char* m, state_type s, YY_MOVE_REF (symbol_type) sym);
-
-    /// Pop \a n symbols from the stack.
-    void yypop_ (int n = 1);
-
-    /// Constants.
-    enum
-    {
-      yylast_ = 279,     ///< Last index in yytable_.
-      yynnts_ = 4,  ///< Number of nonterminal symbols.
-      yyfinal_ = 24 ///< Termination state number.
-    };
-
-
-    // User arguments.
-    QL::Result &result;
-
-  };
-
-  inline
-  Parser::symbol_kind_type
-  Parser::yytranslate_ (int t)
-  {
-    // YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to
-    // TOKEN-NUM as returned by yylex.
-    static
-    const signed char
-    translate_table[] =
-    {
-       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
-       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
-      35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
-      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
-      55,    56,    57,    58,    59,    60,    61,    62
-    };
-    // Last valid token kind.
-    const int code_max = 317;
-
-    if (t <= 0)
-      return symbol_kind::S_YYEOF;
-    else if (t <= code_max)
-      return YY_CAST (symbol_kind_type, translate_table[t]);
-    else
-      return symbol_kind::S_YYUNDEF;
-  }
-
-  // basic_symbol.
-  template <typename Base>
-  Parser::basic_symbol<Base>::basic_symbol (const basic_symbol& that)
-    : Base (that)
-    , value ()
-  {
-    switch (this->kind ())
-    {
-      case symbol_kind::S_NUM: // "number"
-      case symbol_kind::S_NAME: // "name"
-      case symbol_kind::S_FNAME: // FNAME
-      case symbol_kind::S_JGROUP: // JGROUP
-      case symbol_kind::S_JPARENT: // JPARENT
-      case symbol_kind::S_QSTR: // QSTR
-      case symbol_kind::S_FILEIOVFD: // FILEIOVFD
-      case symbol_kind::S_exp: // exp
-      case symbol_kind::S_term: // term
-        value.copy< Expression * > (YY_MOVE (that.value));
-        break;
-
-      default:
-        break;
-    }
-
-  }
-
-
-
-  template <typename Base>
-  Parser::symbol_kind_type
-  Parser::basic_symbol<Base>::type_get () const YY_NOEXCEPT
-  {
-    return this->kind ();
-  }
-
-  template <typename Base>
-  bool
-  Parser::basic_symbol<Base>::empty () const YY_NOEXCEPT
-  {
-    return this->kind () == symbol_kind::S_YYEMPTY;
-  }
-
-  template <typename Base>
-  void
-  Parser::basic_symbol<Base>::move (basic_symbol& s)
-  {
-    super_type::move (s);
-    switch (this->kind ())
-    {
-      case symbol_kind::S_NUM: // "number"
-      case symbol_kind::S_NAME: // "name"
-      case symbol_kind::S_FNAME: // FNAME
-      case symbol_kind::S_JGROUP: // JGROUP
-      case symbol_kind::S_JPARENT: // JPARENT
-      case symbol_kind::S_QSTR: // QSTR
-      case symbol_kind::S_FILEIOVFD: // FILEIOVFD
-      case symbol_kind::S_exp: // exp
-      case symbol_kind::S_term: // term
-        value.move< Expression * > (YY_MOVE (s.value));
-        break;
-
-      default:
-        break;
-    }
-
-  }
-
-  // by_kind.
-  inline
-  Parser::by_kind::by_kind ()
-    : kind_ (symbol_kind::S_YYEMPTY)
-  {}
-
-#if 201103L <= YY_CPLUSPLUS
-  inline
-  Parser::by_kind::by_kind (by_kind&& that)
-    : kind_ (that.kind_)
-  {
-    that.clear ();
-  }
-#endif
-
-  inline
-  Parser::by_kind::by_kind (const by_kind& that)
-    : kind_ (that.kind_)
-  {}
-
-  inline
-  Parser::by_kind::by_kind (token_kind_type t)
-    : kind_ (yytranslate_ (t))
-  {}
-
-  inline
-  void
-  Parser::by_kind::clear () YY_NOEXCEPT
-  {
-    kind_ = symbol_kind::S_YYEMPTY;
-  }
-
-  inline
-  void
-  Parser::by_kind::move (by_kind& that)
-  {
-    kind_ = that.kind_;
-    that.clear ();
-  }
-
-  inline
-  Parser::symbol_kind_type
-  Parser::by_kind::kind () const YY_NOEXCEPT
-  {
-    return kind_;
-  }
-
-  inline
-  Parser::symbol_kind_type
-  Parser::by_kind::type_get () const YY_NOEXCEPT
-  {
-    return this->kind ();
-  }
-
-#line 50 "QLParser.yy"
-} // QL
-#line 2034 "QLParser.tab.hh"
-
-
-
-
-#endif // !YY_YY_QLPARSER_TAB_HH_INCLUDED
index 689d0e1a2fc5d28563d826b8656b596ba38d31c5..d7f732c737d3bcec1a1b76dcd0b867f06f7c732e 100644 (file)
@@ -22,7 +22,7 @@
 // cd gprofng/src && bison QLParser.yy
 
 // For "api.parser.class"
-%require "3.3"
+%require "3.0"
 %language "C++"
 
 %code top {
 namespace QL
 {
   static QL::Parser::symbol_type yylex (QL::Result &result);
+
+  static Expression *
+  processName (std::string str)
+  {
+    const char *name = str.c_str();
+    int propID = dbeSession->getPropIdByName (name);
+    if (propID != PROP_NONE)
+      return new Expression (Expression::OP_NAME,
+                     new Expression (Expression::OP_NUM, (uint64_t) propID));
+
+    // If a name is not statically known try user defined objects
+    Expression *expr = dbeSession->findObjDefByName (name);
+    if (expr != NULL)
+      return expr->copy();
+
+    throw Parser::syntax_error ("Name not found");
+  }
 }
 }
 
 %defines
 %define api.namespace {QL}
-%define api.parser.class {Parser}
+// in Bison 3.3, use %define api.parser.class {Parser} instead parser_class_name
+%define parser_class_name {Parser}
 %define api.token.constructor
 %define api.value.type variant
 // Later: api.value.automove
@@ -60,15 +78,13 @@ namespace QL
 
 %token LPAR "("
   RPAR ")"
-  NUM "number"
-  NAME "name"
-  FNAME 
   HASPROP
-  JGROUP
-  JPARENT
-  QSTR
   FILEIOVFD
 
+%token YYEOF 0
+%token <uint64_t> NUM FNAME JGROUP JPARENT QSTR
+%token <std::string> NAME
+
 %nonassoc IN SOME ORDR
 %left  COMMA ","
 %right QWE "?"
@@ -95,14 +111,14 @@ namespace QL
        NOT "!"
        BITNOT "~"
 
-%type <Expression *> QSTR NUM NAME FNAME JGROUP JPARENT FILEIOVFD exp term
+%type <Expression *>  exp term
 
-%destructor { delete $$; } <*>;
+// %destructor { delete $$; } <Expression *>;
 
 %%
 
 S:     /* empty */             { result.out = new Expression (Expression::OP_NUM, (uint64_t) 1); }
-|      exp                     { result.out = new Expression ($1); }
+|      exp                     { result.out = $1; }
 
 exp:     exp DEG exp           { $$ = new Expression (Expression::OP_DEG, $1, $3); } /* dead? */
        | exp MUL exp           { $$ = new Expression (Expression::OP_MUL, $1, $3); }
@@ -125,26 +141,56 @@ exp:        exp DEG exp           { $$ = new Expression (Expression::OP_DEG, $1, $3); } /* dea
        | exp OR  exp           { $$ = new Expression (Expression::OP_OR, $1, $3); }
        | exp NEQV exp          { $$ = new Expression (Expression::OP_NEQV, $1, $3); } /* dead? */
        | exp EQV exp           { $$ = new Expression (Expression::OP_EQV, $1, $3); } /* dead? */
-       | exp QWE exp COLON exp { Expression colon = Expression (Expression::OP_COLON, $3, $5);
-                                 $$ = new Expression (Expression::OP_QWE, $1, &colon); }
+       | exp QWE exp COLON exp
+         {
+            $$ = new Expression (Expression::OP_QWE, $1,
+                                 new Expression (Expression::OP_COLON, $3, $5));
+         }
        | exp COMMA  exp        { $$ = new Expression (Expression::OP_COMMA, $1, $3); }
        | exp IN exp            { $$ = new Expression (Expression::OP_IN, $1, $3); }
        | exp SOME IN exp       { $$ = new Expression (Expression::OP_SOMEIN, $1, $4); }
        | exp ORDR IN exp       { $$ = new Expression (Expression::OP_ORDRIN, $1, $4); }
-       | term                  { $$ = new Expression ($1); }
-
-term:    MINUS term            { Expression num = Expression (Expression::OP_NUM, (uint64_t) 0);
-                                 $$ = new Expression (Expression::OP_MINUS, &num, $2); }
-       | NOT    term           { $$ = new Expression (Expression::OP_NOT, $2, NULL); }
-       | BITNOT term           { $$ = new Expression (Expression::OP_BITNOT, $2, NULL); }
-       | LPAR exp RPAR         { $$ = new Expression ($2); }
-       | FNAME LPAR QSTR RPAR  { $$ = new Expression (Expression::OP_FUNC, $1, $3); }
-       | HASPROP LPAR NAME RPAR { $$ = new Expression (Expression::OP_HASPROP, $3, NULL); }
-       | JGROUP LPAR QSTR RPAR { $$ = new Expression (Expression::OP_JAVA, $1, $3); }
-       | JPARENT LPAR QSTR RPAR { $$ = new Expression (Expression::OP_JAVA, $1, $3); }
-       | FILEIOVFD LPAR QSTR RPAR { $$ = new Expression (Expression::OP_FILE, $1, $3); }
-       | NUM                   { $$ = new Expression ($1); }
-       | NAME                  { $$ = new Expression ($1); }
+       | term                  { $$ = $1; }
+
+term:    MINUS term
+         {
+            $$ = new Expression (Expression::OP_MINUS,
+                                 new Expression (Expression::OP_NUM, (uint64_t) 0), $2);
+         }
+       | NOT    term           { $$ = new Expression (Expression::OP_NOT, $2); }
+       | BITNOT term           { $$ = new Expression (Expression::OP_BITNOT, $2); }
+       | LPAR exp RPAR         { $$ = $2; }
+       | FNAME LPAR QSTR RPAR
+         {
+           $$ = new Expression (Expression::OP_FUNC,
+                                new Expression (Expression::OP_NUM, $1),
+                                new Expression (Expression::OP_NUM, $3));
+         }
+       | HASPROP LPAR NAME RPAR
+         {
+           $$ = new Expression (Expression::OP_HASPROP,
+                                new Expression (Expression::OP_NUM, processName($3)));
+         }
+       | JGROUP LPAR QSTR RPAR
+         {
+           $$ = new Expression (Expression::OP_JAVA,
+                                new Expression (Expression::OP_NUM, $1),
+                                new Expression (Expression::OP_NUM, $3));
+         }
+       | JPARENT LPAR QSTR RPAR
+         {
+            $$ = new Expression (Expression::OP_JAVA,
+                                 new Expression (Expression::OP_NUM, $1),
+                                 new Expression (Expression::OP_NUM, $3));
+         }
+       | FILEIOVFD LPAR QSTR RPAR
+         {
+           $$ = new Expression (Expression::OP_FILE,
+                                new Expression (Expression::OP_NUM, (uint64_t) 0),
+                                new Expression (Expression::OP_NUM, $3));
+         }
+       | NUM                   { $$ = new Expression (Expression::OP_NUM, $1); }
+       | NAME                  { $$ = processName($1); }
 
 %%
 
@@ -157,26 +203,6 @@ namespace QL
     return tok;
   }
 
-  static Expression *
-  processName (char *name)
-  {
-    int propID = dbeSession->getPropIdByName (name);
-    if (propID != PROP_NONE)
-      {
-       Expression *expr = new Expression (Expression::OP_NUM, (uint64_t) propID);
-       Expression *ret = new Expression (Expression::OP_NAME, expr);
-       delete expr;
-       return ret;
-      }
-
-    // If a name is not statically known try user defined objects
-    Expression *expr = dbeSession->findObjDefByName (name);
-    if (expr != NULL)
-      return expr->copy();
-
-    throw Parser::syntax_error ("Name not found");
-  }
-
   static Parser::symbol_type
   yylex (QL::Result &result)
   {
@@ -191,6 +217,7 @@ namespace QL
 
     switch (c)
       {
+      case '\0':
       case '\n': return Parser::make_YYEOF ();
       case '(': return Parser::make_LPAR () ;
       case ')': return Parser::make_RPAR ();
@@ -264,7 +291,7 @@ namespace QL
                case '"':
                  *ptr = (char)0;
                  // XXX omazur: need new string type
-                 return Parser::make_QSTR (new Expression (Expression::OP_NUM, (uint64_t) str));
+                 return Parser::make_QSTR ((uint64_t) str);
                case 0:
                case '\n':
                  free (str);
@@ -331,7 +358,7 @@ namespace QL
                lval = lval * base + digit;
                c = result.in.get ();
              }
-           return Parser::make_NUM (new Expression (Expression::OP_NUM, lval));
+           return Parser::make_NUM (lval);
          }
 
        if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))
@@ -359,23 +386,24 @@ namespace QL
            else if (strcasecmp (name, NTXT ("ORDERED")) == 0)
              return Parser::make_ORDR ();
            else if (strcasecmp (name, NTXT ("TRUE")) == 0)
-             return Parser::make_NUM (new Expression (Expression::OP_NUM, (uint64_t) 1));
+             return Parser::make_NUM ((uint64_t) 1);
            else if (strcasecmp (name, NTXT ("FALSE")) == 0)
-             return Parser::make_NUM (new Expression (Expression::OP_NUM, (uint64_t) 0));
+             return Parser::make_NUM ((uint64_t) 0);
            else if (strcasecmp (name, NTXT ("FNAME")) == 0)
-             return Parser::make_FNAME (new Expression (Expression::OP_NUM, Expression::FUNC_FNAME));
+             return Parser::make_FNAME (Expression::FUNC_FNAME);
            else if (strcasecmp (name, NTXT ("HAS_PROP")) == 0)
              return Parser::make_HASPROP ();
            else if (strcasecmp (name, NTXT ("JGROUP")) == 0)
-             return Parser::make_JGROUP (new Expression (Expression::OP_NUM, Expression::JAVA_JGROUP));
+             return Parser::make_JGROUP (Expression::JAVA_JGROUP);
            else if (strcasecmp (name, NTXT ("JPARENT")) == 0 )
-             return Parser::make_JPARENT (new Expression (Expression::OP_NUM, Expression::JAVA_JPARENT));
+             return Parser::make_JPARENT (Expression::JAVA_JPARENT);
            else if (strcasecmp (name, NTXT ("DNAME")) == 0)
-             return Parser::make_FNAME (new Expression (Expression::OP_NUM, Expression::FUNC_DNAME));
+             return Parser::make_FNAME (Expression::FUNC_DNAME);
            else if (strcasecmp (name, NTXT ("FILEIOVFD")) == 0 )
-             return Parser::make_FILEIOVFD (new Expression (Expression::OP_NUM, (uint64_t) 0));
+             return Parser::make_FILEIOVFD ();
 
-           return Parser::make_NAME (processName (name));
+           std::string nm = std::string (name);
+           return Parser::make_NAME (nm);
          }
 
        throw Parser::syntax_error ("Syntax error");