9258 lines
264 KiB
Diff
9258 lines
264 KiB
Diff
diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc2/configure cvs/gdl/configure
|
||
--- gdl-0.9rc2/configure 2009-01-20 12:33:51.000000000 -0700
|
||
+++ cvs/gdl/configure 2009-01-26 09:43:53.000000000 -0700
|
||
@@ -1,6 +1,6 @@
|
||
#! /bin/sh
|
||
# Guess values for system-dependent variables and create Makefiles.
|
||
-# Generated by GNU Autoconf 2.61 for gdl 0.9rc1 CVS.
|
||
+# Generated by GNU Autoconf 2.61 for gdl 0.9rc2 CVS.
|
||
#
|
||
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
|
||
# 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
|
||
@@ -726,8 +726,8 @@
|
||
# Identity of this package.
|
||
PACKAGE_NAME='gdl'
|
||
PACKAGE_TARNAME='gdl'
|
||
-PACKAGE_VERSION='0.9rc1 CVS'
|
||
-PACKAGE_STRING='gdl 0.9rc1 CVS'
|
||
+PACKAGE_VERSION='0.9rc2 CVS'
|
||
+PACKAGE_STRING='gdl 0.9rc2 CVS'
|
||
PACKAGE_BUGREPORT=''
|
||
|
||
# Factoring default headers for most tests.
|
||
@@ -1398,7 +1398,7 @@
|
||
# Omit some internal or obsolete options to make the list less imposing.
|
||
# This message is too long to be a string in the A/UX 3.1 sh.
|
||
cat <<_ACEOF
|
||
-\`configure' configures gdl 0.9rc1 CVS to adapt to many kinds of systems.
|
||
+\`configure' configures gdl 0.9rc2 CVS to adapt to many kinds of systems.
|
||
|
||
Usage: $0 [OPTION]... [VAR=VALUE]...
|
||
|
||
@@ -1468,7 +1468,7 @@
|
||
|
||
if test -n "$ac_init_help"; then
|
||
case $ac_init_help in
|
||
- short | recursive ) echo "Configuration of gdl 0.9rc1 CVS:";;
|
||
+ short | recursive ) echo "Configuration of gdl 0.9rc2 CVS:";;
|
||
esac
|
||
cat <<\_ACEOF
|
||
|
||
@@ -1585,7 +1585,7 @@
|
||
test -n "$ac_init_help" && exit $ac_status
|
||
if $ac_init_version; then
|
||
cat <<\_ACEOF
|
||
-gdl configure 0.9rc1 CVS
|
||
+gdl configure 0.9rc2 CVS
|
||
generated by GNU Autoconf 2.61
|
||
|
||
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
|
||
@@ -1599,7 +1599,7 @@
|
||
This file contains any messages produced by compilers while
|
||
running configure, to aid debugging if configure makes a mistake.
|
||
|
||
-It was created by gdl $as_me 0.9rc1 CVS, which was
|
||
+It was created by gdl $as_me 0.9rc2 CVS, which was
|
||
generated by GNU Autoconf 2.61. Invocation command line was
|
||
|
||
$ $0 $@
|
||
@@ -2292,7 +2292,7 @@
|
||
|
||
# Define the identity of the package.
|
||
PACKAGE='gdl'
|
||
- VERSION='0.9rc1 CVS'
|
||
+ VERSION='0.9rc2 CVS'
|
||
|
||
|
||
cat >>confdefs.h <<_ACEOF
|
||
@@ -22298,7 +22298,7 @@
|
||
# report actual input values of CONFIG_FILES etc. instead of their
|
||
# values after options handling.
|
||
ac_log="
|
||
-This file was extended by gdl $as_me 0.9rc1 CVS, which was
|
||
+This file was extended by gdl $as_me 0.9rc2 CVS, which was
|
||
generated by GNU Autoconf 2.61. Invocation command line was
|
||
|
||
CONFIG_FILES = $CONFIG_FILES
|
||
@@ -22351,7 +22351,7 @@
|
||
_ACEOF
|
||
cat >>$CONFIG_STATUS <<_ACEOF
|
||
ac_cs_version="\\
|
||
-gdl config.status 0.9rc1 CVS
|
||
+gdl config.status 0.9rc2 CVS
|
||
configured by $0, generated by GNU Autoconf 2.61,
|
||
with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
|
||
|
||
diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc2/configure.in cvs/gdl/configure.in
|
||
--- gdl-0.9rc2/configure.in 2009-01-22 15:31:48.000000000 -0700
|
||
+++ cvs/gdl/configure.in 2009-01-26 09:43:53.000000000 -0700
|
||
@@ -1,4 +1,4 @@
|
||
-AC_INIT(gdl, 0.9rc2)
|
||
+AC_INIT(gdl, 0.9rc2 CVS)
|
||
|
||
AM_CONFIG_HEADER(config.h)
|
||
AM_INIT_AUTOMAKE
|
||
diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc2/README cvs/gdl/README
|
||
--- gdl-0.9rc2/README 2009-01-20 13:01:46.000000000 -0700
|
||
+++ cvs/gdl/README 2008-04-08 11:10:46.000000000 -0600
|
||
@@ -97,7 +97,6 @@
|
||
compiler) is needed for compiling GDL.
|
||
Note that due to problems with static casts g++ 3.3.1
|
||
does NOT compile GDL, but 3.3.2 and 3.4.1 work fine again.
|
||
-Since 0.9rc2 GDL should compile with gcc 4.3 .
|
||
GDL compiles under Mac OS X (10.2, 10.3) with g++ 3.3 .
|
||
|
||
The GNU readline library 4.3 is needed (actually GDL should compile
|
||
Only in gdl-0.9rc2/src: basic_fun.cpp.ori
|
||
diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc2/src/basic_fun_jmg.cpp cvs/gdl/src/basic_fun_jmg.cpp
|
||
--- gdl-0.9rc2/src/basic_fun_jmg.cpp 2009-01-20 12:33:52.000000000 -0700
|
||
+++ cvs/gdl/src/basic_fun_jmg.cpp 2009-01-26 09:43:54.000000000 -0700
|
||
@@ -462,6 +462,11 @@
|
||
|
||
SizeT nEl = p0->N_Elements();
|
||
SizeT Rank = p0->Rank();
|
||
+// if( Rank == 0)
|
||
+// e->Throw( "Parameter must be an array in this context: "
|
||
+// + e->GetParString( 0));
|
||
+
|
||
+
|
||
SizeT Type = p0->Type();
|
||
|
||
dimension dim;
|
||
Only in gdl-0.9rc2/src: basic_pro.cpp.sav
|
||
diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc2/src/dcompiler.cpp cvs/gdl/src/dcompiler.cpp
|
||
--- gdl-0.9rc2/src/dcompiler.cpp 2009-01-20 12:33:52.000000000 -0700
|
||
+++ cvs/gdl/src/dcompiler.cpp 2009-01-26 09:43:54.000000000 -0700
|
||
@@ -158,6 +158,12 @@
|
||
}
|
||
}
|
||
|
||
+void DCompiler::ContinueMainPro()
|
||
+{
|
||
+ env = GDLInterpreter::CallStack()[0];
|
||
+ pro = static_cast<DSubUD*>( env->GetPro());
|
||
+}
|
||
+
|
||
void DCompiler::StartFun(const string& n,const string& o)
|
||
{
|
||
ClearOwnCommon();
|
||
diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc2/src/dcompiler.hpp cvs/gdl/src/dcompiler.hpp
|
||
--- gdl-0.9rc2/src/dcompiler.hpp 2009-01-20 12:33:57.000000000 -0700
|
||
+++ cvs/gdl/src/dcompiler.hpp 2009-01-26 09:43:54.000000000 -0700
|
||
@@ -66,6 +66,7 @@
|
||
void AddPar(const std::string&); // add parameter
|
||
void AddKey(const std::string&,const std::string&); // add keyword,varName
|
||
void StartPro(const std::string&,const std::string& o = "");
|
||
+ void ContinueMainPro();
|
||
void EndFunPro();
|
||
void EndInteractiveStatement();
|
||
void EndPro();
|
||
@@ -88,6 +89,8 @@
|
||
int NDefLabel();
|
||
bool IsActivePro( DSub* p);
|
||
bool ActiveProCompiled() const { return activeProCompiled;}
|
||
+ EnvBaseT* GetEnv() const { return env;}
|
||
+ void SetEnv( EnvBaseT* e) { env = e;}
|
||
};
|
||
|
||
#endif
|
||
diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc2/src/file.cpp cvs/gdl/src/file.cpp
|
||
--- gdl-0.9rc2/src/file.cpp 2009-01-20 12:33:57.000000000 -0700
|
||
+++ cvs/gdl/src/file.cpp 2008-11-12 17:03:31.000000000 -0700
|
||
@@ -165,6 +165,89 @@
|
||
return res;
|
||
}
|
||
|
||
+ BaseGDL* file_info( EnvT* e)
|
||
+ {
|
||
+ SizeT nParam=e->NParam( 1);
|
||
+
|
||
+ BaseGDL* p0 = e->GetParDefined( 0);
|
||
+
|
||
+ DStringGDL* p0S = dynamic_cast<DStringGDL*>( p0);
|
||
+ if( p0S == NULL)
|
||
+ e->Throw( "String expression required in this context: "+
|
||
+ e->GetParString(0));
|
||
+
|
||
+ static int directoryIx = e->KeywordIx( "NOEXPAND_PATH");
|
||
+ bool directory = e->KeywordSet( noexpand_pathIx);
|
||
+
|
||
+ DLongGDL* getMode = NULL;
|
||
+ if( get_mode)
|
||
+ {
|
||
+ getMode = new DLongGDL( p0S->Dim()); // zero
|
||
+ e->SetKW( get_modeIx, getMode);
|
||
+ }
|
||
+
|
||
+ DLongGDL* res = new DLongGDL( p0S->Dim()); // zero
|
||
+
|
||
+// bool doStat =
|
||
+// zero_length || get_mode || directory ||
|
||
+// regular || block_special || character_special ||
|
||
+// named_pipe || socket || symlink;
|
||
+
|
||
+ SizeT nEl = p0S->N_Elements();
|
||
+ for( SizeT f=0; f<nEl; ++f)
|
||
+ {
|
||
+ const char* actFile = (*p0S)[ f].c_str();
|
||
+
|
||
+ struct stat statStruct;
|
||
+ int actStat = lstat( actFile, &statStruct);
|
||
+ if( actStat != 0)
|
||
+ continue;
|
||
+
|
||
+ // if( !wxFileExists( actFile) && !wxDirExists( actFile))
|
||
+ // continue;
|
||
+
|
||
+ // if( directory && !wxDirExists( actFile))
|
||
+ // continue;
|
||
+ // if( read && !wxFile::Access( actFile, wxFile::read))
|
||
+ // continue;
|
||
+ // if( write && !wxFile::Access( actFile, wxFile::write))
|
||
+ // continue;
|
||
+
|
||
+ if( read && access( actFile, R_OK) != 0)
|
||
+ continue;
|
||
+ if( write && access( actFile, W_OK) != 0)
|
||
+ continue;
|
||
+ if( executable && access( actFile, X_OK) != 0)
|
||
+ continue;
|
||
+
|
||
+ if( zero_length && statStruct.st_size != 0)
|
||
+ continue;
|
||
+
|
||
+ if( get_mode)
|
||
+ (*getMode)[ f] = statStruct.st_mode &
|
||
+ (S_IRWXU | S_IRWXG | S_IRWXO);
|
||
+
|
||
+ if( directory && S_ISDIR(statStruct.st_mode) == 0)
|
||
+ continue;
|
||
+ if( regular && S_ISREG(statStruct.st_mode) == 0)
|
||
+ continue;
|
||
+ if( block_special && S_ISBLK(statStruct.st_mode) == 0)
|
||
+ continue;
|
||
+ if( character_special && S_ISCHR(statStruct.st_mode) == 0)
|
||
+ continue;
|
||
+ if( named_pipe && S_ISFIFO(statStruct.st_mode) == 0)
|
||
+ continue;
|
||
+ if( socket && S_ISSOCK(statStruct.st_mode) == 0)
|
||
+ continue;
|
||
+ if( symlink && S_ISLNK(statStruct.st_mode) == 0)
|
||
+ continue;
|
||
+
|
||
+ (*res)[ f] = 1;
|
||
+ }
|
||
+
|
||
+ return res;
|
||
+ }
|
||
+
|
||
DString GetCWD()
|
||
{
|
||
SizeT bufSize = PATH_MAX;
|
||
diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc2/src/file_info.cpp cvs/gdl/src/file_info.cpp
|
||
--- gdl-0.9rc2/src/file_info.cpp 1969-12-31 17:00:00.000000000 -0700
|
||
+++ cvs/gdl/src/file_info.cpp 2008-11-12 16:56:50.000000000 -0700
|
||
@@ -0,0 +1,4758 @@
|
||
+/***************************************************************************
|
||
+ basic_fun.cpp - basic GDL library function
|
||
+ -------------------
|
||
+ begin : July 22 2002
|
||
+ copyright : (C) 2002 by Marc Schellens (exceptions see below)
|
||
+ email : m_schellens@users.sf.net
|
||
+
|
||
+ strtok_fun, getenv_fun, tag_names_fun, stregex_fun:
|
||
+ (C) 2004 by Peter Messmer
|
||
+
|
||
+***************************************************************************/
|
||
+
|
||
+/***************************************************************************
|
||
+ * *
|
||
+ * 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 2 of the License, or *
|
||
+ * (at your option) any later version. *
|
||
+ * *
|
||
+ ***************************************************************************/
|
||
+
|
||
+#include "includefirst.hpp"
|
||
+
|
||
+#include <string>
|
||
+#include <fstream>
|
||
+//#include <memory>
|
||
+#include <regex.h> // stregex
|
||
+
|
||
+#ifdef __APPLE__
|
||
+# include <crt_externs.h>
|
||
+# define environ (*_NSGetEnviron())
|
||
+#else
|
||
+#include <unistd.h>
|
||
+#endif
|
||
+
|
||
+#if defined(__FreeBSD__)
|
||
+extern "C" char **environ;
|
||
+#endif
|
||
+
|
||
+#include "datatypes.hpp"
|
||
+#include "envt.hpp"
|
||
+#include "dpro.hpp"
|
||
+#include "dinterpreter.hpp"
|
||
+#include "basic_pro.hpp"
|
||
+#include "terminfo.hpp"
|
||
+#include "typedefs.hpp"
|
||
+
|
||
+/* max regexp error message length */
|
||
+#define MAX_REGEXPERR_LENGTH 80
|
||
+
|
||
+namespace lib {
|
||
+
|
||
+ using namespace std;
|
||
+ using namespace antlr;
|
||
+
|
||
+ // assumes all paramters from pOffs till end are dim
|
||
+ void arr( EnvT* e, dimension& dim, SizeT pOffs=0)
|
||
+ {
|
||
+ int nParam=e->NParam()-pOffs;
|
||
+
|
||
+ if( nParam <= 0)
|
||
+ e->Throw( "Incorrect number of arguments.");
|
||
+
|
||
+ if( nParam == 1 ) {
|
||
+ BaseGDL* par = e->GetParDefined( pOffs);
|
||
+
|
||
+ SizeT newDim;
|
||
+ int ret = par->Scalar2index( newDim);
|
||
+ if( ret > 0) { // single argument
|
||
+ dim << newDim;
|
||
+ return;
|
||
+ }
|
||
+ if( ret == 0) { // array argument
|
||
+ DLongGDL* ind =
|
||
+ static_cast<DLongGDL*>(par->Convert2(LONG, BaseGDL::COPY));
|
||
+ e->Guard( ind);
|
||
+
|
||
+ for(SizeT i =0; i < par->N_Elements(); ++i)
|
||
+ dim << (*ind)[i];
|
||
+
|
||
+ return;
|
||
+ }
|
||
+ e->Throw( "arr: should never arrive here.");
|
||
+ return;
|
||
+ }
|
||
+
|
||
+ // max number checked in interpreter
|
||
+ SizeT endIx=nParam+pOffs;
|
||
+ for( SizeT i=pOffs; i<endIx; i++)
|
||
+ {
|
||
+ BaseGDL* par=e->GetParDefined( i);
|
||
+
|
||
+ SizeT newDim;
|
||
+ int ret=par->Scalar2index( newDim);
|
||
+ if( ret < 1 || newDim == 0)
|
||
+ e->Throw( "Arguments must be all scalar > 0.");
|
||
+
|
||
+ dim << newDim;
|
||
+ }
|
||
+ }
|
||
+
|
||
+ BaseGDL* bytarr( EnvT* e)
|
||
+ {
|
||
+ dimension dim;
|
||
+ try{
|
||
+ arr( e, dim);
|
||
+ if (dim[0] == 0)
|
||
+ throw GDLException( "Array dimensions must be greater than 0");
|
||
+
|
||
+ if( e->KeywordSet(0)) return new DByteGDL(dim, BaseGDL::NOZERO);
|
||
+ return new DByteGDL(dim);
|
||
+ }
|
||
+ catch( GDLException ex)
|
||
+ {
|
||
+ e->Throw( ex.getMessage());
|
||
+ }
|
||
+ }
|
||
+ BaseGDL* intarr( EnvT* e)
|
||
+ {
|
||
+ dimension dim;
|
||
+ try{
|
||
+ arr( e, dim);
|
||
+ if (dim[0] == 0)
|
||
+ throw GDLException( "Array dimensions must be greater than 0");
|
||
+
|
||
+ if( e->KeywordSet(0)) return new DIntGDL(dim, BaseGDL::NOZERO);
|
||
+ return new DIntGDL(dim);
|
||
+ }
|
||
+ catch( GDLException ex)
|
||
+ {
|
||
+ throw GDLException( e->CallingNode(), "INTARR: "+ex.getMessage());
|
||
+ }
|
||
+ }
|
||
+ BaseGDL* uintarr( EnvT* e)
|
||
+ {
|
||
+ dimension dim;
|
||
+ try{
|
||
+ arr( e, dim);
|
||
+ if (dim[0] == 0)
|
||
+ throw GDLException( "Array dimensions must be greater than 0");
|
||
+
|
||
+ if( e->KeywordSet(0)) return new DUIntGDL(dim, BaseGDL::NOZERO);
|
||
+ return new DUIntGDL(dim);
|
||
+ }
|
||
+ catch( GDLException ex)
|
||
+ {
|
||
+ throw GDLException( e->CallingNode(), "UINTARR: "+ex.getMessage());
|
||
+ }
|
||
+ }
|
||
+ BaseGDL* lonarr( EnvT* e)
|
||
+ {
|
||
+ dimension dim;
|
||
+ try{
|
||
+ arr( e, dim);
|
||
+ if (dim[0] == 0)
|
||
+ throw GDLException( "Array dimensions must be greater than 0");
|
||
+
|
||
+ if( e->KeywordSet(0)) return new DLongGDL(dim, BaseGDL::NOZERO);
|
||
+ return new DLongGDL(dim);
|
||
+ }
|
||
+ catch( GDLException ex)
|
||
+ {
|
||
+ throw GDLException( e->CallingNode(), "LONARR: "+ex.getMessage());
|
||
+ }
|
||
+ }
|
||
+ BaseGDL* ulonarr( EnvT* e)
|
||
+ {
|
||
+ dimension dim;
|
||
+ try{
|
||
+ arr( e, dim);
|
||
+ if (dim[0] == 0)
|
||
+ throw GDLException( "Array dimensions must be greater than 0");
|
||
+
|
||
+ if( e->KeywordSet(0)) return new DULongGDL(dim, BaseGDL::NOZERO);
|
||
+ return new DULongGDL(dim);
|
||
+ }
|
||
+ catch( GDLException ex)
|
||
+ {
|
||
+ throw GDLException( e->CallingNode(), "ULONARR: "+ex.getMessage());
|
||
+ }
|
||
+ }
|
||
+ BaseGDL* lon64arr( EnvT* e)
|
||
+ {
|
||
+ dimension dim;
|
||
+ try{
|
||
+ arr( e, dim);
|
||
+ if (dim[0] == 0)
|
||
+ throw GDLException( "Array dimensions must be greater than 0");
|
||
+
|
||
+ if( e->KeywordSet(0)) return new DLong64GDL(dim, BaseGDL::NOZERO);
|
||
+ return new DLong64GDL(dim);
|
||
+ }
|
||
+ catch( GDLException ex)
|
||
+ {
|
||
+ throw GDLException( e->CallingNode(), "LON64ARR: "+ex.getMessage());
|
||
+ }
|
||
+ }
|
||
+ BaseGDL* ulon64arr( EnvT* e)
|
||
+ {
|
||
+ dimension dim;
|
||
+ try{
|
||
+ arr( e, dim);
|
||
+ if (dim[0] == 0)
|
||
+ throw GDLException( "Array dimensions must be greater than 0");
|
||
+
|
||
+ if( e->KeywordSet(0)) return new DULong64GDL(dim, BaseGDL::NOZERO);
|
||
+ return new DULong64GDL(dim);
|
||
+ }
|
||
+ catch( GDLException ex)
|
||
+ {
|
||
+ throw GDLException( e->CallingNode(), "ULON64ARR: "+ex.getMessage());
|
||
+ }
|
||
+ }
|
||
+ BaseGDL* fltarr( EnvT* e)
|
||
+ {
|
||
+ dimension dim;
|
||
+ try{
|
||
+ arr( e, dim);
|
||
+ if (dim[0] == 0)
|
||
+ throw GDLException( "Array dimensions must be greater than 0");
|
||
+
|
||
+ if( e->KeywordSet(0)) return new DFloatGDL(dim, BaseGDL::NOZERO);
|
||
+ return new DFloatGDL(dim);
|
||
+ }
|
||
+ catch( GDLException ex)
|
||
+ {
|
||
+ throw GDLException( e->CallingNode(), "FLTARR: "+ex.getMessage());
|
||
+ }
|
||
+ }
|
||
+ BaseGDL* dblarr( EnvT* e)
|
||
+ {
|
||
+ dimension dim;
|
||
+ try{
|
||
+ arr( e, dim);
|
||
+ if (dim[0] == 0)
|
||
+ throw GDLException( "Array dimensions must be greater than 0");
|
||
+
|
||
+ if( e->KeywordSet(0)) return new DDoubleGDL(dim, BaseGDL::NOZERO);
|
||
+ return new DDoubleGDL(dim);
|
||
+ }
|
||
+ catch( GDLException ex)
|
||
+ {
|
||
+ throw GDLException( e->CallingNode(), "DBLARR: "+ex.getMessage());
|
||
+ }
|
||
+ }
|
||
+ BaseGDL* strarr( EnvT* e)
|
||
+ {
|
||
+ dimension dim;
|
||
+ try{
|
||
+ arr( e, dim);
|
||
+ if (dim[0] == 0)
|
||
+ throw GDLException( "Array dimensions must be greater than 0");
|
||
+
|
||
+ if( e->KeywordSet(0))
|
||
+ throw GDLException( e->CallingNode(), "Keyword parameters not allowed in call.");
|
||
+ return new DStringGDL(dim);
|
||
+ }
|
||
+ catch( GDLException ex)
|
||
+ {
|
||
+ throw GDLException( e->CallingNode(), "STRARR: "+ex.getMessage());
|
||
+ }
|
||
+ }
|
||
+ BaseGDL* complexarr( EnvT* e)
|
||
+ {
|
||
+ dimension dim;
|
||
+ try{
|
||
+ arr( e, dim);
|
||
+ if (dim[0] == 0)
|
||
+ throw GDLException( "Array dimensions must be greater than 0");
|
||
+
|
||
+ if( e->KeywordSet(0)) return new DComplexGDL(dim, BaseGDL::NOZERO);
|
||
+ return new DComplexGDL(dim);
|
||
+ }
|
||
+ catch( GDLException ex)
|
||
+ {
|
||
+ throw GDLException( e->CallingNode(), "COMPLEXARR: "+ex.getMessage());
|
||
+ }
|
||
+ }
|
||
+ BaseGDL* dcomplexarr( EnvT* e)
|
||
+ {
|
||
+ dimension dim;
|
||
+ try{
|
||
+ arr( e, dim);
|
||
+ if (dim[0] == 0)
|
||
+
|
||
+ if( e->KeywordSet(0)) return new DComplexDblGDL(dim, BaseGDL::NOZERO);
|
||
+ return new DComplexDblGDL(dim);
|
||
+ }
|
||
+ catch( GDLException ex)
|
||
+ {
|
||
+ throw GDLException( e->CallingNode(), "DCOMPLEXARR: "+ex.getMessage());
|
||
+ }
|
||
+ }
|
||
+ BaseGDL* ptrarr( EnvT* e)
|
||
+ {
|
||
+ dimension dim;
|
||
+ try{
|
||
+ arr( e, dim);
|
||
+ if (dim[0] == 0)
|
||
+ throw GDLException( "Array dimensions must be greater than 0");
|
||
+
|
||
+ DPtrGDL* ret;
|
||
+
|
||
+ if( e->KeywordSet(0) || e->KeywordSet(1))
|
||
+ ret= new DPtrGDL(dim, BaseGDL::NOZERO);
|
||
+ else
|
||
+ return new DPtrGDL(dim);
|
||
+
|
||
+ if( e->KeywordSet(1))
|
||
+ {
|
||
+ SizeT nEl=ret->N_Elements();
|
||
+ SizeT sIx=e->NewHeap(nEl);
|
||
+ for( SizeT i=0; i<nEl; i++) (*ret)[i]=sIx++;
|
||
+ }
|
||
+ return ret;
|
||
+ }
|
||
+ catch( GDLException ex)
|
||
+ {
|
||
+ throw GDLException( e->CallingNode(), "PTRARR: "+ex.getMessage());
|
||
+ }
|
||
+ }
|
||
+ BaseGDL* objarr( EnvT* e)
|
||
+ {
|
||
+ dimension dim;
|
||
+ try{
|
||
+ arr( e, dim);
|
||
+ if (dim[0] == 0)
|
||
+ throw GDLException( "Array dimensions must be greater than 0");
|
||
+
|
||
+ if( e->KeywordSet(0)) return new DObjGDL(dim, BaseGDL::NOZERO);
|
||
+ return new DObjGDL(dim);
|
||
+ }
|
||
+ catch( GDLException ex)
|
||
+ {
|
||
+ throw GDLException( e->CallingNode(), "OBJARR: "+ex.getMessage());
|
||
+ }
|
||
+ }
|
||
+
|
||
+ BaseGDL* ptr_new( EnvT* e)
|
||
+ {
|
||
+ int nParam=e->NParam();
|
||
+
|
||
+ if( nParam > 0)
|
||
+ {
|
||
+ if( e->KeywordSet(0)) // NO_COPY
|
||
+ {
|
||
+ BaseGDL** p= &e->GetPar( 0);
|
||
+ if( *p == NULL)
|
||
+ throw GDLException( e->CallingNode(), "Parameter undefined: "+e->GetParString(0));
|
||
+
|
||
+ DPtr heapID= e->NewHeap( 1, *p);
|
||
+ *p=NULL;
|
||
+ return new DPtrGDL( heapID);
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ BaseGDL* p= e->GetParDefined( 0);
|
||
+
|
||
+ DPtr heapID= e->NewHeap( 1, p->Dup());
|
||
+ return new DPtrGDL( heapID);
|
||
+ }
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ if( e->KeywordSet(1)) // ALLOCATE_HEAP
|
||
+ {
|
||
+ DPtr heapID= e->NewHeap();
|
||
+ return new DPtrGDL( heapID);
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ return new DPtrGDL( 0); // null ptr
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+
|
||
+ BaseGDL* ptr_valid( EnvT* e)
|
||
+ {
|
||
+ int nParam=e->NParam();
|
||
+
|
||
+ if( e->KeywordPresent( 1)) // COUNT
|
||
+ {
|
||
+ e->SetKW( 1, new DLongGDL( e->Interpreter()->HeapSize()));
|
||
+ }
|
||
+
|
||
+ if( nParam == 0)
|
||
+ {
|
||
+ return e->Interpreter()->GetAllHeap();
|
||
+ }
|
||
+
|
||
+ BaseGDL* p = e->GetPar( 0);
|
||
+ if( p == NULL)
|
||
+ {
|
||
+ return new DByteGDL( 0);
|
||
+ }
|
||
+
|
||
+ if( e->KeywordSet( 0)) // CAST
|
||
+ {
|
||
+ DLongGDL* pL = dynamic_cast<DLongGDL*>( p);
|
||
+ if( pL == NULL)
|
||
+ {
|
||
+ pL = static_cast<DLongGDL*>(p->Convert2(LONG,BaseGDL::COPY));
|
||
+ e->Guard( pL);
|
||
+ }
|
||
+
|
||
+ SizeT nEl = pL->N_Elements();
|
||
+ DPtrGDL* ret = new DPtrGDL( pL->Dim()); // zero
|
||
+ GDLInterpreter* interpreter = e->Interpreter();
|
||
+ for( SizeT i=0; i<nEl; ++i)
|
||
+ {
|
||
+ if( interpreter->PtrValid( (*pL)[ i]))
|
||
+ (*ret)[ i] = (*pL)[ i];
|
||
+ }
|
||
+ return ret;
|
||
+ }
|
||
+
|
||
+ DPtrGDL* pPtr = dynamic_cast<DPtrGDL*>( p);
|
||
+ if( pPtr == NULL)
|
||
+ {
|
||
+ return new DByteGDL( p->Dim()); // zero
|
||
+ }
|
||
+
|
||
+ SizeT nEl = pPtr->N_Elements();
|
||
+ DByteGDL* ret = new DByteGDL( pPtr->Dim()); // zero
|
||
+ GDLInterpreter* interpreter = e->Interpreter();
|
||
+ for( SizeT i=0; i<nEl; ++i)
|
||
+ {
|
||
+ if( interpreter->PtrValid( (*pPtr)[ i]))
|
||
+ (*ret)[ i] = 1;
|
||
+ }
|
||
+ return ret;
|
||
+ }
|
||
+
|
||
+ BaseGDL* obj_valid( EnvT* e)
|
||
+ {
|
||
+ int nParam=e->NParam();
|
||
+
|
||
+ if( e->KeywordPresent( 1)) // COUNT
|
||
+ {
|
||
+ e->SetKW( 1, new DLongGDL( e->Interpreter()->ObjHeapSize()));
|
||
+ }
|
||
+
|
||
+ if( nParam == 0)
|
||
+ {
|
||
+ return e->Interpreter()->GetAllObjHeap();
|
||
+ }
|
||
+
|
||
+ BaseGDL* p = e->GetPar( 0);
|
||
+ if( p == NULL)
|
||
+ {
|
||
+ return new DByteGDL( 0);
|
||
+ }
|
||
+
|
||
+ if( e->KeywordSet( 0)) // CAST
|
||
+ {
|
||
+ DLongGDL* pL = dynamic_cast<DLongGDL*>( p);
|
||
+ if( pL == NULL)
|
||
+ {
|
||
+ pL = static_cast<DLongGDL*>(p->Convert2(LONG,BaseGDL::COPY));
|
||
+ e->Guard( pL);
|
||
+ }
|
||
+
|
||
+ SizeT nEl = pL->N_Elements();
|
||
+ DObjGDL* ret = new DObjGDL( pL->Dim()); // zero
|
||
+ GDLInterpreter* interpreter = e->Interpreter();
|
||
+ for( SizeT i=0; i<nEl; ++i)
|
||
+ {
|
||
+ if( interpreter->ObjValid( (*pL)[ i]))
|
||
+ (*ret)[ i] = (*pL)[ i];
|
||
+ }
|
||
+ return ret;
|
||
+ }
|
||
+
|
||
+ DObjGDL* pObj = dynamic_cast<DObjGDL*>( p);
|
||
+ if( pObj == NULL)
|
||
+ {
|
||
+ return new DByteGDL( p->Dim()); // zero
|
||
+ }
|
||
+
|
||
+ SizeT nEl = pObj->N_Elements();
|
||
+ DByteGDL* ret = new DByteGDL( pObj->Dim()); // zero
|
||
+ GDLInterpreter* interpreter = e->Interpreter();
|
||
+ for( SizeT i=0; i<nEl; ++i)
|
||
+ {
|
||
+ if( interpreter->ObjValid( (*pObj)[ i]))
|
||
+ (*ret)[ i] = 1;
|
||
+ }
|
||
+ return ret;
|
||
+ }
|
||
+
|
||
+ BaseGDL* obj_new( EnvT* e)
|
||
+ {
|
||
+ StackGuard<EnvStackT> guard( e->Interpreter()->CallStack());
|
||
+
|
||
+ int nParam=e->NParam();
|
||
+
|
||
+ if( nParam == 0)
|
||
+ {
|
||
+ return new DObjGDL( 0);
|
||
+ }
|
||
+
|
||
+ DString objName;
|
||
+ e->AssureScalarPar<DStringGDL>( 0, objName);
|
||
+
|
||
+ // this is a struct name -> convert to UPPERCASE
|
||
+ objName=StrUpCase(objName);
|
||
+
|
||
+ DStructDesc* objDesc=e->Interpreter()->GetStruct( objName, e->CallingNode());
|
||
+
|
||
+ DStructGDL* objStruct= new DStructGDL( objDesc, dimension());
|
||
+
|
||
+ DObj objID= e->NewObjHeap( 1, objStruct); // owns objStruct
|
||
+
|
||
+ BaseGDL* newObj = new DObjGDL( objID); // the object
|
||
+
|
||
+ try {
|
||
+ // call INIT function
|
||
+ DFun* objINIT= objDesc->GetFun( "INIT");
|
||
+ if( objINIT != NULL)
|
||
+ {
|
||
+ // morph to obj environment and push it onto the stack again
|
||
+ e->PushNewEnvUD( objINIT, 1, &newObj);
|
||
+
|
||
+ BaseGDL* res=e->Interpreter()->call_fun( objINIT->GetTree());
|
||
+
|
||
+ if( res == NULL || (!res->Scalar()) || res->False())
|
||
+ {
|
||
+ delete res;
|
||
+ return new DObjGDL( 0);
|
||
+ }
|
||
+ delete res;
|
||
+ }
|
||
+ } catch(...) {
|
||
+ e->FreeObjHeap( objID); // newObj might be changed
|
||
+ delete newObj;
|
||
+ throw;
|
||
+ }
|
||
+
|
||
+ return newObj;
|
||
+ }
|
||
+
|
||
+ BaseGDL* bindgen( EnvT* e)
|
||
+ {
|
||
+ dimension dim;
|
||
+ try{
|
||
+ arr( e, dim);
|
||
+ if (dim[0] == 0)
|
||
+ throw GDLException( "Array dimensions must be greater than 0");
|
||
+
|
||
+ return new DByteGDL(dim, BaseGDL::INDGEN);
|
||
+ }
|
||
+ catch( GDLException ex)
|
||
+ {
|
||
+ throw GDLException( e->CallingNode(), "BINDGEN: "+ex.getMessage());
|
||
+ }
|
||
+ }
|
||
+ // keywords not supported yet
|
||
+ BaseGDL* indgen( EnvT* e)
|
||
+ {
|
||
+ dimension dim;
|
||
+
|
||
+ // Defaulting to INT
|
||
+ DType type = INT;
|
||
+
|
||
+ static int kwIx1 = e->KeywordIx("BYTE");
|
||
+ if (e->KeywordSet(kwIx1)){ type = BYTE; }
|
||
+
|
||
+ static int kwIx2 = e->KeywordIx("COMPLEX");
|
||
+ if (e->KeywordSet(kwIx2)){ type = COMPLEX; }
|
||
+
|
||
+ static int kwIx3 = e->KeywordIx("DCOMPLEX");
|
||
+ if (e->KeywordSet(kwIx3)){ type = COMPLEXDBL; }
|
||
+
|
||
+ static int kwIx4 = e->KeywordIx("DOUBLE");
|
||
+ if (e->KeywordSet(kwIx4)){ type = DOUBLE; }
|
||
+
|
||
+ static int kwIx5 = e->KeywordIx("FLOAT");
|
||
+ if (e->KeywordSet(kwIx5)){ type = FLOAT; }
|
||
+
|
||
+ static int kwIx6 = e->KeywordIx("L64");
|
||
+ if (e->KeywordSet(kwIx6)){ type = LONG64; }
|
||
+
|
||
+ static int kwIx7 = e->KeywordIx("LONG");
|
||
+ if (e->KeywordSet(kwIx7)){ type = LONG; }
|
||
+
|
||
+ static int kwIx8 = e->KeywordIx("STRING");
|
||
+ if (e->KeywordSet(kwIx8)){ type = STRING; }
|
||
+
|
||
+ static int kwIx9 = e->KeywordIx("UINT");
|
||
+ if (e->KeywordSet(kwIx9)){ type = UINT; }
|
||
+
|
||
+ static int kwIx10 = e->KeywordIx("UL64");
|
||
+ if (e->KeywordSet(kwIx10)){ type = ULONG64; }
|
||
+
|
||
+ static int kwIx11 = e->KeywordIx("ULONG");
|
||
+ if (e->KeywordSet(kwIx11)){ type = ULONG; }
|
||
+
|
||
+ try
|
||
+ {
|
||
+ // Seeing if the user passed in a TYPE code
|
||
+ static int kwIx12 = e->KeywordIx("TYPE");
|
||
+ if ( e->KeywordPresent(kwIx12)){
|
||
+ DLong temp_long;
|
||
+ e->AssureLongScalarKW(kwIx12, temp_long);
|
||
+ type = static_cast<DType>(temp_long);
|
||
+ }
|
||
+
|
||
+ arr(e, dim);
|
||
+ if (dim[0] == 0)
|
||
+ throw GDLException( "Array dimensions must be greater than 0");
|
||
+
|
||
+ switch(type)
|
||
+ {
|
||
+ case INT: return new DIntGDL(dim, BaseGDL::INDGEN);
|
||
+ case BYTE: return new DByteGDL(dim, BaseGDL::INDGEN);
|
||
+ case COMPLEX: return new DComplexGDL(dim, BaseGDL::INDGEN);
|
||
+ case COMPLEXDBL: return new DComplexDblGDL(dim, BaseGDL::INDGEN);
|
||
+ case DOUBLE: return new DDoubleGDL(dim, BaseGDL::INDGEN);
|
||
+ case FLOAT: return new DFloatGDL(dim, BaseGDL::INDGEN);
|
||
+ case LONG64: return new DLong64GDL(dim, BaseGDL::INDGEN);
|
||
+ case LONG: return new DLongGDL(dim, BaseGDL::INDGEN);
|
||
+ case STRING: {
|
||
+ DULongGDL* iGen = new DULongGDL(dim, BaseGDL::INDGEN);
|
||
+ return iGen->Convert2(STRING);
|
||
+ }
|
||
+ case UINT: return new DUIntGDL(dim, BaseGDL::INDGEN);
|
||
+ case ULONG64: return new DULong64GDL(dim, BaseGDL::INDGEN);
|
||
+ case ULONG: return new DULongGDL(dim, BaseGDL::INDGEN);
|
||
+ default:
|
||
+ e->Throw( "Invalid type code specified.");
|
||
+ break;
|
||
+ }
|
||
+ }
|
||
+ catch( GDLException ex)
|
||
+ {
|
||
+ e->Throw( ex.getMessage());
|
||
+ }
|
||
+ }
|
||
+
|
||
+ BaseGDL* uindgen( EnvT* e)
|
||
+ {
|
||
+ dimension dim;
|
||
+ try{
|
||
+ arr( e, dim);
|
||
+ if (dim[0] == 0)
|
||
+ throw GDLException( "Array dimensions must be greater than 0");
|
||
+
|
||
+ return new DUIntGDL(dim, BaseGDL::INDGEN);
|
||
+ }
|
||
+ catch( GDLException ex)
|
||
+ {
|
||
+ throw GDLException( e->CallingNode(), "UINDGEN: "+ex.getMessage());
|
||
+ }
|
||
+ }
|
||
+ BaseGDL* sindgen( EnvT* e)
|
||
+ {
|
||
+ dimension dim;
|
||
+ try{
|
||
+ arr( e, dim);
|
||
+ if (dim[0] == 0)
|
||
+ throw GDLException( "Array dimensions must be greater than 0");
|
||
+
|
||
+ DULongGDL* iGen = new DULongGDL(dim, BaseGDL::INDGEN);
|
||
+ return iGen->Convert2( STRING);
|
||
+ }
|
||
+ catch( GDLException ex)
|
||
+ {
|
||
+ throw GDLException( e->CallingNode(), "SINDGEN: "+ex.getMessage());
|
||
+ }
|
||
+ }
|
||
+ BaseGDL* lindgen( EnvT* e)
|
||
+ {
|
||
+ dimension dim;
|
||
+ try{
|
||
+ arr( e, dim);
|
||
+ return new DLongGDL(dim, BaseGDL::INDGEN);
|
||
+ }
|
||
+ catch( GDLException ex)
|
||
+ {
|
||
+ throw GDLException( e->CallingNode(), "LINDGEN: "+ex.getMessage());
|
||
+ }
|
||
+ }
|
||
+ BaseGDL* ulindgen( EnvT* e)
|
||
+ {
|
||
+ dimension dim;
|
||
+ try{
|
||
+ arr( e, dim);
|
||
+ if (dim[0] == 0)
|
||
+ throw GDLException( "Array dimensions must be greater than 0");
|
||
+
|
||
+ return new DULongGDL(dim, BaseGDL::INDGEN);
|
||
+ }
|
||
+ catch( GDLException ex)
|
||
+ {
|
||
+ throw GDLException( e->CallingNode(), "ULINDGEN: "+ex.getMessage());
|
||
+ }
|
||
+ }
|
||
+ BaseGDL* l64indgen( EnvT* e)
|
||
+ {
|
||
+ dimension dim;
|
||
+ try{
|
||
+ arr( e, dim);
|
||
+ if (dim[0] == 0)
|
||
+ throw GDLException( "Array dimensions must be greater than 0");
|
||
+
|
||
+ return new DLong64GDL(dim, BaseGDL::INDGEN);
|
||
+ }
|
||
+ catch( GDLException ex)
|
||
+ {
|
||
+ throw GDLException( e->CallingNode(), "L64INDGEN: "+ex.getMessage());
|
||
+ }
|
||
+ }
|
||
+ BaseGDL* ul64indgen( EnvT* e)
|
||
+ {
|
||
+ dimension dim;
|
||
+ try{
|
||
+ arr( e, dim);
|
||
+ if (dim[0] == 0)
|
||
+ throw GDLException( "Array dimensions must be greater than 0");
|
||
+
|
||
+ return new DULong64GDL(dim, BaseGDL::INDGEN);
|
||
+ }
|
||
+ catch( GDLException ex)
|
||
+ {
|
||
+ throw GDLException( e->CallingNode(), "UL64INDGEN: "+ex.getMessage());
|
||
+ }
|
||
+ }
|
||
+ BaseGDL* findgen( EnvT* e)
|
||
+ {
|
||
+ dimension dim;
|
||
+ try{
|
||
+ arr( e, dim);
|
||
+ if (dim[0] == 0)
|
||
+ throw GDLException( "Array dimensions must be greater than 0");
|
||
+
|
||
+ return new DFloatGDL(dim, BaseGDL::INDGEN);
|
||
+ }
|
||
+ catch( GDLException ex)
|
||
+ {
|
||
+ throw GDLException( e->CallingNode(), "FINDGEN: "+ex.getMessage());
|
||
+ }
|
||
+ }
|
||
+ BaseGDL* dindgen( EnvT* e)
|
||
+ {
|
||
+ dimension dim;
|
||
+ try{
|
||
+ arr( e, dim);
|
||
+ if (dim[0] == 0)
|
||
+ throw GDLException( "Array dimensions must be greater than 0");
|
||
+
|
||
+ return new DDoubleGDL(dim, BaseGDL::INDGEN);
|
||
+ }
|
||
+ catch( GDLException ex)
|
||
+ {
|
||
+ throw GDLException( e->CallingNode(), "DINDGEN: "+ex.getMessage());
|
||
+ }
|
||
+ }
|
||
+ BaseGDL* cindgen( EnvT* e)
|
||
+ {
|
||
+ dimension dim;
|
||
+ try{
|
||
+ arr( e, dim);
|
||
+ if (dim[0] == 0)
|
||
+ throw GDLException( "Array dimensions must be greater than 0");
|
||
+
|
||
+ return new DComplexGDL(dim, BaseGDL::INDGEN);
|
||
+ }
|
||
+ catch( GDLException ex)
|
||
+ {
|
||
+ throw GDLException( e->CallingNode(), "CINDGEN: "+ex.getMessage());
|
||
+ }
|
||
+ }
|
||
+ BaseGDL* dcindgen( EnvT* e)
|
||
+ {
|
||
+ dimension dim;
|
||
+ try{
|
||
+ arr( e, dim);
|
||
+ if (dim[0] == 0)
|
||
+ throw GDLException( "Array dimensions must be greater than 0");
|
||
+
|
||
+ return new DComplexDblGDL(dim, BaseGDL::INDGEN);
|
||
+ }
|
||
+ catch( GDLException ex)
|
||
+ {
|
||
+ throw GDLException( e->CallingNode(), "DCINDGEN: "+ex.getMessage());
|
||
+ }
|
||
+ }
|
||
+
|
||
+ BaseGDL* n_elements( EnvT* e)
|
||
+ {
|
||
+ SizeT nParam=e->NParam();
|
||
+
|
||
+ if( nParam != 1)
|
||
+ throw GDLException( e->CallingNode(),
|
||
+ "N_ELEMENTS: Incorrect number of arguments.");
|
||
+
|
||
+ BaseGDL* p0=e->GetPar( 0);
|
||
+
|
||
+ if( p0 == NULL) return new DLongGDL( 0);
|
||
+
|
||
+ return new DLongGDL( p0->N_Elements());
|
||
+ }
|
||
+
|
||
+ template< typename ComplexGDL, typename Complex, typename Float>
|
||
+ BaseGDL* complex_fun_template( EnvT* e)
|
||
+ {
|
||
+ SizeT nParam=e->NParam( 1);
|
||
+
|
||
+ if( nParam <= 2)
|
||
+ {
|
||
+ if( nParam == 2)
|
||
+ {
|
||
+ BaseGDL* p0=e->GetParDefined( 0);
|
||
+ BaseGDL* p1=e->GetParDefined( 1);
|
||
+ auto_ptr<Float> p0Float( static_cast<Float*>
|
||
+ (p0->Convert2( Float::t,BaseGDL::COPY)));
|
||
+ auto_ptr<Float> p1Float( static_cast<Float*>
|
||
+ (p1->Convert2( Float::t,BaseGDL::COPY)));
|
||
+ if( p0Float->Rank() == 0)
|
||
+ {
|
||
+ ComplexGDL* res = new ComplexGDL( p1Float->Dim(),
|
||
+ BaseGDL::NOZERO);
|
||
+
|
||
+ SizeT nE=p1Float->N_Elements();
|
||
+ for( SizeT i=0; i<nE; i++)
|
||
+ {
|
||
+ (*res)[i]=Complex( (*p0Float)[0], (*p1Float)[i]);
|
||
+ }
|
||
+ return res;
|
||
+ }
|
||
+ else if( p1Float->Rank() == 0)
|
||
+ {
|
||
+ ComplexGDL* res = new ComplexGDL( p0Float->Dim(),
|
||
+ BaseGDL::NOZERO);
|
||
+
|
||
+ SizeT nE=p0Float->N_Elements();
|
||
+ for( SizeT i=0; i<nE; i++)
|
||
+ {
|
||
+ (*res)[i]=Complex( (*p0Float)[i], (*p1Float)[0]);
|
||
+ }
|
||
+ return res;
|
||
+ }
|
||
+ else if( p0Float->N_Elements() >= p1Float->N_Elements())
|
||
+ {
|
||
+ ComplexGDL* res = new ComplexGDL( p1Float->Dim(),
|
||
+ BaseGDL::NOZERO);
|
||
+
|
||
+ SizeT nE=p1Float->N_Elements();
|
||
+ for( SizeT i=0; i<nE; i++)
|
||
+ {
|
||
+ (*res)[i]=Complex( (*p0Float)[i], (*p1Float)[i]);
|
||
+ }
|
||
+ return res;
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ ComplexGDL* res = new ComplexGDL( p0Float->Dim(),
|
||
+ BaseGDL::NOZERO);
|
||
+
|
||
+ SizeT nE=p0Float->N_Elements();
|
||
+ for( SizeT i=0; i<nE; i++)
|
||
+ {
|
||
+ (*res)[i]=Complex( (*p0Float)[i], (*p1Float)[i]);
|
||
+ }
|
||
+ return res;
|
||
+ }
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ BaseGDL* p0 = e->GetParDefined( 0);
|
||
+ return p0->Convert2( ComplexGDL::t, BaseGDL::COPY);
|
||
+ }
|
||
+ }
|
||
+ else // COMPLEX( expr, offs, dim1,..,dim8)
|
||
+ {
|
||
+ BaseGDL* p0 = e->GetParDefined( 0);
|
||
+ // *** WRONG: with offs data is converted bytewise
|
||
+ auto_ptr<Float> p0Float(static_cast<Float*>
|
||
+ (p0->Convert2( Float::t,
|
||
+ BaseGDL::COPY)));
|
||
+ DLong offs;
|
||
+ e->AssureLongScalarPar( 1, offs);
|
||
+
|
||
+ dimension dim;
|
||
+ arr( e, dim, 2);
|
||
+
|
||
+ SizeT nElCreate=dim.N_Elements();
|
||
+
|
||
+ SizeT nElSource=p0->N_Elements();
|
||
+
|
||
+ if( (offs+2*nElCreate) > nElSource)
|
||
+ e->Throw( "Specified offset to"
|
||
+ " array is out of range: "+e->GetParString(0));
|
||
+
|
||
+ ComplexGDL* res=new ComplexGDL( dim, BaseGDL::NOZERO);
|
||
+
|
||
+ for( SizeT i=0; i<nElCreate; i++)
|
||
+ {
|
||
+ SizeT srcIx=2*i+offs;
|
||
+ (*res)[i]=Complex( (*p0Float)[srcIx], (*p0Float)[srcIx+1]);
|
||
+ }
|
||
+
|
||
+ return res;
|
||
+ }
|
||
+ }
|
||
+
|
||
+ BaseGDL* complex_fun( EnvT* e)
|
||
+ {
|
||
+ return complex_fun_template< DComplexGDL, DComplex, DFloatGDL>( e);
|
||
+ }
|
||
+ BaseGDL* dcomplex_fun( EnvT* e)
|
||
+ {
|
||
+ return complex_fun_template< DComplexDblGDL, DComplexDbl, DDoubleGDL>( e);
|
||
+ }
|
||
+
|
||
+ template< class TargetClass>
|
||
+ BaseGDL* type_fun( EnvT* e)
|
||
+ {
|
||
+ SizeT nParam=e->NParam(1);
|
||
+
|
||
+ if( nParam == 1)
|
||
+ {
|
||
+ BaseGDL* p0=e->GetParDefined( 0);
|
||
+
|
||
+ assert( dynamic_cast< EnvUDT*>( e->Caller()) != NULL);
|
||
+
|
||
+ // type_fun( expr) just convert
|
||
+ if( static_cast< EnvUDT*>( e->Caller())->GetIOError() != NULL)
|
||
+ return p0->Convert2( TargetClass::t,
|
||
+ BaseGDL::COPY_THROWIOERROR);
|
||
+ else
|
||
+ return p0->Convert2( TargetClass::t, BaseGDL::COPY);
|
||
+ }
|
||
+
|
||
+ BaseGDL* p0=e->GetNumericParDefined( 0);
|
||
+
|
||
+ // BYTE( expr, offs, dim1,..,dim8)
|
||
+ DLong offs;
|
||
+ e->AssureLongScalarPar( 1, offs);
|
||
+
|
||
+ dimension dim;
|
||
+
|
||
+ if( nParam > 2)
|
||
+ arr( e, dim, 2);
|
||
+
|
||
+ TargetClass* res=new TargetClass( dim, BaseGDL::NOZERO);
|
||
+
|
||
+ SizeT nByteCreate=res->NBytes(); // net size of new data
|
||
+
|
||
+ SizeT nByteSource=p0->NBytes(); // net size of src
|
||
+
|
||
+ if( offs < 0 || (offs+nByteCreate) > nByteSource)
|
||
+ {
|
||
+ delete res;
|
||
+ e->Throw( "Specified offset to"
|
||
+ " expression is out of range: "+e->GetParString(0));
|
||
+ }
|
||
+
|
||
+ //*** POSSIBLE ERROR because of alignment here
|
||
+ void* srcAddr = static_cast<void*>( static_cast<char*>(p0->DataAddr()) +
|
||
+ offs);
|
||
+ void* dstAddr = static_cast<void*>(&(*res)[0]);
|
||
+ memcpy( dstAddr, srcAddr, nByteCreate);
|
||
+
|
||
+ // char* srcAddr = reinterpret_cast<char*>(p0->DataAddr());
|
||
+ // char* dstAddr = reinterpret_cast<char*>(&(*res)[0]);
|
||
+ // copy( srcAddr, srcAddr+nByteCreate, dstAddr);
|
||
+
|
||
+ return res;
|
||
+ }
|
||
+
|
||
+ BaseGDL* byte_fun( EnvT* e)
|
||
+ {
|
||
+ return type_fun<DByteGDL>( e);
|
||
+ }
|
||
+ BaseGDL* fix_fun( EnvT* e)
|
||
+ {
|
||
+ DIntGDL* type = e->IfDefGetKWAs<DIntGDL>( 0);
|
||
+ if (type != NULL) {
|
||
+ int typ = (*type)[0];
|
||
+ if (typ == BYTE) return type_fun<DByteGDL>( e);
|
||
+ if (typ == INT) return type_fun<DIntGDL>( e);
|
||
+ if (typ == UINT) return type_fun<DUIntGDL>( e);
|
||
+ if (typ == LONG) return type_fun<DLongGDL>( e);
|
||
+ if (typ == ULONG) return type_fun<DULongGDL>( e);
|
||
+ if (typ == LONG64) return type_fun<DLong64GDL>( e);
|
||
+ if (typ == ULONG64) return type_fun<DULong64GDL>( e);
|
||
+ if (typ == FLOAT) return type_fun<DFloatGDL>( e);
|
||
+ if (typ == DOUBLE) return type_fun<DDoubleGDL>( e);
|
||
+ if (typ == COMPLEX) return type_fun<DComplexGDL>( e);
|
||
+ if (typ == COMPLEXDBL) return type_fun<DComplexDblGDL>( e);
|
||
+ throw GDLException( e->CallingNode(),
|
||
+ "FIX: Improper TYPE value.");
|
||
+ }
|
||
+ return type_fun<DIntGDL>( e);
|
||
+ }
|
||
+ BaseGDL* uint_fun( EnvT* e)
|
||
+ {
|
||
+ return type_fun<DUIntGDL>( e);
|
||
+ }
|
||
+ BaseGDL* long_fun( EnvT* e)
|
||
+ {
|
||
+ return type_fun<DLongGDL>( e);
|
||
+ }
|
||
+ BaseGDL* ulong_fun( EnvT* e)
|
||
+ {
|
||
+ return type_fun<DULongGDL>( e);
|
||
+ }
|
||
+ BaseGDL* long64_fun( EnvT* e)
|
||
+ {
|
||
+ return type_fun<DLong64GDL>( e);
|
||
+ }
|
||
+ BaseGDL* ulong64_fun( EnvT* e)
|
||
+ {
|
||
+ return type_fun<DULong64GDL>( e);
|
||
+ }
|
||
+ BaseGDL* float_fun( EnvT* e)
|
||
+ {
|
||
+ return type_fun<DFloatGDL>( e);
|
||
+ }
|
||
+ BaseGDL* double_fun( EnvT* e)
|
||
+ {
|
||
+ return type_fun<DDoubleGDL>( e);
|
||
+ }
|
||
+ // STRING function behaves different
|
||
+ BaseGDL* string_fun( EnvT* e)
|
||
+ {
|
||
+ SizeT nParam=e->NParam();
|
||
+
|
||
+ if( nParam == 0)
|
||
+ throw GDLException( e->CallingNode(),
|
||
+ "STRING: Incorrect number of arguments.");
|
||
+
|
||
+ bool printKey = e->KeywordSet( 4);
|
||
+ if( printKey || (e->GetKW( 0) != NULL)) // PRINT or FORMAT
|
||
+ {
|
||
+ stringstream os;
|
||
+
|
||
+ SizeT width = 0;
|
||
+ if( printKey) // otherwise: FORMAT -> width is ignored
|
||
+ {
|
||
+ width = TermWidth();
|
||
+ }
|
||
+
|
||
+ print_os( &os, e, 0, width);
|
||
+
|
||
+ deque<DString> buf;
|
||
+ while( os.good())
|
||
+ {
|
||
+ string line;
|
||
+ getline( os, line);
|
||
+ if( os.good()) buf.push_back( line);
|
||
+ }
|
||
+
|
||
+ SizeT bufSize = buf.size();
|
||
+ if( bufSize == 0)
|
||
+ throw GDLException( "Internal error: STRING: print buffer empty.");
|
||
+
|
||
+ if( bufSize > 1)
|
||
+ {
|
||
+ DStringGDL* retVal =
|
||
+ new DStringGDL( dimension( bufSize), BaseGDL::NOZERO);
|
||
+
|
||
+ for( SizeT i=0; i<bufSize; ++i)
|
||
+ (*retVal)[ i] = buf[ i];
|
||
+
|
||
+ return retVal;
|
||
+ }
|
||
+ else
|
||
+ return new DStringGDL( buf[0]);
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ if( nParam == 1) // nParam == 1 -> conversion
|
||
+ {
|
||
+ BaseGDL* p0 = e->GetParDefined( 0);
|
||
+ return p0->Convert2( STRING, BaseGDL::COPY);
|
||
+ }
|
||
+ else // concatenation
|
||
+ {
|
||
+ DString s;
|
||
+ for( SizeT i=0; i<nParam; ++i)
|
||
+ {
|
||
+ BaseGDL* p = e->GetParDefined( i);
|
||
+ DStringGDL* sP = static_cast<DStringGDL*>
|
||
+ ( p->Convert2(STRING,
|
||
+ BaseGDL::COPY_BYTE_AS_INT));
|
||
+
|
||
+ SizeT nEl = sP->N_Elements();
|
||
+ for( SizeT e=0; e<nEl; ++e)
|
||
+ s += (*sP)[ e];
|
||
+ delete sP;
|
||
+ }
|
||
+ // IDL here breaks the string into tty-width substrings
|
||
+ return new DStringGDL( s);
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+
|
||
+ BaseGDL* call_function( EnvT* e)
|
||
+ {
|
||
+ StackGuard<EnvStackT> guard( e->Interpreter()->CallStack());
|
||
+
|
||
+ int nParam=e->NParam();
|
||
+ if( nParam == 0)
|
||
+ throw GDLException( e->CallingNode(),
|
||
+ "CALL_FUNCTION: No function specified.");
|
||
+
|
||
+ DString callF;
|
||
+ e->AssureScalarPar<DStringGDL>( 0, callF);
|
||
+
|
||
+ // this is a function name -> convert to UPPERCASE
|
||
+ callF = StrUpCase( callF);
|
||
+
|
||
+ // first search library funcedures
|
||
+ int funIx=LibFunIx( callF);
|
||
+ if( funIx != -1)
|
||
+ {
|
||
+ e->PushNewEnv( libFunList[ funIx], 1);
|
||
+
|
||
+ // make the call
|
||
+ EnvT* newEnv = static_cast<EnvT*>(e->Interpreter()->CallStack().back());
|
||
+ return static_cast<DLibFun*>(newEnv->GetPro())->Fun()(newEnv);
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ funIx = GDLInterpreter::GetFunIx( callF);
|
||
+
|
||
+ e->PushNewEnvUD( funList[ funIx], 1);
|
||
+
|
||
+ // make the call
|
||
+ EnvUDT* newEnv = static_cast<EnvUDT*>(e->Interpreter()->CallStack().back());
|
||
+ return e->Interpreter()->
|
||
+ call_fun(static_cast<DSubUD*>(newEnv->GetPro())->GetTree());
|
||
+ }
|
||
+ }
|
||
+
|
||
+ BaseGDL* call_method_function( EnvT* e)
|
||
+ {
|
||
+ StackGuard<EnvStackT> guard( e->Interpreter()->CallStack());
|
||
+
|
||
+ int nParam=e->NParam();
|
||
+ if( nParam < 2)
|
||
+ throw GDLException( e->CallingNode(),
|
||
+ "CALL_METHOD: Name and object reference"
|
||
+ " must be specified.");
|
||
+
|
||
+ DString callP;
|
||
+ e->AssureScalarPar<DStringGDL>( 0, callP);
|
||
+
|
||
+ // this is a procedure name -> convert to UPPERCASE
|
||
+ callP = StrUpCase( callP);
|
||
+
|
||
+ DStructGDL* oStruct = e->GetObjectPar( 1);
|
||
+
|
||
+ DFun* method= oStruct->Desc()->GetFun( callP);
|
||
+
|
||
+ if( method == NULL)
|
||
+ throw GDLException( e->CallingNode(), "Method not found: "+callP);
|
||
+
|
||
+ e->PushNewEnv( method, 2, &e->GetPar( 1));
|
||
+
|
||
+ // make the call
|
||
+ return e->Interpreter()->call_fun( method->GetTree());
|
||
+ }
|
||
+
|
||
+ BaseGDL* execute( EnvT* e)
|
||
+ {
|
||
+ int nParam=e->NParam( 1);
|
||
+
|
||
+ bool quietCompile = false;
|
||
+ if( nParam == 2)
|
||
+ {
|
||
+ BaseGDL* p1 = e->GetParDefined( 1);
|
||
+
|
||
+ if( !p1->Scalar())
|
||
+ throw GDLException( e->CallingNode(), "Expression"
|
||
+ " must be scalar in this context: "+
|
||
+ e->GetParString(1));
|
||
+
|
||
+ quietCompile = p1->True();
|
||
+ }
|
||
+
|
||
+ DString line;
|
||
+ e->AssureScalarPar<DStringGDL>( 0, line);
|
||
+
|
||
+ // remove current environment (own one)
|
||
+ EnvBaseT* caller = e->Caller();
|
||
+ e->Interpreter()->CallStack().pop_back();
|
||
+ delete e;
|
||
+
|
||
+ istringstream istr(line+"\n");
|
||
+
|
||
+ RefDNode theAST;
|
||
+ try {
|
||
+ GDLLexer lexer(istr, "");
|
||
+ GDLParser& parser=lexer.Parser();
|
||
+
|
||
+ parser.interactive();
|
||
+
|
||
+ theAST=parser.getAST();
|
||
+ }
|
||
+ catch( GDLException ex)
|
||
+ {
|
||
+ if( !quietCompile) GDLInterpreter::ReportCompileError( ex);
|
||
+ return new DIntGDL( 0);
|
||
+ }
|
||
+ catch( ANTLRException ex)
|
||
+ {
|
||
+ if( !quietCompile) cerr << "EXECUTE: Lexer/Parser exception: " <<
|
||
+ ex.getMessage() << endl;
|
||
+ return new DIntGDL( 0);
|
||
+ }
|
||
+
|
||
+ if( theAST == NULL) return new DIntGDL( 1);
|
||
+
|
||
+ RefDNode trAST;
|
||
+ try
|
||
+ {
|
||
+ GDLTreeParser treeParser( caller);
|
||
+
|
||
+ treeParser.interactive(theAST);
|
||
+
|
||
+ trAST=treeParser.getAST();
|
||
+ }
|
||
+ catch( GDLException ex)
|
||
+ {
|
||
+ if( !quietCompile) GDLInterpreter::ReportCompileError( ex);
|
||
+ return new DIntGDL( 0);
|
||
+ }
|
||
+
|
||
+ catch( ANTLRException ex)
|
||
+ {
|
||
+ if( !quietCompile) cerr << "EXECUTE: Compiler exception: " <<
|
||
+ ex.getMessage() << endl;
|
||
+ return new DIntGDL( 0);
|
||
+ }
|
||
+
|
||
+ if( trAST == NULL) return new DIntGDL( 1);
|
||
+
|
||
+ try
|
||
+ {
|
||
+ ProgNodeP progAST = ProgNode::NewProgNode( trAST);
|
||
+ auto_ptr< ProgNode> progAST_guard( progAST);
|
||
+
|
||
+ GDLInterpreter::RetCode retCode =
|
||
+ caller->Interpreter()->execute( progAST);
|
||
+
|
||
+ if( retCode == GDLInterpreter::RC_OK)
|
||
+ return new DIntGDL( 1);
|
||
+ else
|
||
+ return new DIntGDL( 0);
|
||
+ }
|
||
+ catch( GDLException ex)
|
||
+ {
|
||
+ if( !quietCompile) cerr << "EXECUTE: Unhandled GDL exception: " <<
|
||
+ ex.getMessage() << endl;
|
||
+ return new DIntGDL( 0);
|
||
+ }
|
||
+ catch( ANTLRException ex)
|
||
+ {
|
||
+ if( !quietCompile) cerr << "EXECUTE: Interpreter exception: " <<
|
||
+ ex.getMessage() << endl;
|
||
+ return new DIntGDL( 0);
|
||
+ }
|
||
+
|
||
+ return new DIntGDL( 0); // control flow cannot reach here - compiler shut up
|
||
+ }
|
||
+
|
||
+ BaseGDL* assoc( EnvT* e)
|
||
+ {
|
||
+ SizeT nParam=e->NParam( 2);
|
||
+
|
||
+ DLong lun;
|
||
+ e->AssureLongScalarPar( 0, lun);
|
||
+
|
||
+ bool stdLun = check_lun( e, lun);
|
||
+ if( stdLun)
|
||
+ e->Throw( "File unit does not allow"
|
||
+ " this operation. Unit: "+i2s( lun));
|
||
+
|
||
+ DLong offset = 0;
|
||
+ if( nParam >= 3) e->AssureLongScalarPar( 2, offset);
|
||
+
|
||
+ BaseGDL* arr = e->GetParDefined( 1);
|
||
+
|
||
+ if( arr->StrictScalar())
|
||
+ e->Throw( "Scalar variable not allowed in this"
|
||
+ " context: "+e->GetParString(1));
|
||
+
|
||
+ return arr->AssocVar( lun, offset);
|
||
+ }
|
||
+
|
||
+ // gdl_ naming because of weired namespace problem in MSVC
|
||
+ BaseGDL* gdl_logical_and( EnvT* e)
|
||
+ {
|
||
+ SizeT nParam=e->NParam();
|
||
+ if( nParam != 2)
|
||
+ throw GDLException( e->CallingNode(),
|
||
+ "LOGICAL_AND: Incorrect number of arguments.");
|
||
+
|
||
+ BaseGDL* e1=e->GetParDefined( 0);//, "LOGICAL_AND");
|
||
+ BaseGDL* e2=e->GetParDefined( 1);//, "LOGICAL_AND");
|
||
+
|
||
+ ULong nEl1 = e1->N_Elements();
|
||
+ ULong nEl2 = e2->N_Elements();
|
||
+
|
||
+ Data_<SpDByte>* res;
|
||
+
|
||
+ if( e1->Scalar())
|
||
+ {
|
||
+ if( e1->LogTrue(0))
|
||
+ {
|
||
+ res= new Data_<SpDByte>( e2->Dim(), BaseGDL::NOZERO);
|
||
+ for( SizeT i=0; i < nEl2; i++)
|
||
+ (*res)[i] = e2->LogTrue( i) ? 1 : 0;
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ return new Data_<SpDByte>( e2->Dim());
|
||
+ }
|
||
+ }
|
||
+ else if( e2->Scalar())
|
||
+ {
|
||
+ if( e2->LogTrue(0))
|
||
+ {
|
||
+ res= new Data_<SpDByte>( e1->Dim(), BaseGDL::NOZERO);
|
||
+ for( SizeT i=0; i < nEl1; i++)
|
||
+ (*res)[i] = e1->LogTrue( i) ? 1 : 0;
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ return new Data_<SpDByte>( e1->Dim());
|
||
+ }
|
||
+ }
|
||
+ else if( nEl2 < nEl1)
|
||
+ {
|
||
+ res= new Data_<SpDByte>( e2->Dim(), BaseGDL::NOZERO);
|
||
+ for( SizeT i=0; i < nEl2; i++)
|
||
+ (*res)[i] = (e1->LogTrue( i) && e2->LogTrue( i)) ? 1 : 0;
|
||
+ }
|
||
+ else // ( nEl2 >= nEl1)
|
||
+ {
|
||
+ res= new Data_<SpDByte>( e1->Dim(), BaseGDL::NOZERO);
|
||
+ for( SizeT i=0; i < nEl1; i++)
|
||
+ (*res)[i] = (e1->LogTrue( i) && e2->LogTrue( i)) ? 1 : 0;
|
||
+ }
|
||
+ return res;
|
||
+ }
|
||
+
|
||
+ // gdl_ naming because of weired namespace problem in MSVC
|
||
+ BaseGDL* gdl_logical_or( EnvT* e)
|
||
+ {
|
||
+ SizeT nParam=e->NParam();
|
||
+ if( nParam != 2)
|
||
+ throw GDLException( e->CallingNode(),
|
||
+ "LOGICAL_OR: Incorrect number of arguments.");
|
||
+
|
||
+ BaseGDL* e1=e->GetParDefined( 0);//, "LOGICAL_OR");
|
||
+ BaseGDL* e2=e->GetParDefined( 1);//, "LOGICAL_OR");
|
||
+
|
||
+ ULong nEl1 = e1->N_Elements();
|
||
+ ULong nEl2 = e2->N_Elements();
|
||
+
|
||
+ Data_<SpDByte>* res;
|
||
+
|
||
+ if( e1->Scalar())
|
||
+ {
|
||
+ if( e1->LogTrue(0))
|
||
+ {
|
||
+ res= new Data_<SpDByte>( e2->Dim(), BaseGDL::NOZERO);
|
||
+ for( SizeT i=0; i < nEl2; i++)
|
||
+ (*res)[i] = 1;
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ res= new Data_<SpDByte>( e2->Dim(), BaseGDL::NOZERO);
|
||
+ for( SizeT i=0; i < nEl2; i++)
|
||
+ (*res)[i] = e2->LogTrue( i) ? 1 : 0;
|
||
+ }
|
||
+ }
|
||
+ else if( e2->Scalar())
|
||
+ {
|
||
+ if( e2->LogTrue(0))
|
||
+ {
|
||
+ res= new Data_<SpDByte>( e1->Dim(), BaseGDL::NOZERO);
|
||
+ for( SizeT i=0; i < nEl1; i++)
|
||
+ (*res)[i] = 1;
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ res= new Data_<SpDByte>( e1->Dim(), BaseGDL::NOZERO);
|
||
+ for( SizeT i=0; i < nEl1; i++)
|
||
+ (*res)[i] = e1->LogTrue( i) ? 1 : 0;
|
||
+ }
|
||
+ }
|
||
+ else if( nEl2 < nEl1)
|
||
+ {
|
||
+ res= new Data_<SpDByte>( e2->Dim(), BaseGDL::NOZERO);
|
||
+ for( SizeT i=0; i < nEl2; i++)
|
||
+ (*res)[i] = (e1->LogTrue( i) || e2->LogTrue( i)) ? 1 : 0;
|
||
+ }
|
||
+ else // ( nEl2 >= nEl1)
|
||
+ {
|
||
+ res= new Data_<SpDByte>( e1->Dim(), BaseGDL::NOZERO);
|
||
+ for( SizeT i=0; i < nEl1; i++)
|
||
+ (*res)[i] = (e1->LogTrue( i) || e2->LogTrue( i)) ? 1 : 0;
|
||
+ }
|
||
+ return res;
|
||
+ }
|
||
+
|
||
+ BaseGDL* logical_true( EnvT* e)
|
||
+ {
|
||
+ SizeT nParam=e->NParam();
|
||
+ if( nParam != 1)
|
||
+ throw GDLException( e->CallingNode(),
|
||
+ "LOGICAL_TRUE: Incorrect number of arguments.");
|
||
+
|
||
+ BaseGDL* e1=e->GetParDefined( 0);//, "LOGICAL_TRUE");
|
||
+
|
||
+ ULong nEl1 = e1->N_Elements();
|
||
+
|
||
+ Data_<SpDByte>* res = new Data_<SpDByte>( e1->Dim(), BaseGDL::NOZERO);
|
||
+ for( SizeT i=0; i < nEl1; i++)
|
||
+ (*res)[i] = e1->LogTrue( i) ? 1 : 0;
|
||
+
|
||
+ return res;
|
||
+ }
|
||
+
|
||
+ BaseGDL* replicate( EnvT* e)
|
||
+ {
|
||
+ SizeT nParam=e->NParam();
|
||
+ if( nParam < 2)
|
||
+ e->Throw( "Incorrect number of arguments.");
|
||
+ dimension dim;
|
||
+ arr( e, dim, 1);
|
||
+
|
||
+ BaseGDL* p0=e->GetParDefined( 0);//, "REPLICATE");
|
||
+ if( !p0->Scalar())
|
||
+ e->Throw( "Expression must be a scalar in this context: "+
|
||
+ e->GetParString(0));
|
||
+
|
||
+ return p0->New( dim, BaseGDL::INIT);
|
||
+ }
|
||
+
|
||
+ BaseGDL* strtrim( EnvT* e)
|
||
+ {
|
||
+ SizeT nParam = e->NParam( 1);//, "STRTRIM");
|
||
+
|
||
+ BaseGDL* p0 = e->GetPar( 0);
|
||
+ if( p0 == NULL)
|
||
+ throw GDLException( e->CallingNode(),
|
||
+ "STRTRIM: Variable is undefined: "+
|
||
+ e->GetParString(0));
|
||
+ DStringGDL* p0S = static_cast<DStringGDL*>
|
||
+ (p0->Convert2(STRING,BaseGDL::COPY));
|
||
+
|
||
+ DLong mode = 0;
|
||
+ if( nParam == 2)
|
||
+ {
|
||
+ BaseGDL* p1 = e->GetPar( 1);
|
||
+ if( p1 == NULL)
|
||
+ throw GDLException( e->CallingNode(),
|
||
+ "Variable is undefined: "+e->GetParString(1));
|
||
+ if( !p1->Scalar())
|
||
+ throw GDLException( e->CallingNode(),
|
||
+ "STRTRIM: Expression must be a "
|
||
+ "scalar in this context: "+
|
||
+ e->GetParString(1));
|
||
+ DLongGDL* p1L = static_cast<DLongGDL*>
|
||
+ (p1->Convert2(LONG,BaseGDL::COPY));
|
||
+
|
||
+ mode = (*p1L)[ 0];
|
||
+
|
||
+ delete p1L;
|
||
+
|
||
+ if( mode < 0 || mode > 2)
|
||
+ {
|
||
+ ostringstream os;
|
||
+ p1->ToStream( os);
|
||
+ throw GDLException( e->CallingNode(),
|
||
+ "STRTRIM: Value of <"+ p1->TypeStr() +
|
||
+ " ("+os.str()+
|
||
+ ")> is out of allowed range.");
|
||
+ }
|
||
+ }
|
||
+
|
||
+ SizeT nEl = p0S->N_Elements();
|
||
+
|
||
+ if( mode == 2) // both
|
||
+ for( SizeT i=0; i<nEl; ++i)
|
||
+ {
|
||
+ unsigned long first= (*p0S)[ i].find_first_not_of(" \t");
|
||
+ if( first == (*p0S)[ i].npos)
|
||
+ {
|
||
+ (*p0S)[ i] = "";
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ unsigned long last = (*p0S)[ i].find_last_not_of(" \t");
|
||
+ (*p0S)[ i] = (*p0S)[ i].substr(first,last-first+1);
|
||
+ }
|
||
+ }
|
||
+ else if( mode == 1) // leading
|
||
+ for( SizeT i=0; i<nEl; ++i)
|
||
+ {
|
||
+ unsigned long first= (*p0S)[ i].find_first_not_of(" \t");
|
||
+ if( first == (*p0S)[ i].npos)
|
||
+ {
|
||
+ (*p0S)[ i] = "";
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ (*p0S)[ i] = (*p0S)[ i].substr(first);
|
||
+ }
|
||
+ }
|
||
+ else // trailing
|
||
+ for( SizeT i=0; i<nEl; ++i)
|
||
+ {
|
||
+ unsigned long last = (*p0S)[ i].find_last_not_of(" \t");
|
||
+ if( last == (*p0S)[ i].npos)
|
||
+ {
|
||
+ (*p0S)[ i] = "";
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ (*p0S)[ i] = (*p0S)[ i].substr(0,last+1);
|
||
+ }
|
||
+ }
|
||
+
|
||
+ return p0S;
|
||
+ }
|
||
+
|
||
+ BaseGDL* strcompress( EnvT* e)
|
||
+ {
|
||
+ e->NParam( 1);
|
||
+
|
||
+ DStringGDL* p0S = e->GetParAs<DStringGDL>( 0);
|
||
+
|
||
+ bool removeAll = e->KeywordSet(0);
|
||
+
|
||
+ DStringGDL* res = new DStringGDL( p0S->Dim(), BaseGDL::NOZERO);
|
||
+
|
||
+ SizeT nEl = p0S->N_Elements();
|
||
+ for( SizeT i=0; i<nEl; ++i)
|
||
+ {
|
||
+ (*res)[ i] = StrCompress((*p0S)[ i], removeAll);
|
||
+ }
|
||
+
|
||
+ return res;
|
||
+ }
|
||
+
|
||
+ BaseGDL* strpos( EnvT* e)
|
||
+ {
|
||
+ e->NParam( 2);//, "STRPOS");
|
||
+
|
||
+ bool reverseOffset = e->KeywordSet(0); // REVERSE_OFFSET
|
||
+ bool reverseSearch = e->KeywordSet(1); // REVERSE_SEARCH
|
||
+
|
||
+ DStringGDL* p0S = e->GetParAs<DStringGDL>( 0);
|
||
+
|
||
+ DString searchString;
|
||
+ // e->AssureScalarPar<DStringGDL>( 1, searchString);
|
||
+ DStringGDL* sStr = e->GetParAs<DStringGDL>( 1);
|
||
+ if( !sStr->Scalar( searchString))
|
||
+ e->Throw( "Search string must be a scalar or one element array: "+
|
||
+ e->GetParString( 1));
|
||
+
|
||
+ DLong pos = string::npos;
|
||
+ BaseGDL* p2 = e->GetPar( 2);
|
||
+ if( p2 != NULL) e->AssureLongScalarPar( 2, pos);
|
||
+
|
||
+ DLongGDL* res = new DLongGDL( p0S->Dim(), BaseGDL::NOZERO);
|
||
+
|
||
+ SizeT nSrcStr = p0S->N_Elements();
|
||
+ for( long i=0; i<nSrcStr; ++i)
|
||
+ {
|
||
+ (*res)[ i] = StrPos((*p0S)[ i], searchString, pos,
|
||
+ reverseOffset, reverseSearch);
|
||
+ }
|
||
+
|
||
+ return res;
|
||
+ }
|
||
+
|
||
+ BaseGDL* strmid( EnvT* e)
|
||
+ {
|
||
+ e->NParam( 2);//, "STRMID");
|
||
+
|
||
+ bool reverse = e->KeywordSet(0);
|
||
+
|
||
+ DStringGDL* p0S = e->GetParAs<DStringGDL>( 0);
|
||
+ DLongGDL* p1L = e->GetParAs<DLongGDL>( 1);
|
||
+
|
||
+ BaseGDL* p2 = e->GetPar( 2);
|
||
+ DLongGDL* p2L = NULL;
|
||
+ if( p2 != NULL) p2L = e->GetParAs<DLongGDL>( 2);
|
||
+
|
||
+ DLong scVal1;
|
||
+ bool sc1 = p1L->Scalar( scVal1);
|
||
+
|
||
+ DLong scVal2 = string::npos;
|
||
+ bool sc2 = true;
|
||
+ if( p2L != NULL) sc2 = p2L->Scalar( scVal2);
|
||
+
|
||
+ DLong stride;
|
||
+ if( !sc1 && !sc2)
|
||
+ {
|
||
+ stride = p1L->Dim( 0);
|
||
+ if( stride != p2L->Dim( 0))
|
||
+ throw GDLException( e->CallingNode(),
|
||
+ "STRMID: Starting offset and Length arguments "
|
||
+ "have incompatible first dimension.");
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ // at least one scalar, p2L possibly NULL
|
||
+ if( p2L == NULL)
|
||
+ stride = p1L->Dim( 0);
|
||
+ else
|
||
+ stride = max( p1L->Dim( 0), p2L->Dim( 0));
|
||
+
|
||
+ stride = (stride > 0)? stride : 1;
|
||
+ }
|
||
+
|
||
+ dimension resDim( p0S->Dim());
|
||
+ if( stride > 1)
|
||
+ resDim >> stride;
|
||
+
|
||
+ DStringGDL* res = new DStringGDL( resDim, BaseGDL::NOZERO);
|
||
+
|
||
+ SizeT nEl1 = p1L->N_Elements();
|
||
+ SizeT nEl2 = (sc2)? 1 : p2L->N_Elements();
|
||
+
|
||
+ SizeT nSrcStr = p0S->N_Elements();
|
||
+ for( long i=0; i<nSrcStr; ++i)
|
||
+ {
|
||
+ for( long ii=0; ii<stride; ++ii)
|
||
+ {
|
||
+ SizeT destIx = i * stride + ii;
|
||
+ DLong actFirst = (sc1)? scVal1 : (*p1L)[ destIx % nEl1];
|
||
+ DLong actLen = (sc2)? scVal2 : (*p2L)[ destIx % nEl2];
|
||
+ (*res)[ destIx] = StrMid((*p0S)[ i], actFirst, actLen, reverse);
|
||
+ }
|
||
+ }
|
||
+
|
||
+ return res;
|
||
+ }
|
||
+
|
||
+ BaseGDL* strlowcase( EnvT* e)
|
||
+ {
|
||
+ e->NParam( 1);//, "STRLOWCASE");
|
||
+
|
||
+ DStringGDL* p0S = e->GetParAs<DStringGDL>( 0);
|
||
+
|
||
+ DStringGDL* res = new DStringGDL( p0S->Dim(), BaseGDL::NOZERO);
|
||
+
|
||
+ SizeT nEl = p0S->N_Elements();
|
||
+ for( SizeT i=0; i<nEl; ++i)
|
||
+ {
|
||
+ (*res)[ i] = StrLowCase((*p0S)[ i]);
|
||
+ }
|
||
+
|
||
+ return res;
|
||
+ }
|
||
+
|
||
+ BaseGDL* strupcase( EnvT* e)
|
||
+ {
|
||
+ e->NParam( 1);//, "STRUPCASE");
|
||
+
|
||
+ DStringGDL* p0S = e->GetParAs<DStringGDL>( 0);
|
||
+
|
||
+ DStringGDL* res = new DStringGDL( p0S->Dim(), BaseGDL::NOZERO);
|
||
+
|
||
+ SizeT nEl = p0S->N_Elements();
|
||
+ for( SizeT i=0; i<nEl; ++i)
|
||
+ {
|
||
+ (*res)[ i] = StrUpCase((*p0S)[ i]);
|
||
+ }
|
||
+
|
||
+ return res;
|
||
+ }
|
||
+
|
||
+ BaseGDL* strlen( EnvT* e)
|
||
+ {
|
||
+ e->NParam( 1);//, "STRLEN");
|
||
+
|
||
+ DStringGDL* p0S = e->GetParAs<DStringGDL>( 0);
|
||
+
|
||
+ DLongGDL* res = new DLongGDL( p0S->Dim(), BaseGDL::NOZERO);
|
||
+
|
||
+ SizeT nEl = p0S->N_Elements();
|
||
+ for( SizeT i=0; i<nEl; ++i)
|
||
+ {
|
||
+ (*res)[ i] = (*p0S)[ i].length();
|
||
+ }
|
||
+
|
||
+ return res;
|
||
+ }
|
||
+
|
||
+ BaseGDL* strjoin( EnvT* e)
|
||
+ {
|
||
+ SizeT nParam = e->NParam( 1);
|
||
+
|
||
+ DStringGDL* p0S = e->GetParAs<DStringGDL>( 0);
|
||
+ SizeT nEl = p0S->N_Elements();
|
||
+
|
||
+ DString delim = "";
|
||
+ if( nParam > 1)
|
||
+ e->AssureStringScalarPar( 1, delim);
|
||
+
|
||
+ bool single = e->KeywordSet( 0); // SINGLE
|
||
+
|
||
+ if( single)
|
||
+ {
|
||
+ DStringGDL* res = new DStringGDL( (*p0S)[0]);
|
||
+ DString& scl = (*res)[0];
|
||
+
|
||
+ for( SizeT i=1; i<nEl; ++i)
|
||
+ scl += delim + (*p0S)[i];
|
||
+
|
||
+ return res;
|
||
+ }
|
||
+
|
||
+ dimension resDim( p0S->Dim());
|
||
+ resDim.Purge();
|
||
+
|
||
+ SizeT stride = resDim.Stride( 1);
|
||
+
|
||
+ resDim.Remove( 0);
|
||
+
|
||
+ DStringGDL* res = new DStringGDL( resDim, BaseGDL::NOZERO);
|
||
+ for( SizeT src=0, dst=0; src<nEl; ++dst)
|
||
+ {
|
||
+ (*res)[ dst] = (*p0S)[ src++];
|
||
+ for(SizeT l=1; l<stride; ++l)
|
||
+ (*res)[ dst] += delim + (*p0S)[ src++];
|
||
+ }
|
||
+
|
||
+ return res;
|
||
+ }
|
||
+
|
||
+ BaseGDL* where( EnvT* e)
|
||
+ {
|
||
+ SizeT nParam = e->NParam( 1);//, "WHERE");
|
||
+
|
||
+ BaseGDL* p0 = e->GetParDefined( 0);//, "WHERE");
|
||
+
|
||
+ SizeT nEl = p0->N_Elements();
|
||
+
|
||
+ SizeT count;
|
||
+
|
||
+ DLong* ixList = p0->Where( e->KeywordPresent( 0), count);
|
||
+ ArrayGuard<DLong> guard( ixList);
|
||
+ SizeT nCount = nEl - count;
|
||
+
|
||
+ if( e->KeywordPresent( 0)) // COMPLEMENT
|
||
+ {
|
||
+ if( nCount == 0)
|
||
+ {
|
||
+ e->SetKW( 0, new DLongGDL( -1));
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ DLongGDL* cIxList = new DLongGDL( dimension( &nCount, 1),
|
||
+ BaseGDL::NOZERO);
|
||
+
|
||
+ SizeT cIx = nEl;
|
||
+ for( SizeT i=0; i<nCount; ++i)
|
||
+ (*cIxList)[ i] = ixList[ --cIx];
|
||
+
|
||
+ e->SetKW( 0, cIxList);
|
||
+ }
|
||
+ }
|
||
+
|
||
+ if( e->KeywordPresent( 1)) // NCOMPLEMENT
|
||
+ {
|
||
+ e->SetKW( 1, new DLongGDL( nCount));
|
||
+ }
|
||
+
|
||
+ if( nParam == 2)
|
||
+ {
|
||
+ e->SetPar( 1, new DLongGDL( count));
|
||
+ }
|
||
+
|
||
+ if( count == 0) return new DLongGDL( -1);
|
||
+
|
||
+ return new DLongGDL( ixList, count);
|
||
+
|
||
+ // DLongGDL* res = new DLongGDL( dimension( &count, 1),
|
||
+ // BaseGDL::NOZERO);
|
||
+ // for( SizeT i=0; i<count; ++i)
|
||
+ // (*res)[ i] = ixList[ i];
|
||
+
|
||
+ // return res;
|
||
+ }
|
||
+
|
||
+ BaseGDL* n_params( EnvT* e)
|
||
+ {
|
||
+ EnvUDT* caller = static_cast<EnvUDT*>(e->Caller());
|
||
+ if( caller == NULL) return new DLongGDL( 0);
|
||
+ DLong nP = caller->NParam();
|
||
+ if( caller->IsObject())
|
||
+ return new DLongGDL( nP-1); // "self" is not counted
|
||
+ return new DLongGDL( nP);
|
||
+ }
|
||
+
|
||
+ BaseGDL* keyword_set( EnvT* e)
|
||
+ {
|
||
+ e->NParam( 1);//, "KEYWORD_SET");
|
||
+
|
||
+ BaseGDL* p0 = e->GetPar( 0);
|
||
+ if( p0 == NULL) return new DIntGDL( 0);
|
||
+ if( !p0->Scalar()) return new DIntGDL( 1);
|
||
+ if( p0->Type() == STRUCT) return new DIntGDL( 1);
|
||
+ if( p0->LogTrue()) return new DIntGDL( 1);
|
||
+ return new DIntGDL( 0);
|
||
+ }
|
||
+
|
||
+ // passing 2nd argument by value is slightly better for float and double,
|
||
+ // but incur some overhead for the complex class.
|
||
+ template<class T> inline void AddOmitNaN(T& dest, T value)
|
||
+ { if (isfinite(value)) dest += value; }
|
||
+ template<class T> inline void AddOmitNaNCpx(T& dest, T value)
|
||
+ {
|
||
+ dest += T(isfinite(value.real())? value.real() : 0,
|
||
+ isfinite(value.imag())? value.imag() : 0);
|
||
+ }
|
||
+ template<> inline void AddOmitNaN(DComplex& dest, DComplex value)
|
||
+ { AddOmitNaNCpx<DComplex>(dest, value); }
|
||
+ template<> inline void AddOmitNaN(DComplexDbl& dest, DComplexDbl value)
|
||
+ { AddOmitNaNCpx<DComplexDbl>(dest, value); }
|
||
+
|
||
+ template<class T> inline void NaN2Zero(T& value)
|
||
+ { if (!isfinite(value)) value = 0; }
|
||
+ template<class T> inline void NaN2ZeroCpx(T& value)
|
||
+ {
|
||
+ value = T(isfinite(value.real())? value.real() : 0,
|
||
+ isfinite(value.imag())? value.imag() : 0);
|
||
+ }
|
||
+ template<> inline void NaN2Zero(DComplex& value)
|
||
+ { NaN2ZeroCpx< DComplex>(value); }
|
||
+ template<> inline void NaN2Zero(DComplexDbl& value)
|
||
+ { NaN2ZeroCpx< DComplexDbl>(value); }
|
||
+
|
||
+ // total over all elements
|
||
+ template<class T>
|
||
+ BaseGDL* total_template( T* src, bool omitNaN)
|
||
+ {
|
||
+ if (!omitNaN) return new T(src->Sum());
|
||
+ typename T::Ty sum = 0;
|
||
+ SizeT nEl = src->N_Elements();
|
||
+ for ( SizeT i=0; i<nEl; ++i)
|
||
+ {
|
||
+ AddOmitNaN(sum, (*src)[ i]);
|
||
+ }
|
||
+ return new T(sum);
|
||
+ }
|
||
+
|
||
+ // cumulative over all dims
|
||
+ template<typename T>
|
||
+ BaseGDL* total_cu_template( T* res, bool omitNaN)
|
||
+ {
|
||
+ SizeT nEl = res->N_Elements();
|
||
+ if (omitNaN)
|
||
+ {
|
||
+ for( SizeT i=0; i<nEl; ++i)
|
||
+ NaN2Zero((*res)[i]);
|
||
+ }
|
||
+ for( SizeT i=1,ii=0; i<nEl; ++i,++ii)
|
||
+ (*res)[i] += (*res)[ii];
|
||
+ return res;
|
||
+ }
|
||
+
|
||
+ // total over one dim
|
||
+ template< typename T>
|
||
+ BaseGDL* total_over_dim_template( T* src,
|
||
+ const dimension& srcDim,
|
||
+ SizeT sumDimIx,
|
||
+ bool omitNaN)
|
||
+ {
|
||
+ SizeT nEl = src->N_Elements();
|
||
+
|
||
+ // get dest dim and number of summations
|
||
+ dimension destDim = srcDim;
|
||
+ SizeT nSum = destDim.Remove( sumDimIx);
|
||
+
|
||
+ T* res = new T( destDim); // zero fields
|
||
+
|
||
+ // sumStride is also the number of linear src indexing
|
||
+ SizeT sumStride = srcDim.Stride( sumDimIx);
|
||
+ SizeT outerStride = srcDim.Stride( sumDimIx + 1);
|
||
+ SizeT sumLimit = nSum * sumStride;
|
||
+ SizeT rIx=0;
|
||
+ for( SizeT o=0; o < nEl; o += outerStride)
|
||
+ for( SizeT i=0; i < sumStride; ++i)
|
||
+ {
|
||
+ SizeT oi = o+i;
|
||
+ SizeT oiLimit = sumLimit + oi;
|
||
+ if( omitNaN)
|
||
+ {
|
||
+ for( SizeT s=oi; s<oiLimit; s += sumStride)
|
||
+ AddOmitNaN((*res)[ rIx], (*src)[ s]);
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ for( SizeT s=oi; s<oiLimit; s += sumStride)
|
||
+ (*res)[ rIx] += (*src)[ s];
|
||
+ }
|
||
+ ++rIx;
|
||
+ }
|
||
+ return res;
|
||
+ }
|
||
+
|
||
+ // cumulative over one dim
|
||
+ template< typename T>
|
||
+ BaseGDL* total_over_dim_cu_template( T* res,
|
||
+ SizeT sumDimIx,
|
||
+ bool omitNaN)
|
||
+ {
|
||
+ SizeT nEl = res->N_Elements();
|
||
+ const dimension& resDim = res->Dim();
|
||
+ if (omitNaN)
|
||
+ {
|
||
+ for( SizeT i=0; i<nEl; ++i)
|
||
+ NaN2Zero((*res)[i]);
|
||
+ }
|
||
+ SizeT cumStride = resDim.Stride( sumDimIx);
|
||
+ SizeT outerStride = resDim.Stride( sumDimIx + 1);
|
||
+ for( SizeT o=0; o < nEl; o += outerStride)
|
||
+ {
|
||
+ SizeT cumLimit = o+outerStride;
|
||
+ for( SizeT i=o+cumStride, ii=o; i<cumLimit; ++i, ++ii)
|
||
+ (*res)[ i] += (*res)[ ii];
|
||
+ }
|
||
+ return res;
|
||
+ }
|
||
+
|
||
+
|
||
+ BaseGDL* total( EnvT* e)
|
||
+ {
|
||
+ SizeT nParam = e->NParam( 1);//, "TOTAL");
|
||
+
|
||
+ BaseGDL* p0 = e->GetParDefined( 0);//, "TOTAL");
|
||
+
|
||
+ SizeT nEl = p0->N_Elements();
|
||
+ if( nEl == 0)
|
||
+ e->Throw( "Variable is undefined: "+e->GetParString(0));
|
||
+
|
||
+ if( p0->Type() == STRING)
|
||
+ e->Throw( "String expression not allowed "
|
||
+ "in this context: "+e->GetParString(0));
|
||
+
|
||
+ static int cumIx = e->KeywordIx( "CUMULATIVE");
|
||
+ static int intIx = e->KeywordIx("INTEGER");
|
||
+ static int doubleIx = e->KeywordIx( "DOUBLE");
|
||
+ static int nanIx = e->KeywordIx( "NAN");
|
||
+
|
||
+ bool cumulative = e->KeywordSet( cumIx);
|
||
+ bool intRes = e->KeywordSet( intIx);
|
||
+ bool doubleRes = e->KeywordSet( doubleIx);
|
||
+ bool nan = e->KeywordSet( nanIx);
|
||
+
|
||
+ DLong sumDim = 0;
|
||
+ if( nParam == 2)
|
||
+ e->AssureLongScalarPar( 1, sumDim);
|
||
+
|
||
+ if( sumDim == 0)
|
||
+ {
|
||
+ if( !cumulative)
|
||
+ {
|
||
+
|
||
+ // Integer parts by Erin Sheldon
|
||
+ // In IDL total(), the INTEGER keyword takes precedence
|
||
+ if( intRes )
|
||
+ {
|
||
+ // We use LONG64 unless the input is ULONG64
|
||
+ if ( p0->Type() == LONG64 )
|
||
+ {
|
||
+ return total_template<DLong64GDL>
|
||
+ ( static_cast<DLong64GDL*>(p0), nan );
|
||
+ }
|
||
+ if ( p0->Type() == ULONG64 )
|
||
+ {
|
||
+ return total_template<DULong64GDL>
|
||
+ ( static_cast<DULong64GDL*>(p0), nan );
|
||
+ }
|
||
+
|
||
+ // Conver to Long64
|
||
+ DLong64GDL* p0L64 = static_cast<DLong64GDL*>
|
||
+ (p0->Convert2( LONG64, BaseGDL::COPY));
|
||
+ e->Guard( p0L64);
|
||
+ return total_template<DLong64GDL>( p0L64, nan);
|
||
+
|
||
+ } // integer results
|
||
+
|
||
+
|
||
+ if( p0->Type() == DOUBLE)
|
||
+ {
|
||
+ return total_template<DDoubleGDL>
|
||
+ ( static_cast<DDoubleGDL*>(p0), nan);
|
||
+ }
|
||
+ if( p0->Type() == COMPLEXDBL)
|
||
+ {
|
||
+ return total_template<DComplexDblGDL>
|
||
+ ( static_cast<DComplexDblGDL*>(p0), nan);
|
||
+ }
|
||
+
|
||
+ if( !doubleRes)
|
||
+ {
|
||
+ if( p0->Type() == FLOAT)
|
||
+ {
|
||
+ return total_template<DFloatGDL>
|
||
+ ( static_cast<DFloatGDL*>(p0), nan);
|
||
+ }
|
||
+ if( p0->Type() == COMPLEX)
|
||
+ {
|
||
+ return total_template<DComplexGDL>
|
||
+ ( static_cast<DComplexGDL*>(p0), nan);
|
||
+ }
|
||
+ DFloatGDL* p0F = static_cast<DFloatGDL*>
|
||
+ (p0->Convert2( FLOAT,BaseGDL::COPY));
|
||
+ e->Guard( p0F);
|
||
+ return total_template<DFloatGDL>( p0F, false);
|
||
+ }
|
||
+ if( p0->Type() == COMPLEX)
|
||
+ {
|
||
+ DComplexDblGDL* p0D = static_cast<DComplexDblGDL*>
|
||
+ (p0->Convert2( COMPLEXDBL,BaseGDL::COPY));
|
||
+ e->Guard( p0D);
|
||
+ return total_template<DComplexDblGDL>( p0D, nan);
|
||
+ }
|
||
+
|
||
+ DDoubleGDL* p0D = static_cast<DDoubleGDL*>
|
||
+ (p0->Convert2( DOUBLE, BaseGDL::COPY));
|
||
+ e->Guard( p0D);
|
||
+ return total_template<DDoubleGDL>( p0D, nan);
|
||
+ }
|
||
+ else // cumulative
|
||
+ {
|
||
+
|
||
+ // INTEGER keyword takes precedence
|
||
+ if( intRes )
|
||
+ {
|
||
+ // We use LONG64 unless the input is ULONG64
|
||
+ if ( p0->Type() == LONG64 )
|
||
+ {
|
||
+ return total_cu_template<DLong64GDL>
|
||
+ ( static_cast<DLong64GDL*>(p0)->Dup(), nan );
|
||
+ }
|
||
+ if ( p0->Type() == ULONG64 )
|
||
+ {
|
||
+ return total_cu_template<DULong64GDL>
|
||
+ ( static_cast<DULong64GDL*>(p0)->Dup(), nan );
|
||
+ }
|
||
+
|
||
+ // Convert to Long64
|
||
+ return total_cu_template<DLong64GDL>
|
||
+ ( static_cast<DLong64GDL*>
|
||
+ (p0->Convert2( LONG64, BaseGDL::COPY)), nan);
|
||
+
|
||
+ } // integer results
|
||
+
|
||
+
|
||
+ // special case as DOUBLE type overrides /DOUBLE
|
||
+ if( p0->Type() == DOUBLE)
|
||
+ {
|
||
+ return total_cu_template< DDoubleGDL>
|
||
+ ( static_cast<DDoubleGDL*>(p0)->Dup(), nan);
|
||
+ }
|
||
+ if( p0->Type() == COMPLEXDBL)
|
||
+ {
|
||
+ return total_cu_template< DComplexDblGDL>
|
||
+ ( static_cast<DComplexDblGDL*>(p0)->Dup(), nan);
|
||
+ }
|
||
+
|
||
+
|
||
+
|
||
+ if( !doubleRes)
|
||
+ {
|
||
+ // special case for FLOAT has no advantage here
|
||
+ if( p0->Type() == COMPLEX)
|
||
+ {
|
||
+ return total_cu_template< DComplexGDL>
|
||
+ ( static_cast<DComplexGDL*>(p0)->Dup(), nan);
|
||
+ }
|
||
+ return total_cu_template< DFloatGDL>
|
||
+ ( static_cast<DFloatGDL*>( p0->Convert2(FLOAT,
|
||
+ BaseGDL::COPY)), nan);
|
||
+ }
|
||
+ if( p0->Type() == COMPLEX)
|
||
+ {
|
||
+ return total_cu_template< DComplexDblGDL>
|
||
+ ( static_cast<DComplexDblGDL*>(p0->Convert2( COMPLEXDBL,
|
||
+ BaseGDL::COPY)), nan);
|
||
+ }
|
||
+ return total_cu_template< DDoubleGDL>
|
||
+ ( static_cast<DDoubleGDL*>(p0->Convert2( DOUBLE,
|
||
+ BaseGDL::COPY)), nan);
|
||
+ }
|
||
+ }
|
||
+
|
||
+ // total over sumDim
|
||
+ dimension srcDim = p0->Dim();
|
||
+ SizeT srcRank = srcDim.Rank();
|
||
+
|
||
+ if( sumDim < 1 || sumDim > srcRank)
|
||
+ throw GDLException( e->CallingNode(),
|
||
+ "TOTAL: Array must have "+i2s(sumDim)+
|
||
+ " dimensions: "+e->GetParString(0));
|
||
+
|
||
+ if( !cumulative)
|
||
+ {
|
||
+
|
||
+ // INTEGER keyword takes precedence
|
||
+ if( intRes )
|
||
+ {
|
||
+ // We use LONG64 unless the input is ULONG64
|
||
+ if ( p0->Type() == LONG64 )
|
||
+ {
|
||
+ return total_over_dim_template<DLong64GDL>
|
||
+ ( static_cast<DLong64GDL*>(p0), srcDim, sumDim-1, nan );
|
||
+ }
|
||
+ if ( p0->Type() == ULONG64 )
|
||
+ {
|
||
+ return total_over_dim_template<DULong64GDL>
|
||
+ ( static_cast<DULong64GDL*>(p0), srcDim, sumDim-1, nan );
|
||
+ }
|
||
+
|
||
+ // Conver to Long64
|
||
+ DLong64GDL* p0L64 = static_cast<DLong64GDL*>
|
||
+ (p0->Convert2( LONG64, BaseGDL::COPY));
|
||
+ e->Guard( p0L64);
|
||
+ return total_over_dim_template<DLong64GDL>
|
||
+ ( p0L64, srcDim, sumDim-1, nan);
|
||
+
|
||
+ } // integer results
|
||
+
|
||
+
|
||
+ if( p0->Type() == DOUBLE)
|
||
+ {
|
||
+ return total_over_dim_template< DDoubleGDL>
|
||
+ ( static_cast<DDoubleGDL*>(p0), srcDim, sumDim-1, nan);
|
||
+ }
|
||
+ if( p0->Type() == COMPLEXDBL)
|
||
+ {
|
||
+ return total_over_dim_template< DComplexDblGDL>
|
||
+ ( static_cast<DComplexDblGDL*>(p0), srcDim, sumDim-1, nan);
|
||
+ }
|
||
+ if( !doubleRes)
|
||
+ {
|
||
+ if( p0->Type() == FLOAT)
|
||
+ {
|
||
+ return total_over_dim_template< DFloatGDL>
|
||
+ ( static_cast<DFloatGDL*>(p0), srcDim, sumDim-1, nan);
|
||
+ }
|
||
+ if( p0->Type() == COMPLEX)
|
||
+ {
|
||
+ return total_over_dim_template< DComplexGDL>
|
||
+ ( static_cast<DComplexGDL*>(p0), srcDim, sumDim-1, nan);
|
||
+ }
|
||
+ // default for NOT /DOUBLE
|
||
+ DFloatGDL* p0F = static_cast<DFloatGDL*>
|
||
+ (p0->Convert2( FLOAT,BaseGDL::COPY));
|
||
+ e->Guard( p0F);
|
||
+ return total_over_dim_template< DFloatGDL>
|
||
+ ( p0F, srcDim, sumDim-1, false);
|
||
+ }
|
||
+ if( p0->Type() == COMPLEX)
|
||
+ {
|
||
+ DComplexDblGDL* p0D = static_cast<DComplexDblGDL*>
|
||
+ (p0->Convert2( COMPLEXDBL,BaseGDL::COPY));
|
||
+ e->Guard( p0D);
|
||
+ return total_over_dim_template< DComplexDblGDL>
|
||
+ ( p0D, srcDim, sumDim-1, nan);
|
||
+ }
|
||
+ // default for /DOUBLE
|
||
+ DDoubleGDL* p0D = static_cast<DDoubleGDL*>
|
||
+ (p0->Convert2( DOUBLE,BaseGDL::COPY));
|
||
+ e->Guard( p0D);
|
||
+ return total_over_dim_template< DDoubleGDL>( p0D, srcDim, sumDim-1,nan);
|
||
+ }
|
||
+ else // cumulative
|
||
+ {
|
||
+
|
||
+ // INTEGER keyword takes precedence
|
||
+ if( intRes )
|
||
+ {
|
||
+ // We use LONG64 unless the input is ULONG64
|
||
+ if ( p0->Type() == LONG64 )
|
||
+ {
|
||
+ return total_over_dim_cu_template<DLong64GDL>
|
||
+ ( static_cast<DLong64GDL*>(p0)->Dup(), sumDim-1, nan );
|
||
+ }
|
||
+ if ( p0->Type() == ULONG64 )
|
||
+ {
|
||
+ return total_over_dim_cu_template<DULong64GDL>
|
||
+ ( static_cast<DULong64GDL*>(p0)->Dup(), sumDim-1, nan );
|
||
+ }
|
||
+
|
||
+ // Convert to Long64
|
||
+ return total_over_dim_cu_template<DLong64GDL>
|
||
+ ( static_cast<DLong64GDL*>
|
||
+ (p0->Convert2( LONG64, BaseGDL::COPY)), sumDim-1, nan);
|
||
+
|
||
+ } // integer results
|
||
+
|
||
+
|
||
+ if( p0->Type() == DOUBLE)
|
||
+ {
|
||
+ return total_over_dim_cu_template< DDoubleGDL>
|
||
+ ( static_cast<DDoubleGDL*>(p0)->Dup(), sumDim-1, nan);
|
||
+ }
|
||
+ if( p0->Type() == COMPLEXDBL)
|
||
+ {
|
||
+ return total_over_dim_cu_template< DComplexDblGDL>
|
||
+ ( static_cast<DComplexDblGDL*>(p0)->Dup(), sumDim-1, nan);
|
||
+ }
|
||
+ if( !doubleRes)
|
||
+ {
|
||
+ // special case for FLOAT has no advantage here
|
||
+ if( p0->Type() == COMPLEX)
|
||
+ {
|
||
+ return total_over_dim_cu_template< DComplexGDL>
|
||
+ ( static_cast<DComplexGDL*>(p0)->Dup(), sumDim-1, nan);
|
||
+ }
|
||
+ // default for NOT /DOUBLE
|
||
+ return total_over_dim_cu_template< DFloatGDL>
|
||
+ ( static_cast<DFloatGDL*>( p0->Convert2( FLOAT,
|
||
+ BaseGDL::COPY)), sumDim-1, nan);
|
||
+ }
|
||
+ if( p0->Type() == COMPLEX)
|
||
+ {
|
||
+ return total_over_dim_cu_template< DComplexDblGDL>
|
||
+ ( static_cast<DComplexDblGDL*>(p0->Convert2( COMPLEXDBL,
|
||
+ BaseGDL::COPY)), sumDim-1, nan);
|
||
+ }
|
||
+ // default for /DOUBLE
|
||
+ return total_over_dim_cu_template< DDoubleGDL>
|
||
+ ( static_cast<DDoubleGDL*>(p0->Convert2( DOUBLE,
|
||
+ BaseGDL::COPY)), sumDim-1, nan);
|
||
+ }
|
||
+ }
|
||
+
|
||
+
|
||
+ // passing 2nd argument by value is slightly better for float and double,
|
||
+ // but incur some overhead for the complex class.
|
||
+ template<class T> inline void MultOmitNaN(T& dest, T value)
|
||
+ { if (isfinite(value)) dest *= value; }
|
||
+ template<class T> inline void MultOmitNaNCpx(T& dest, T value)
|
||
+ {
|
||
+ dest *= T(isfinite(value.real())? value.real() : 1,
|
||
+ isfinite(value.imag())? value.imag() : 1);
|
||
+ }
|
||
+ template<> inline void MultOmitNaN(DComplex& dest, DComplex value)
|
||
+ { MultOmitNaNCpx<DComplex>(dest, value); }
|
||
+ template<> inline void MultOmitNaN(DComplexDbl& dest, DComplexDbl value)
|
||
+ { MultOmitNaNCpx<DComplexDbl>(dest, value); }
|
||
+
|
||
+ template<class T> inline void Nan2One(T& value)
|
||
+ { if (!isfinite(value)) value = 1; }
|
||
+ template<class T> inline void Nan2OneCpx(T& value)
|
||
+ {
|
||
+ value = T(isfinite(value.real())? value.real() : 1,
|
||
+ isfinite(value.imag())? value.imag() : 1);
|
||
+ }
|
||
+ template<> inline void Nan2One(DComplex& value)
|
||
+ { Nan2OneCpx< DComplex>(value); }
|
||
+ template<> inline void Nan2One(DComplexDbl& value)
|
||
+ { Nan2OneCpx< DComplexDbl>(value); }
|
||
+
|
||
+ // product over all elements
|
||
+ template<class T>
|
||
+ BaseGDL* product_template( T* src, bool omitNaN)
|
||
+ {
|
||
+ typename T::Ty sum = 1;
|
||
+ SizeT nEl = src->N_Elements();
|
||
+ if( !omitNaN)
|
||
+ for ( SizeT i=0; i<nEl; ++i)
|
||
+ {
|
||
+ sum *= (*src)[ i];
|
||
+ }
|
||
+ else
|
||
+ for ( SizeT i=0; i<nEl; ++i)
|
||
+ {
|
||
+ MultOmitNaN( sum, (*src)[ i]);
|
||
+ }
|
||
+ return new T( sum);
|
||
+ }
|
||
+
|
||
+ // cumulative over all dims
|
||
+ template<typename T>
|
||
+ BaseGDL* product_cu_template( T* res, bool omitNaN)
|
||
+ {
|
||
+ SizeT nEl = res->N_Elements();
|
||
+ if( omitNaN)
|
||
+ {
|
||
+ for( SizeT i=0; i<nEl; ++i)
|
||
+ Nan2One( (*res)[i]);
|
||
+ }
|
||
+ for( SizeT i=1,ii=0; i<nEl; ++i,++ii)
|
||
+ (*res)[i] *= (*res)[ii];
|
||
+ return res;
|
||
+ }
|
||
+
|
||
+ // product over one dim
|
||
+ template< typename T>
|
||
+ BaseGDL* product_over_dim_template( T* src,
|
||
+ const dimension& srcDim,
|
||
+ SizeT sumDimIx,
|
||
+ bool omitNaN)
|
||
+ {
|
||
+ SizeT nEl = src->N_Elements();
|
||
+
|
||
+ // get dest dim and number of summations
|
||
+ dimension destDim = srcDim;
|
||
+ SizeT nSum = destDim.Remove( sumDimIx);
|
||
+
|
||
+ T* res = new T( destDim, BaseGDL::NOZERO);
|
||
+
|
||
+ // sumStride is also the number of linear src indexing
|
||
+ SizeT sumStride = srcDim.Stride( sumDimIx);
|
||
+ SizeT outerStride = srcDim.Stride( sumDimIx + 1);
|
||
+ SizeT sumLimit = nSum * sumStride;
|
||
+ SizeT rIx=0;
|
||
+ for( SizeT o=0; o < nEl; o += outerStride)
|
||
+ for( SizeT i=0; i < sumStride; ++i)
|
||
+ {
|
||
+ (*res)[ rIx] = 1;
|
||
+ SizeT oi = o+i;
|
||
+ SizeT oiLimit = sumLimit + oi;
|
||
+ if( omitNaN)
|
||
+ {
|
||
+ for( SizeT s=oi; s<oiLimit; s += sumStride)
|
||
+ MultOmitNaN((*res)[ rIx], (*src)[ s]);
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ for( SizeT s=oi; s<oiLimit; s += sumStride)
|
||
+ (*res)[ rIx] *= (*src)[ s];
|
||
+ }
|
||
+ ++rIx;
|
||
+ }
|
||
+ return res;
|
||
+ }
|
||
+
|
||
+ // cumulative over one dim
|
||
+ template< typename T>
|
||
+ BaseGDL* product_over_dim_cu_template( T* res,
|
||
+ SizeT sumDimIx,
|
||
+ bool omitNaN)
|
||
+ {
|
||
+ SizeT nEl = res->N_Elements();
|
||
+ const dimension& resDim = res->Dim();
|
||
+ if (omitNaN)
|
||
+ {
|
||
+ for( SizeT i=0; i<nEl; ++i)
|
||
+ Nan2One((*res)[i]);
|
||
+ }
|
||
+ SizeT cumStride = resDim.Stride( sumDimIx);
|
||
+ SizeT outerStride = resDim.Stride( sumDimIx + 1);
|
||
+ for( SizeT o=0; o < nEl; o += outerStride)
|
||
+ {
|
||
+ SizeT cumLimit = o+outerStride;
|
||
+ for( SizeT i=o+cumStride, ii=o; i<cumLimit; ++i, ++ii)
|
||
+ (*res)[ i] *= (*res)[ ii];
|
||
+ }
|
||
+ return res;
|
||
+ }
|
||
+
|
||
+ BaseGDL* product( EnvT* e)
|
||
+ {
|
||
+ SizeT nParam = e->NParam( 1);
|
||
+
|
||
+ BaseGDL* p0 = e->GetParDefined( 0);
|
||
+
|
||
+ SizeT nEl = p0->N_Elements();
|
||
+ if( nEl == 0)
|
||
+ e->Throw( "Variable is undefined: "+e->GetParString(0));
|
||
+
|
||
+ if( p0->Type() == STRING)
|
||
+ e->Throw( "String expression not allowed "
|
||
+ "in this context: "+e->GetParString(0));
|
||
+
|
||
+ static int cumIx = e->KeywordIx( "CUMULATIVE");
|
||
+ static int nanIx = e->KeywordIx( "NAN");
|
||
+ bool cumulative = e->KeywordSet( cumIx);
|
||
+ bool nan = e->KeywordSet( nanIx);
|
||
+
|
||
+ DLong sumDim = 0;
|
||
+ if( nParam == 2)
|
||
+ e->AssureLongScalarPar( 1, sumDim);
|
||
+
|
||
+ if( sumDim == 0)
|
||
+ {
|
||
+ if( !cumulative)
|
||
+ {
|
||
+ if( p0->Type() == DOUBLE)
|
||
+ {
|
||
+ return product_template<DDoubleGDL>
|
||
+ ( static_cast<DDoubleGDL*>(p0), nan);
|
||
+ }
|
||
+ if( p0->Type() == COMPLEXDBL)
|
||
+ {
|
||
+ return product_template<DComplexDblGDL>
|
||
+ ( static_cast<DComplexDblGDL*>(p0), nan);
|
||
+ }
|
||
+ if( p0->Type() == COMPLEX)
|
||
+ {
|
||
+ DComplexDblGDL* p0D = static_cast<DComplexDblGDL*>
|
||
+ (p0->Convert2( COMPLEXDBL,BaseGDL::COPY));
|
||
+ e->Guard( p0D);
|
||
+ return product_template<DComplexDblGDL>( p0D, nan);
|
||
+ }
|
||
+
|
||
+ DDoubleGDL* p0D = static_cast<DDoubleGDL*>
|
||
+ (p0->Convert2( DOUBLE, BaseGDL::COPY));
|
||
+ e->Guard( p0D);
|
||
+ return product_template<DDoubleGDL>( p0D, nan);
|
||
+ }
|
||
+ else // cumulative
|
||
+ {
|
||
+ // special case as DOUBLE type overrides /DOUBLE
|
||
+ if( p0->Type() == DOUBLE)
|
||
+ {
|
||
+ return product_cu_template< DDoubleGDL>
|
||
+ ( static_cast<DDoubleGDL*>(p0)->Dup(), nan);
|
||
+ }
|
||
+ if( p0->Type() == COMPLEXDBL)
|
||
+ {
|
||
+ return product_cu_template< DComplexDblGDL>
|
||
+ ( static_cast<DComplexDblGDL*>(p0)->Dup(), nan);
|
||
+ }
|
||
+ if( p0->Type() == COMPLEX)
|
||
+ {
|
||
+ return product_cu_template< DComplexDblGDL>
|
||
+ ( static_cast<DComplexDblGDL*>(p0->Convert2( COMPLEXDBL,
|
||
+ BaseGDL::COPY)), nan);
|
||
+ }
|
||
+ return product_cu_template< DDoubleGDL>
|
||
+ ( static_cast<DDoubleGDL*>(p0->Convert2( DOUBLE,
|
||
+ BaseGDL::COPY)), nan);
|
||
+ }
|
||
+ }
|
||
+
|
||
+ // product over sumDim
|
||
+ dimension srcDim = p0->Dim();
|
||
+ SizeT srcRank = srcDim.Rank();
|
||
+
|
||
+ if( sumDim < 1 || sumDim > srcRank)
|
||
+ e->Throw( "Array must have "+i2s(sumDim)+
|
||
+ " dimensions: "+e->GetParString(0));
|
||
+
|
||
+ if( !cumulative)
|
||
+ {
|
||
+ if( p0->Type() == DOUBLE)
|
||
+ {
|
||
+ return product_over_dim_template< DDoubleGDL>
|
||
+ ( static_cast<DDoubleGDL*>(p0), srcDim, sumDim-1, nan);
|
||
+ }
|
||
+ if( p0->Type() == COMPLEXDBL)
|
||
+ {
|
||
+ return product_over_dim_template< DComplexDblGDL>
|
||
+ ( static_cast<DComplexDblGDL*>(p0), srcDim, sumDim-1, nan);
|
||
+ }
|
||
+ if( p0->Type() == COMPLEX)
|
||
+ {
|
||
+ DComplexDblGDL* p0D = static_cast<DComplexDblGDL*>
|
||
+ (p0->Convert2( COMPLEXDBL,BaseGDL::COPY));
|
||
+ e->Guard( p0D);
|
||
+ return product_over_dim_template< DComplexDblGDL>
|
||
+ ( p0D, srcDim, sumDim-1, nan);
|
||
+ }
|
||
+
|
||
+ DDoubleGDL* p0D = static_cast<DDoubleGDL*>
|
||
+ (p0->Convert2( DOUBLE,BaseGDL::COPY));
|
||
+ e->Guard( p0D);
|
||
+ return product_over_dim_template< DDoubleGDL>( p0D, srcDim, sumDim-1,nan);
|
||
+ }
|
||
+ else // cumulative
|
||
+ {
|
||
+ if( p0->Type() == DOUBLE)
|
||
+ {
|
||
+ return product_over_dim_cu_template< DDoubleGDL>
|
||
+ ( static_cast<DDoubleGDL*>(p0)->Dup(), sumDim-1, nan);
|
||
+ }
|
||
+ if( p0->Type() == COMPLEXDBL)
|
||
+ {
|
||
+ return product_over_dim_cu_template< DComplexDblGDL>
|
||
+ ( static_cast<DComplexDblGDL*>(p0)->Dup(), sumDim-1, nan);
|
||
+ }
|
||
+ if( p0->Type() == COMPLEX)
|
||
+ {
|
||
+ return product_over_dim_cu_template< DComplexDblGDL>
|
||
+ ( static_cast<DComplexDblGDL*>(p0->Convert2( COMPLEXDBL,
|
||
+ BaseGDL::COPY)), sumDim-1, nan);
|
||
+ }
|
||
+
|
||
+ return product_over_dim_cu_template< DDoubleGDL>
|
||
+ ( static_cast<DDoubleGDL*>(p0->Convert2( DOUBLE,
|
||
+ BaseGDL::COPY)), sumDim-1, nan);
|
||
+ }
|
||
+ }
|
||
+
|
||
+ BaseGDL* array_equal( EnvT* e)
|
||
+ {
|
||
+ e->NParam( 2);//, "ARRAY_EQUAL");
|
||
+
|
||
+ BaseGDL* p0 = e->GetParDefined( 0);//, "ARRAY_EQUAL");
|
||
+ BaseGDL* p1 = e->GetParDefined( 1);//, "ARRAY_EQUAL");
|
||
+
|
||
+ if( p0 == p1) return new DByteGDL( 1);
|
||
+
|
||
+ SizeT nEl0 = p0->N_Elements();
|
||
+ SizeT nEl1 = p1->N_Elements();
|
||
+ if( nEl0 != nEl1 && nEl0 != 1 && nEl1 != 1)
|
||
+ return new DByteGDL( 0);
|
||
+
|
||
+ if( p0->Type() != p1->Type())
|
||
+ {
|
||
+ if( e->KeywordSet( 0)) // NO_TYPECONV
|
||
+ return new DByteGDL( 0);
|
||
+ else
|
||
+ {
|
||
+ DType aTy=p0->Type();
|
||
+ DType bTy=p1->Type();
|
||
+ if( DTypeOrder[aTy] >= DTypeOrder[bTy])
|
||
+ {
|
||
+ p1 = p1->Convert2( aTy, BaseGDL::COPY);
|
||
+ e->Guard( p1);
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ p0 = p0->Convert2( bTy, BaseGDL::COPY);
|
||
+ e->Guard( p0);
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+
|
||
+ if( p0->ArrayEqual( p1)) return new DByteGDL( 1);
|
||
+
|
||
+ return new DByteGDL( 0);
|
||
+ }
|
||
+
|
||
+ BaseGDL* min_fun( EnvT* e)
|
||
+ {
|
||
+ SizeT nParam = e->NParam( 1);
|
||
+
|
||
+ BaseGDL* searchArr = e->GetParDefined( 0);
|
||
+
|
||
+ DLong minEl;
|
||
+ BaseGDL* res;
|
||
+ // bool omitNaN = e->KeywordPresent( 1); // NAN keyword
|
||
+ bool omitNaN = e->KeywordSet( "NAN");
|
||
+
|
||
+ bool subMax = e->KeywordPresent( 2); // SUBSCRIPT_MAX present
|
||
+
|
||
+ if( nParam == 2)
|
||
+ e->AssureGlobalPar( 1);
|
||
+
|
||
+ if( e->KeywordPresent( 0)) // MAX keyword given
|
||
+ {
|
||
+ e->AssureGlobalKW( 0);
|
||
+ delete e->GetKW( 0);
|
||
+
|
||
+ DLong maxEl;
|
||
+
|
||
+ searchArr->MinMax( &minEl, &maxEl, &res, &e->GetKW( 0), omitNaN);
|
||
+ if ( subMax)
|
||
+ {
|
||
+ e->SetKW( 2, new DLongGDL(maxEl));
|
||
+ }
|
||
+ }
|
||
+ else // no MAX keyword
|
||
+ {
|
||
+ if( subMax)
|
||
+ {
|
||
+ DLong maxEl;
|
||
+ searchArr->MinMax( &minEl, &maxEl, &res, NULL, omitNaN);
|
||
+ e->SetKW( 2, new DLongGDL(maxEl));
|
||
+ }
|
||
+ else
|
||
+ searchArr->MinMax( &minEl, NULL, &res, NULL, omitNaN);
|
||
+ }
|
||
+
|
||
+ // handle index
|
||
+ if( nParam == 2)
|
||
+ {
|
||
+ delete e->GetPar( 1);
|
||
+ e->GetPar( 1) = new DLongGDL( minEl);
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ SysVar::SetC( minEl);
|
||
+ }
|
||
+ return res;
|
||
+ }
|
||
+
|
||
+ BaseGDL* max_fun( EnvT* e)
|
||
+ {
|
||
+ SizeT nParam = e->NParam( 1);
|
||
+
|
||
+ BaseGDL* searchArr = e->GetParDefined( 0);
|
||
+
|
||
+ DLong maxEl;
|
||
+ BaseGDL* res;
|
||
+ //bool omitNaN = e->KeywordPresent( 1); // NAN keyword
|
||
+ bool omitNaN = e->KeywordSet( "NAN");
|
||
+
|
||
+ bool subMin = e->KeywordPresent( 2); // SUBSCRIPT_MIN present
|
||
+
|
||
+ if( nParam == 2)
|
||
+ e->AssureGlobalPar( 1);
|
||
+
|
||
+ if( e->KeywordPresent( 0)) // MIN keyword given
|
||
+ {
|
||
+ e->AssureGlobalKW( 0);
|
||
+ delete e->GetKW( 0);
|
||
+
|
||
+ DLong minEl;
|
||
+
|
||
+ searchArr->MinMax( &minEl, &maxEl, &e->GetKW( 0), &res, omitNaN);
|
||
+ if( subMin)
|
||
+ {
|
||
+ e->SetKW( 2, new DLongGDL(minEl));
|
||
+ }
|
||
+ }
|
||
+ else // no MIN keyword
|
||
+ {
|
||
+ if( subMin)
|
||
+ {
|
||
+ DLong minEl;
|
||
+ searchArr->MinMax( &minEl, &maxEl, NULL, &res, omitNaN);
|
||
+ e->SetKW( 2, new DLongGDL(minEl));
|
||
+ }
|
||
+ else
|
||
+ searchArr->MinMax( NULL, &maxEl, NULL, &res, omitNaN);
|
||
+ }
|
||
+
|
||
+ // handle index
|
||
+ if( nParam == 2)
|
||
+ {
|
||
+ delete e->GetPar( 1);
|
||
+ e->GetPar( 1) = new DLongGDL( maxEl);
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ SysVar::SetC( maxEl);
|
||
+ }
|
||
+
|
||
+ return res;
|
||
+ }
|
||
+
|
||
+ BaseGDL* transpose( EnvT* e)
|
||
+ {
|
||
+ SizeT nParam=e->NParam( 1);
|
||
+
|
||
+ BaseGDL* p0 = e->GetParDefined( 0);
|
||
+ if( p0->Type() == STRUCT)
|
||
+ e->Throw("Struct expression not allowed in this context: "+
|
||
+ e->GetParString(0));
|
||
+
|
||
+ SizeT rank = p0->Rank();
|
||
+ if( rank == 0)
|
||
+ e->Throw( "Expression must be an array "
|
||
+ "in this context: "+ e->GetParString(0));
|
||
+
|
||
+ if( nParam == 2)
|
||
+ {
|
||
+
|
||
+ BaseGDL* p1 = e->GetParDefined( 1);
|
||
+ if( p1->N_Elements() != rank)
|
||
+ e->Throw("Incorrect number of elements in permutation.");
|
||
+
|
||
+ DUInt* perm = new DUInt[rank];
|
||
+ auto_ptr<DUInt> perm_guard( perm);
|
||
+
|
||
+ DUIntGDL* p1L = static_cast<DUIntGDL*>
|
||
+ (p1->Convert2( UINT, BaseGDL::COPY));
|
||
+ for( SizeT i=0; i<rank; ++i) perm[i] = (*p1L)[ i];
|
||
+ delete p1L;
|
||
+
|
||
+ // check permutaion vector
|
||
+ for( SizeT i=0; i<rank; ++i)
|
||
+ {
|
||
+ DUInt j;
|
||
+ for( j=0; j<rank; ++j) if( perm[j] == i) break;
|
||
+ if (j == rank)
|
||
+ e->Throw( "Incorrect permutation vector.");
|
||
+ }
|
||
+ return p0->Transpose( perm);
|
||
+ }
|
||
+
|
||
+ return p0->Transpose( NULL);
|
||
+ }
|
||
+
|
||
+
|
||
+
|
||
+ // helper function for sort_fun, recursive
|
||
+ // optimized version
|
||
+ template< typename IndexT>
|
||
+ void MergeSortOpt( BaseGDL* p0, IndexT* hhS, IndexT* h1, IndexT* h2,
|
||
+ SizeT len)
|
||
+ {
|
||
+ if( len <= 1) return;
|
||
+
|
||
+ SizeT h1N = len / 2;
|
||
+ SizeT h2N = len - h1N;
|
||
+
|
||
+ // 1st half
|
||
+ MergeSortOpt(p0, hhS, h1, h2, h1N);
|
||
+
|
||
+ // 2nd half
|
||
+ IndexT* hhM = &hhS[h1N];
|
||
+ MergeSortOpt(p0, hhM, h1, h2, h2N);
|
||
+
|
||
+ SizeT i;
|
||
+ for(i=0; i<h1N; ++i) h1[i] = hhS[ i];
|
||
+ for(i=0; i<h2N; ++i) h2[i] = hhM[ i];
|
||
+
|
||
+ SizeT h1Ix = 0;
|
||
+ SizeT h2Ix = 0;
|
||
+ for( i=0; (h1Ix < h1N) && (h2Ix < h2N); ++i)
|
||
+ {
|
||
+ // the actual comparisson
|
||
+ if( p0->Greater( h1[h1Ix], h2[h2Ix]))
|
||
+ hhS[ i] = h2[ h2Ix++];
|
||
+ else
|
||
+ hhS[ i] = h1[ h1Ix++];
|
||
+ }
|
||
+ for(; h1Ix < h1N; ++i) hhS[ i] = h1[ h1Ix++];
|
||
+ for(; h2Ix < h2N; ++i) hhS[ i] = h2[ h2Ix++];
|
||
+ }
|
||
+
|
||
+ // helper function for sort_fun, recursive
|
||
+ void MergeSort( BaseGDL* p0, SizeT* hh, SizeT* h1, SizeT* h2,
|
||
+ SizeT start, SizeT end)
|
||
+ {
|
||
+ if( start+1 >= end) return;
|
||
+
|
||
+ SizeT middle = (start+end) / 2;
|
||
+
|
||
+ MergeSort(p0, hh, h1, h2, start, middle);
|
||
+ MergeSort(p0, hh, h1, h2, middle, end);
|
||
+
|
||
+ SizeT h1N = middle - start;
|
||
+ SizeT h2N = end - middle;
|
||
+
|
||
+ SizeT* hhS = &hh[start];
|
||
+
|
||
+ SizeT i;
|
||
+ for(i=0; i<h1N; ++i) h1[i] = hhS[ i];
|
||
+ for(i=0; i<h2N; ++i) h2[i] = hh[middle + i];
|
||
+
|
||
+ SizeT h1Ix = 0;
|
||
+ SizeT h2Ix = 0;
|
||
+ for( i=0; (h1Ix < h1N) && (h2Ix < h2N); ++i)
|
||
+ {
|
||
+ // the actual comparisson
|
||
+ if( p0->Greater( h1[h1Ix], h2[h2Ix]))
|
||
+ hhS[ i] = h2[ h2Ix++];
|
||
+ else
|
||
+ hhS[ i] = h1[ h1Ix++];
|
||
+ }
|
||
+ for(; h1Ix < h1N; ++i) hhS[ i] = h1[ h1Ix++];
|
||
+ for(; h2Ix < h2N; ++i) hhS[ i] = h2[ h2Ix++];
|
||
+ }
|
||
+
|
||
+ // sort function uses MergeSort
|
||
+ BaseGDL* sort_fun( EnvT* e)
|
||
+ {
|
||
+ e->NParam( 1);
|
||
+
|
||
+ BaseGDL* p0 = e->GetParDefined( 0);
|
||
+
|
||
+ if( p0->Type() == STRUCT)
|
||
+ e->Throw( "Struct expression not allowed in this context: "+
|
||
+ e->GetParString(0));
|
||
+
|
||
+ static int l64Ix = e->KeywordIx( "L64");
|
||
+ bool l64 = e->KeywordSet( l64Ix);
|
||
+
|
||
+ SizeT nEl = p0->N_Elements();
|
||
+
|
||
+ // helper arrays
|
||
+ DLongGDL* res = new DLongGDL( dimension( nEl), BaseGDL::INDGEN);
|
||
+
|
||
+ DLong *hh = static_cast<DLong*>(res->DataAddr());
|
||
+
|
||
+ DLong* h1 = new DLong[ nEl/2];
|
||
+ DLong* h2 = new DLong[ (nEl+1)/2];
|
||
+ // call the sort routine
|
||
+ MergeSortOpt<DLong>( p0, hh, h1, h2, nEl);
|
||
+ delete[] h1;
|
||
+ delete[] h2;
|
||
+
|
||
+ if( l64)
|
||
+ {
|
||
+ // leave it this way, as sorting of more than 2^31
|
||
+ // items seems not feasible in the future we might
|
||
+ // use MergeSortOpt<DLong64>(...) for this
|
||
+ return res->Convert2( LONG64);
|
||
+ }
|
||
+
|
||
+ return res;
|
||
+ }
|
||
+
|
||
+ // uses MergeSort
|
||
+ BaseGDL* median( EnvT* e)
|
||
+ {
|
||
+ SizeT nParam = e->NParam( 1);
|
||
+
|
||
+ if( !(nParam > 1))
|
||
+ {
|
||
+ BaseGDL* p0 = e->GetParDefined( 0);
|
||
+
|
||
+ if( p0->Type() == STRUCT)
|
||
+ e->Throw( "Struct expression not allowed in this context: "+
|
||
+ e->GetParString(0));
|
||
+
|
||
+ if( p0->Rank() == 0)
|
||
+ e->Throw( "Expression must be an array in this context: "+
|
||
+ e->GetParString(0));
|
||
+
|
||
+ SizeT nEl = p0->N_Elements();
|
||
+
|
||
+ static int evenIx = e->KeywordIx( "EVEN");
|
||
+ static int doubleIx = e->KeywordIx( "DOUBLE");
|
||
+
|
||
+ // DIM keyword
|
||
+ DLong dim = 0;
|
||
+ DLong nmed = 1;
|
||
+ DDoubleGDL *res;
|
||
+ e->AssureLongScalarKWIfPresent( "DIM", dim);
|
||
+
|
||
+ if (dim > p0->Rank())
|
||
+ e->Throw( "Illegal keyword value for DIMENSION.");
|
||
+
|
||
+ if (dim > 0) {
|
||
+ DLong dims[8];
|
||
+ DLong k = 0;
|
||
+ for (SizeT i=0; i<p0->Rank(); ++i)
|
||
+ if (i != (dim-1)) {
|
||
+ nmed *= p0->Dim(i);
|
||
+ dims[k++] = p0->Dim(i);
|
||
+ }
|
||
+ dimension dimRes((DLong *) dims, p0->Rank()-1);
|
||
+ res = new DDoubleGDL( dimRes, BaseGDL::NOZERO);
|
||
+ } else {
|
||
+ res = new DDoubleGDL( 1);
|
||
+ }
|
||
+
|
||
+ // helper arrays
|
||
+ if (nmed > 1) nEl = p0->N_Elements() / nmed;
|
||
+
|
||
+ DLong *hh = new DLong[ nEl];
|
||
+ DLong* h1 = new DLong[ nEl/2];
|
||
+ DLong* h2 = new DLong[ (nEl+1)/2];
|
||
+
|
||
+ DLong accumStride = 1;
|
||
+ if (nmed > 1)
|
||
+ for( DLong i=0; i<dim-1; ++i) accumStride *= p0->Dim(i);
|
||
+
|
||
+ // Loop over all subarray medians
|
||
+ for (SizeT k=0; k<nmed; ++k) {
|
||
+
|
||
+ if (nmed == 1) {
|
||
+ for( DLong i=0; i<nEl; ++i) hh[i] = i;
|
||
+ } else {
|
||
+ // Starting Element
|
||
+ DLong start = accumStride * p0->Dim(dim-1) * (k / accumStride) +
|
||
+ (k % accumStride);
|
||
+ for( DLong i=0; i<nEl; ++i) hh[i] = start + i * accumStride;
|
||
+ }
|
||
+ // ArrayGuard< DLong> hhGuard( hh);
|
||
+
|
||
+ // call the sort routine
|
||
+ MergeSortOpt<DLong>( p0, hh, h1, h2, nEl);
|
||
+ DLong medEl = hh[ nEl/2];
|
||
+ DLong medEl_1 = hh[ nEl/2 - 1];
|
||
+
|
||
+ if( (nEl % 2) == 1 || !e->KeywordSet( evenIx)) {
|
||
+ if (nmed == 1)
|
||
+ res = (DDoubleGDL *) (p0->NewIx( medEl))->Convert2( DOUBLE);
|
||
+ else {
|
||
+ DDoubleGDL* op1 =
|
||
+ static_cast<DDoubleGDL*>((p0->NewIx( medEl))->Convert2( DOUBLE));
|
||
+ (*res)[k] = (*op1)[0];
|
||
+ }
|
||
+ } else {
|
||
+ DDoubleGDL* op1 =
|
||
+ static_cast<DDoubleGDL*>((p0->NewIx( medEl))->Convert2( DOUBLE));
|
||
+ e->Guard( op1);
|
||
+ DDoubleGDL* op2 =
|
||
+ static_cast<DDoubleGDL*>((p0->NewIx( medEl_1))->Convert2( DOUBLE));
|
||
+ static DDoubleGDL* op3 = new DDoubleGDL( 2.0);
|
||
+ if (nmed == 1)
|
||
+ res = op2->Add( op1)->Div( op3);
|
||
+ else {
|
||
+ op1 = op2->Add( op1)->Div( op3);
|
||
+ (*res)[k] = (*op1)[0];
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+ delete[] h1;
|
||
+ delete[] h2;
|
||
+ delete[] hh;
|
||
+
|
||
+ if( p0->Type() == DOUBLE ||
|
||
+ p0->Type() == COMPLEXDBL ||
|
||
+ e->KeywordSet( doubleIx))
|
||
+ return res;
|
||
+ else
|
||
+ return res->Convert2( FLOAT);
|
||
+ }
|
||
+ else
|
||
+ // with parameter Width : median filtering with no optmisation,
|
||
+ // such as histogram algorithms.
|
||
+ // Copyright: (C) 2008 by Nicolas Galmiche
|
||
+ {
|
||
+ cout << "c0 " << endl;
|
||
+
|
||
+ // basic checks on "vector/array" input
|
||
+ DDoubleGDL* p0 = e->GetParAs<DDoubleGDL>( 0);
|
||
+
|
||
+ cout << "c1 " << endl;
|
||
+
|
||
+
|
||
+ if( p0->Type() == STRUCT)
|
||
+ e->Throw( "Struct expression not allowed in this context: "+ e->GetParString(0));
|
||
+ if( p0->Rank() == 0)
|
||
+ e->Throw( "Expression must be an array in this context: "+ e->GetParString(0));
|
||
+
|
||
+ if( p0->Rank() > 2)
|
||
+ e->Throw( "Only 1 or 2 dimensions allowed: "+ e->GetParString(0));
|
||
+
|
||
+ cout << "c2 " << endl;
|
||
+
|
||
+ // basic checks on "width" input
|
||
+ DDoubleGDL* p1d = e->GetParAs<DDoubleGDL>(1);
|
||
+
|
||
+ if (p1d->N_Elements() > 1 || (*p1d)[0] <=0 )
|
||
+ e->Throw( "Width must be a positive scalar or 1 (positive) element array in this context: "+ e->GetParString(0));
|
||
+ DLong MaxAllowedWidth=0;
|
||
+ if (p0->Rank() == 1) MaxAllowedWidth=p0->N_Elements();
|
||
+ if (p0->Rank() == 2) {
|
||
+ MaxAllowedWidth=p0->Dim(0);
|
||
+ if (p0->Dim(1) < MaxAllowedWidth) MaxAllowedWidth=p0->Dim(1);
|
||
+ }
|
||
+ int debug =1;
|
||
+ if (debug == 1) {
|
||
+ cout << "X dim " << p0->Dim(0) <<endl;
|
||
+ cout << "y dim " << p0->Dim(1) <<endl;
|
||
+ cout << "MaxAllowedWidth " << MaxAllowedWidth <<endl;
|
||
+ }
|
||
+ if (!isfinite( (*p1d)[0]))
|
||
+ e->Throw("% MEDIAN: Width must be > 1, and < dimension of array (NaN or Inf)");
|
||
+
|
||
+ DLongGDL* p1 = e->GetParAs<DLongGDL>(1);
|
||
+
|
||
+ DDoubleGDL *tamp = new DDoubleGDL(p0->Dim(),BaseGDL::NOZERO);
|
||
+ DDouble min=((*p0)[0]);
|
||
+ DDouble max=min;
|
||
+
|
||
+ for (SizeT ii=0 ; ii<p0->N_Elements() ; ++ii)
|
||
+ {(*tamp)[ii]=(*p0)[ii];
|
||
+ if ( (*p0)[ii] < min ) min = ((*p0)[ii]);
|
||
+ if ( (*p0)[ii] > max ) max = ((*p0)[ii]);
|
||
+ }
|
||
+
|
||
+ //---------------------------- END d'acquisistion des paramètres -------------------------------------
|
||
+
|
||
+
|
||
+ static int evenIx = e->KeywordIx( "EVEN");
|
||
+ static int doubleIx = e->KeywordIx( "DOUBLE");
|
||
+ static DStructGDL *Values = SysVar::Values();
|
||
+ DDouble d_nan=(*static_cast<DDoubleGDL*>(Values->GetTag(Values->Desc()->TagIndex("D_NAN"), 0)))[0];
|
||
+ DDouble d_infinity= (*static_cast<DDoubleGDL*>(Values->GetTag(Values->Desc()->TagIndex("D_INFINITY"), 0)))[0];
|
||
+
|
||
+ //------------------------------ Init variables and allocation ---------------------------------------
|
||
+ SizeT width=(*p1)[0];
|
||
+ SizeT N_MaskElem= width*width;
|
||
+ SizeT larg = p0->Stride(1);
|
||
+ SizeT haut = p0->Stride(2)/larg;
|
||
+ SizeT lim= static_cast<SizeT>(round(width/2));
|
||
+ SizeT init=(lim*larg+lim);
|
||
+
|
||
+ // we don't go further if dimension(s) versus not width OK
|
||
+
|
||
+ if (debug == 1) {cout << "ici" <<endl;}
|
||
+
|
||
+ if ( p0->Rank() == 1) {
|
||
+ if (larg < width || width==1 ) e->Throw( "% MEDIAN: Width must be > 1, and < width of vector");
|
||
+ }
|
||
+ if ( p0->Rank() == 2) {
|
||
+ if (larg < width || haut < width || width==1) e->Throw("% MEDIAN: Width must be > 1, and < dimension of array");
|
||
+ }
|
||
+
|
||
+ // for 2D arrays, we use the algorithm described in paper
|
||
+ // from T. Huang, G. Yang, and G. Tang, “A Fast Two-Dimensional Median
|
||
+ // Filtering Algorithm,” IEEE Trans. Acoust., Speech, Signal Processing,
|
||
+ // vol. 27, no. 1, pp. 13–18, 1979.
|
||
+
|
||
+ if ( (e->GetParDefined( 0)->Type() == BYTE ||
|
||
+ e->GetParDefined( 0)->Type() == INT ||
|
||
+ e->GetParDefined( 0)->Type() == UINT ||
|
||
+ e->GetParDefined( 0)->Type() == LONG ||
|
||
+ e->GetParDefined( 0)->Type() == ULONG ||
|
||
+ e->GetParDefined( 0)->Type() == LONG64 ||
|
||
+ e->GetParDefined( 0)->Type() == ULONG64) &&
|
||
+ (haut>1))
|
||
+ {
|
||
+ SizeT taille=static_cast<SizeT>(abs(max)-min+1);
|
||
+ DDoubleGDL* Histo = new DDoubleGDL(taille,BaseGDL::NOZERO);
|
||
+ if (width % 2 ==0)
|
||
+ {
|
||
+ for(SizeT i=0 ; i<haut-2*lim ; ++i)
|
||
+ {
|
||
+ SizeT ltmed=0;
|
||
+ SizeT med=0;
|
||
+ SizeT initial=init+i*larg-lim*larg-lim;
|
||
+ for(SizeT pp=0 ; pp<taille;++pp)(*Histo)[pp]=0;
|
||
+ for (SizeT ii=initial ; ii <initial+ width ; ++ii)
|
||
+ {
|
||
+ for(SizeT yy=0;yy<width;yy++)
|
||
+ (*Histo)[static_cast<SizeT>((*p0)[ii+yy*larg]-min)]++;
|
||
+ }
|
||
+
|
||
+ while (ltmed+(*Histo)[med]<=(N_MaskElem /2))
|
||
+ {
|
||
+ ltmed+= static_cast<SizeT>((*Histo)[med]);
|
||
+ ++med;
|
||
+ }
|
||
+ if (e->KeywordSet( evenIx))
|
||
+ {
|
||
+
|
||
+ SizeT EvenMed=med;
|
||
+ //if ((*Histo)[EvenMed]==1 || (ltmed!=0 && ltmed !=(N_MaskElem /2) -1))
|
||
+ if ((*Histo)[EvenMed]==1 || (ltmed!=0 && N_MaskElem /2- ltmed!=1) )
|
||
+ {
|
||
+ while ((*Histo)[EvenMed-1]==0)
|
||
+ { EvenMed--;}
|
||
+ (*tamp)[init+i*larg]=((med+min)+(EvenMed-1+min))/2;
|
||
+ }
|
||
+ else
|
||
+ (*tamp)[init+i*larg]=med+min;
|
||
+ }
|
||
+ else
|
||
+ {(*tamp)[init+i*larg]=med+min; }
|
||
+
|
||
+ for(SizeT j=init+i*larg +1; j<init+(i+1)*larg-2*lim ;++ j)
|
||
+ {
|
||
+ SizeT initMask=j-lim*larg-lim;
|
||
+ for(SizeT k=0;k<2*lim;++k)
|
||
+ {
|
||
+ (*Histo)[static_cast<SizeT>((*p0)[initMask-1+k*larg]-min)]--;
|
||
+ if ((*p0)[initMask-1+k*larg]-min<med)ltmed--;
|
||
+
|
||
+ (*Histo)[static_cast<SizeT>((*p0)[initMask+k*larg+2*lim-1]-min)]++;
|
||
+ if ((*p0)[initMask+k*larg+2*lim-1]-min<med)ltmed++;
|
||
+ }
|
||
+ if (ltmed>N_MaskElem /2)
|
||
+ {
|
||
+ while(ltmed>N_MaskElem /2)
|
||
+ {
|
||
+ --med;
|
||
+ ltmed-=static_cast<SizeT>((*Histo)[med]);
|
||
+ }
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ while (ltmed+(*Histo)[med]<=(N_MaskElem /2))
|
||
+ {
|
||
+ ltmed+= static_cast<SizeT>((*Histo)[med]);
|
||
+ ++med;
|
||
+ }
|
||
+ }
|
||
+
|
||
+ if (e->KeywordSet( evenIx))
|
||
+ {
|
||
+ SizeT EvenMed=med;
|
||
+ if ((*Histo)[EvenMed]==1 || (ltmed!=0 &&N_MaskElem /2- ltmed!=1 ))
|
||
+ {
|
||
+ while ((*Histo)[EvenMed-1]==0)
|
||
+ { EvenMed--;}
|
||
+ (*tamp)[j]=((med+min)+(EvenMed-1+min))/2;
|
||
+ }
|
||
+ else
|
||
+ {(*tamp)[j]=med+min; }
|
||
+ }
|
||
+ else
|
||
+ {(*tamp)[j]=med+min; }
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ for(SizeT i=0 ; i<haut-2*lim ; ++i)
|
||
+ {
|
||
+ SizeT ltmed=0;
|
||
+ SizeT med=0;
|
||
+ SizeT initial=init+i*larg-lim*larg-lim;
|
||
+ for(SizeT pp=0 ; pp<taille;++pp)(*Histo)[pp]=0;
|
||
+ for (SizeT ii=initial ; ii <initial+ width ; ++ii)
|
||
+ {
|
||
+ for(SizeT yy=0;yy<width;yy++)
|
||
+ (*Histo)[static_cast<SizeT>((*p0)[ii+yy*larg]-min)]++;
|
||
+ }
|
||
+
|
||
+ while (ltmed+(*Histo)[med]<=(N_MaskElem /2))
|
||
+ {
|
||
+ ltmed+= static_cast<SizeT>((*Histo)[med]);
|
||
+ ++med;
|
||
+ }
|
||
+ (*tamp)[init+i*larg]=med+min;
|
||
+
|
||
+ for(SizeT j=init+i*larg +1; j<init+(i+1)*larg-2*lim ;++ j)
|
||
+ {
|
||
+
|
||
+ SizeT initMask=j-lim*larg-lim;
|
||
+ for(SizeT k=0;k<=2*lim;++k)
|
||
+ {
|
||
+ (*Histo)[static_cast<SizeT>((*p0)[initMask-1+k*larg]-min)]--;
|
||
+ if ((*p0)[initMask-1+k*larg]-min<med)ltmed--;
|
||
+
|
||
+ (*Histo)[static_cast<SizeT>((*p0)[initMask+k*larg+2*lim]-min)]++;
|
||
+ if ((*p0)[initMask+k*larg+2*lim]-min<med)ltmed++;
|
||
+ }
|
||
+ if (ltmed>N_MaskElem /2)
|
||
+ {
|
||
+ while(ltmed>N_MaskElem /2)
|
||
+ {
|
||
+ --med;
|
||
+ ltmed-=static_cast<SizeT>((*Histo)[med]);
|
||
+ }
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ while (ltmed+(*Histo)[med]<=(N_MaskElem /2))
|
||
+ {
|
||
+ ltmed+= static_cast<SizeT>((*Histo)[med]);
|
||
+ ++med;
|
||
+ }
|
||
+ }
|
||
+
|
||
+ (*tamp)[j]=med+min;
|
||
+
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ DLong* hh;
|
||
+ DLong* h1;
|
||
+ DLong* h2;
|
||
+ DDoubleGDL* Mask,*Mask1D;
|
||
+ if ( p0->Rank() != 1 )
|
||
+ {
|
||
+ hh = new DLong[ N_MaskElem];
|
||
+ h1 = new DLong[ N_MaskElem/2];
|
||
+ h2= new DLong[ (N_MaskElem+1)/2];
|
||
+ Mask = new DDoubleGDL(N_MaskElem,BaseGDL::NOZERO);
|
||
+
|
||
+ for( DLong i=0; i<N_MaskElem; ++i) hh[i] = i;
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ hh = new DLong[ width];
|
||
+ h1 = new DLong[ width/2];
|
||
+ h2= new DLong[(width+1)/2];
|
||
+ Mask1D = new DDoubleGDL(width,BaseGDL::NOZERO);
|
||
+
|
||
+ for( DLong i=0; i<width; ++i) hh[i] = i;
|
||
+ }
|
||
+
|
||
+ //-------------------------------- END OF VARIABLES INIT ---------------------------------------------
|
||
+
|
||
+ //------------------------------ Median Filter Algorithms ---------------------------------------
|
||
+
|
||
+ if ( width % 2 ==0)
|
||
+ {
|
||
+ if ( p0->Rank() == 1 )//------------------------ For a vector with even width -------------------
|
||
+ {
|
||
+ for (SizeT col= lim ; col<larg-lim ; ++col)
|
||
+ {
|
||
+ SizeT ctl_NaN=0;
|
||
+ SizeT kk=0;
|
||
+ for (SizeT ind=col-lim ; ind<col+lim ; ++ind)
|
||
+ {
|
||
+ if( (*p0)[ind]!=d_infinity && (*p0)[ind]!=-d_infinity && isfinite((*p0)[ind])==0)
|
||
+ ctl_NaN++;
|
||
+ else
|
||
+ {
|
||
+ (*Mask1D)[kk]=(*p0)[ind];
|
||
+ kk++;
|
||
+ }
|
||
+ }
|
||
+ if (ctl_NaN!=0)
|
||
+ {
|
||
+ if(ctl_NaN==width)(*tamp)[col]= d_nan;
|
||
+ else
|
||
+ {
|
||
+ DLong* hhbis = new DLong[ width-ctl_NaN];
|
||
+ DLong* h1bis = new DLong[ width-ctl_NaN/2];
|
||
+ DLong* h2bis= new DLong[(width-ctl_NaN+1)/2];
|
||
+ DDoubleGDL *Mask1Dbis = new DDoubleGDL(width-ctl_NaN,BaseGDL::NOZERO);
|
||
+ for( DLong t=0; t<width-ctl_NaN; ++t) hhbis[t] = t;
|
||
+ for( DLong ii=0; ii<width-ctl_NaN; ++ii)(*Mask1Dbis)[ii]=(*Mask1D)[ii];
|
||
+ BaseGDL* besort=static_cast<BaseGDL*>(Mask1Dbis);
|
||
+ MergeSortOpt<DLong>( besort, hhbis, h1bis, h2bis,(width - ctl_NaN));
|
||
+ if (e->KeywordSet( evenIx)&& (width - ctl_NaN) % 2 == 0)
|
||
+ (*tamp)[col]=((*Mask1Dbis)[hhbis[ (width-ctl_NaN)/2]]+(*Mask1Dbis
|
||
+ )[hhbis [ (width - ctl_NaN-1)/2]])/2;
|
||
+ else
|
||
+ (*tamp)[col]=(*Mask1Dbis)[hhbis[ (width- ctl_NaN)/2]];
|
||
+ delete[]hhbis;
|
||
+ delete[]h2bis;
|
||
+ delete[]h1bis;
|
||
+ }
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ BaseGDL* besort=static_cast<BaseGDL*>(Mask1D);
|
||
+ MergeSortOpt<DLong>( besort, hh, h1, h2,width ); // call the sort routine
|
||
+
|
||
+ if (e->KeywordSet( evenIx))
|
||
+
|
||
+ (*tamp)[col]=((*Mask1D)[hh[ width/2]]+(*Mask1D)[hh[ (width-1)/2]])/2;
|
||
+ else
|
||
+ (*tamp)[col]=(*Mask1D)[hh[ width/2]];// replace value by Mask median
|
||
+ }
|
||
+ }
|
||
+
|
||
+ }
|
||
+ else//------------------------ For an array with even width -------------------
|
||
+ {
|
||
+ SizeT jj;
|
||
+ for(SizeT i=0 ; i<haut-2*lim ; ++i) // lines to replace
|
||
+ {
|
||
+ for(SizeT j=init+i*larg ; j<init+(i+1)*larg-2*lim ; ++j)// elements to replace
|
||
+ {
|
||
+ SizeT initMask=j-lim*larg-lim; // left corner of mask
|
||
+ SizeT kk=0;
|
||
+ SizeT ctl_NaN=0;
|
||
+ for(SizeT k=0;k<2*lim;++k) // lines of mask
|
||
+ {
|
||
+
|
||
+ for(jj=initMask+k*larg ; jj<(initMask+k*larg)+2*lim ; ++jj) // elements of mask
|
||
+ {
|
||
+ if( (*p0)[jj]!=d_infinity && (*p0)[jj]!=-d_infinity && isfinite((*p0)[jj])==0)
|
||
+ ctl_NaN++;
|
||
+ else
|
||
+ {
|
||
+ (*Mask)[kk]=(*p0)[jj];
|
||
+ kk++;
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+ if (ctl_NaN!=0)
|
||
+ {
|
||
+ if(ctl_NaN==N_MaskElem)(*tamp)[j]= d_nan;
|
||
+ else {
|
||
+ DLong* hhb = new DLong[ N_MaskElem-ctl_NaN];
|
||
+ DLong* h1b = new DLong[ (N_MaskElem-ctl_NaN)/2];
|
||
+ DLong* h2b = new DLong[(N_MaskElem-ctl_NaN+1)/2];
|
||
+ DDoubleGDL *Maskb = new DDoubleGDL(N_MaskElem-ctl_NaN,BaseGDL::NOZERO);
|
||
+ for( DLong t=0; t<N_MaskElem-ctl_NaN; ++t) hhb[t] = t;
|
||
+ for( DLong ii=0; ii<N_MaskElem-ctl_NaN; ++ii)(*Maskb)[ii]=(*Mask)[ii];
|
||
+ BaseGDL* besort=static_cast<BaseGDL*>(Maskb);
|
||
+ MergeSortOpt<DLong>( besort, hhb, h1b, h2b,(N_MaskElem - ctl_NaN));
|
||
+ if ((N_MaskElem - ctl_NaN) % 2 == 0 && e->KeywordSet( evenIx))
|
||
+ (*tamp)[j]=((*Maskb)[hhb[ (N_MaskElem-ctl_NaN)/2]]+(*Maskb)[hhb
|
||
+ [ (N_MaskElem -
|
||
+ ctl_NaN-1)/2]])/2;
|
||
+ else
|
||
+ (*tamp)[j]=(*Maskb)[hhb[ (N_MaskElem- ctl_NaN)/2]];
|
||
+ delete[]hhb;
|
||
+ delete[]h2b;
|
||
+ delete[]h1b;
|
||
+ }
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ BaseGDL* besort=static_cast<BaseGDL*>(Mask);
|
||
+ MergeSortOpt<DLong>( besort, hh, h1, h2, N_MaskElem); // call the sort routine
|
||
+ if (e->KeywordSet( evenIx))
|
||
+ (*tamp)[j]=((*Mask)[hh[ N_MaskElem/2]]+(*Mask)[hh[ (N_MaskElem-1)/2]])/2;
|
||
+ else
|
||
+ (*tamp)[j]=(*Mask)[hh[ N_MaskElem/2]];// replace value by median Mask one
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+
|
||
+ else
|
||
+ {
|
||
+ if ( p0->Rank() == 1 )//------------------------ For a vector with odd width -------------------
|
||
+
|
||
+ {
|
||
+ for (SizeT col= lim ; col<larg-lim ; ++col)
|
||
+ {
|
||
+ SizeT kk=0;
|
||
+ SizeT ctl_NaN=0;
|
||
+ for (SizeT ind=col-lim ; ind<=col+lim ; ++ind)
|
||
+ {if( (*p0)[ind]!=d_infinity && (*p0)[ind]!=-d_infinity && isfinite((*p0)[ind])==0)
|
||
+ ctl_NaN++;
|
||
+ else{
|
||
+ (*Mask1D)[kk]=(*p0)[ind];
|
||
+ kk++;
|
||
+ }
|
||
+ }
|
||
+ if (ctl_NaN!=0)
|
||
+ {
|
||
+ if(ctl_NaN==width)(*tamp)[col]= d_nan;
|
||
+ else {
|
||
+ DLong* hhbis = new DLong[ width-ctl_NaN];
|
||
+ DLong* h1bis = new DLong[ width-ctl_NaN/2];
|
||
+ DLong* h2bis= new DLong[(width-ctl_NaN+1)/2];
|
||
+ DDoubleGDL *Mask1Dbis = new DDoubleGDL(width-ctl_NaN,BaseGDL::NOZERO);
|
||
+ for( DLong t=0; t<width-ctl_NaN; ++t) hhbis[t] = t;
|
||
+ for( DLong ii=0; ii<width-ctl_NaN; ++ii)(*Mask1Dbis)[ii]=(*Mask1D)[ii];
|
||
+ BaseGDL* besort=static_cast<BaseGDL*>(Mask1Dbis);
|
||
+ MergeSortOpt<DLong>( besort, hhbis, h1bis, h2bis,(width - ctl_NaN));
|
||
+ if (e->KeywordSet( evenIx)&& (width - ctl_NaN) % 2 == 0)
|
||
+ (*tamp)[col]=((*Mask1Dbis)[hhbis[ (width-ctl_NaN)/2]]+(*Mask1Dbis
|
||
+ )[hhbis [ (width - ctl_NaN-1)/2]])/2;
|
||
+ else(*tamp)[col]=(*Mask1Dbis)[hhbis[ (width- ctl_NaN)/2]];
|
||
+ delete[]hhbis;
|
||
+ delete[]h2bis;
|
||
+ delete[]h1bis;
|
||
+ }
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ BaseGDL* besort=static_cast<BaseGDL*>(Mask1D);
|
||
+ MergeSortOpt<DLong>( besort, hh, h1, h2,width ); // call the sort routine
|
||
+ (*tamp)[col]=(*Mask1D)[hh[ (width)/2]]; // replace value by Mask median
|
||
+ }
|
||
+ }
|
||
+
|
||
+ }
|
||
+
|
||
+ else //----------------------------- For an array with odd width ---------------------------------
|
||
+ {
|
||
+ SizeT jj;
|
||
+ for(SizeT i=0 ; i<haut-2*lim ; ++i) // lines to replace
|
||
+ {
|
||
+
|
||
+ SizeT initial=init+i*larg-lim*larg-lim;
|
||
+ SizeT dd=0;SizeT ctl_NaN_init=0;
|
||
+ for(SizeT yy=0;yy<width;yy++)
|
||
+ {
|
||
+ for (SizeT ii=initial+yy*larg ; ii <initial+ yy*larg+ width; ++ii)
|
||
+ {
|
||
+
|
||
+ if( (*p0)[ii]!=d_infinity && (*p0)[ii]!=-d_infinity && isfinite((*p0)[ii])==0)
|
||
+ ctl_NaN_init++;
|
||
+ else
|
||
+ (*Mask)[dd]=(*p0)[ii];
|
||
+ dd++;
|
||
+ }
|
||
+ }
|
||
+ SizeT kk=0;
|
||
+
|
||
+ for(SizeT j=init+i*larg ; j<init+(i+1)*larg-2*lim ; ++j)// elements to replace
|
||
+ {
|
||
+ SizeT initMask=j-lim*larg-lim; // left corner of mask
|
||
+ SizeT kk=0;
|
||
+ SizeT ctl_NaN=0;
|
||
+ for(SizeT k=0;k<=2*lim;++k) // lines of mask
|
||
+ {
|
||
+
|
||
+ for(jj=initMask+k*larg ; jj<=(initMask+k*larg)+2*lim ; ++jj) // elements of mask
|
||
+ {
|
||
+ if( (*p0)[jj]!=d_infinity && (*p0)[jj]!=-d_infinity && isfinite((*p0)[jj])==0)
|
||
+ ctl_NaN++;
|
||
+
|
||
+ else
|
||
+ {
|
||
+ (*Mask)[kk]=(*p0)[jj];
|
||
+ kk++;
|
||
+ }
|
||
+ }
|
||
+
|
||
+ }
|
||
+
|
||
+ if (ctl_NaN!=0)
|
||
+ {
|
||
+ if(ctl_NaN==N_MaskElem)(*tamp)[j]= d_nan;
|
||
+ else {
|
||
+
|
||
+ DLong* hhb = new DLong[ N_MaskElem-ctl_NaN];
|
||
+ DLong* h1b = new DLong[ (N_MaskElem-ctl_NaN)/2];
|
||
+ DLong* h2b= new DLong[(N_MaskElem-ctl_NaN+1)/2];
|
||
+ DDoubleGDL*Maskb = new DDoubleGDL(N_MaskElem-ctl_NaN,BaseGDL::NOZERO);
|
||
+ for( DLong t=0; t<N_MaskElem-ctl_NaN; ++t) hhb[t] = t;
|
||
+ for( DLong ii=0; ii<N_MaskElem-ctl_NaN; ++ii)(*Maskb)[ii]=(*Mask)[ii];
|
||
+ BaseGDL* besort=static_cast<BaseGDL*>(Maskb);
|
||
+ MergeSortOpt<DLong>( besort, hhb, h1b, h2b,(N_MaskElem - ctl_NaN));
|
||
+ if ((N_MaskElem - ctl_NaN) % 2 == 0 && e->KeywordSet( evenIx))
|
||
+ (*tamp)[j]=((*Maskb)[hhb[ (N_MaskElem-ctl_NaN)/2]]+(*Maskb)[hhb
|
||
+ [ (N_MaskElem -
|
||
+ ctl_NaN-1)/2]])/2;
|
||
+ else(*tamp)[j]=(*Maskb)[hhb[(N_MaskElem- ctl_NaN)/2]];
|
||
+ delete[]hhb;
|
||
+ delete[]h2b;
|
||
+ delete[]h1b;
|
||
+ }
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ BaseGDL* besort=static_cast<BaseGDL*>(Mask);
|
||
+ MergeSortOpt<DLong>( besort, hh, h1, h2, N_MaskElem); // call the sort routine
|
||
+ (*tamp)[j]=(*Mask)[hh[ (N_MaskElem)/2]]; // replace value by Mask median
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+
|
||
+ //--------------------------- END OF MEDIAN FILTER ALOGORITHMS -----------------------------------
|
||
+
|
||
+ delete[] h1;
|
||
+ delete[] h2;
|
||
+ delete[] hh;
|
||
+ }
|
||
+ if ( e->GetParDefined( 0)->Type() == DOUBLE || p0->Type() == COMPLEXDBL ||e->KeywordSet( doubleIx) )
|
||
+ return tamp;
|
||
+ else if (e->GetParDefined( 0)->Type() == BYTE)
|
||
+ return tamp->Convert2(BYTE,BaseGDL::CONVERT);
|
||
+
|
||
+ return tamp->Convert2(FLOAT,BaseGDL::CONVERT);
|
||
+
|
||
+ }// end if
|
||
+
|
||
+ }// end of median
|
||
+
|
||
+ BaseGDL* shift_fun( EnvT* e)
|
||
+ {
|
||
+ SizeT nParam = e->NParam( 2);
|
||
+
|
||
+ BaseGDL* p0 = e->GetParDefined( 0);
|
||
+
|
||
+ SizeT nShift = nParam - 1;
|
||
+ if( nShift == 1)
|
||
+ {
|
||
+ DLong s1;
|
||
+ e->AssureLongScalarPar( 1, s1);
|
||
+
|
||
+ return p0->CShift( s1);
|
||
+ }
|
||
+
|
||
+ if( p0->Rank() != nShift)
|
||
+ e->Throw( "Incorrect number of arguments.");
|
||
+
|
||
+ DLong sIx[ MAXRANK];
|
||
+ for( SizeT i=0; i< nShift; i++)
|
||
+ e->AssureLongScalarPar( i+1, sIx[ i]);
|
||
+
|
||
+ return p0->CShift( sIx);
|
||
+ }
|
||
+
|
||
+ BaseGDL* arg_present( EnvT* e)
|
||
+ {
|
||
+ e->NParam( 1);
|
||
+
|
||
+ if( !e->GlobalPar( 0))
|
||
+ return new DIntGDL( 0);
|
||
+
|
||
+ EnvBaseT* caller = e->Caller();
|
||
+ if( caller == NULL)
|
||
+ return new DIntGDL( 0);
|
||
+
|
||
+ BaseGDL** pp0 = &e->GetPar( 0);
|
||
+
|
||
+ int ix = caller->FindGlobalKW( pp0);
|
||
+ if( ix == -1)
|
||
+ return new DIntGDL( 0);
|
||
+
|
||
+ return new DIntGDL( 1);
|
||
+ }
|
||
+
|
||
+ BaseGDL* eof_fun( EnvT* e)
|
||
+ {
|
||
+ e->NParam( 1);
|
||
+
|
||
+ DLong lun;
|
||
+ e->AssureLongScalarPar( 0, lun);
|
||
+
|
||
+ bool stdLun = check_lun( e, lun);
|
||
+ if( stdLun)
|
||
+ return new DIntGDL( 0);
|
||
+
|
||
+ // nicer error message (Disregard if socket)
|
||
+ if ( fileUnits[ lun-1].SockNum() == -1) {
|
||
+ if( !fileUnits[ lun-1].IsOpen())
|
||
+ throw GDLIOException( e->CallingNode(), e->GetPro()->ObjectName()+
|
||
+ ": File unit is not open: "+i2s( lun)+".");
|
||
+
|
||
+ if( fileUnits[ lun-1].Eof())
|
||
+ return new DIntGDL( 1);
|
||
+ } else {
|
||
+ // Socket
|
||
+ string *recvBuf = &fileUnits[ lun-1].RecvBuf();
|
||
+ if (recvBuf->size() == 0)
|
||
+ return new DIntGDL( 1);
|
||
+ }
|
||
+ return new DIntGDL( 0);
|
||
+ }
|
||
+
|
||
+ BaseGDL* convol( EnvT* e)
|
||
+ {
|
||
+ SizeT nParam=e->NParam( 2);
|
||
+
|
||
+ BaseGDL* p0 = e->GetNumericParDefined( 0);
|
||
+ if( p0->Rank() == 0)
|
||
+ e->Throw( "Expression must be an array in this context: "+
|
||
+ e->GetParString(0));
|
||
+
|
||
+ BaseGDL* p1 = e->GetNumericParDefined( 1);
|
||
+ if( p1->Rank() == 0)
|
||
+ e->Throw( "Expression must be an array in this context: "+
|
||
+ e->GetParString(1));
|
||
+
|
||
+ if( p0->N_Elements() <= p1->N_Elements())
|
||
+ e->Throw( "Incompatible dimensions for Array and Kernel.");
|
||
+
|
||
+ // rank 1 for kernel works always
|
||
+ if( p1->Rank() != 1)
|
||
+ {
|
||
+ SizeT rank = p0->Rank();
|
||
+ if( rank != p1->Rank())
|
||
+ e->Throw( "Incompatible dimensions for Array and Kernel.");
|
||
+
|
||
+ for( SizeT r=0; r<rank; ++r)
|
||
+ if( p0->Dim( r) <= p1->Dim( r))
|
||
+ e->Throw( "Incompatible dimensions for Array and Kernel.");
|
||
+ }
|
||
+
|
||
+ // convert kernel to array type
|
||
+ auto_ptr<BaseGDL> p1Guard;
|
||
+ if( p0->Type() == BYTE)
|
||
+ {
|
||
+ if( p1->Type() != INT)
|
||
+ {
|
||
+ p1 = p1->Convert2( INT, BaseGDL::COPY);
|
||
+ p1Guard.reset( p1);
|
||
+ }
|
||
+ }
|
||
+ else if( p0->Type() != p1->Type())
|
||
+ {
|
||
+ p1 = p1->Convert2( p0->Type(), BaseGDL::COPY);
|
||
+ p1Guard.reset( p1);
|
||
+ }
|
||
+
|
||
+ BaseGDL* scale;
|
||
+ auto_ptr<BaseGDL> scaleGuard;
|
||
+ if( nParam > 2)
|
||
+ {
|
||
+ scale = e->GetParDefined( 2);
|
||
+ if( scale->Rank() > 0)
|
||
+ e->Throw( "Expression must be a scalar in this context: "+
|
||
+ e->GetParString(2));
|
||
+
|
||
+ // p1 here handles BYTE case also
|
||
+ if( p1->Type() != scale->Type())
|
||
+ {
|
||
+ scale = scale->Convert2( p1->Type(),BaseGDL::COPY);
|
||
+ scaleGuard.reset( scale);
|
||
+ }
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ scale = p1->New( dimension(), BaseGDL::ZERO);
|
||
+ }
|
||
+
|
||
+ bool center = true;
|
||
+ static int centerIx = e->KeywordIx( "CENTER");
|
||
+ if( e->KeywordPresent( centerIx))
|
||
+ {
|
||
+ DLong c;
|
||
+ e->AssureLongScalarKW( centerIx, c);
|
||
+ center = (c != 0);
|
||
+ }
|
||
+
|
||
+ // overrides EDGE_TRUNCATE
|
||
+ static int edge_wrapIx = e->KeywordIx( "EDGE_WRAP");
|
||
+ bool edge_wrap = e->KeywordSet( edge_wrapIx);
|
||
+ static int edge_truncateIx = e->KeywordIx( "EDGE_TRUNCATE");
|
||
+ bool edge_truncate = e->KeywordSet( edge_truncateIx);
|
||
+
|
||
+ int edgeMode = 0;
|
||
+ if( edge_wrap)
|
||
+ edgeMode = 1;
|
||
+ else if( edge_truncate)
|
||
+ edgeMode = 2;
|
||
+
|
||
+ // p0, p1 and scale have same type
|
||
+ // p1 has rank of 1 or same rank as p0 with each dimension smaller than p0
|
||
+ // scale is a scalar
|
||
+ return p0->Convol( p1, scale, center, edgeMode);
|
||
+ }
|
||
+
|
||
+ BaseGDL* rebin_fun( EnvT* e)
|
||
+ {
|
||
+ SizeT nParam = e->NParam( 2);
|
||
+
|
||
+ BaseGDL* p0 = e->GetNumericParDefined( 0);
|
||
+
|
||
+ SizeT rank = p0->Rank();
|
||
+
|
||
+ if( rank == 0)
|
||
+ e->Throw( "Expression must be an array in this context: "+
|
||
+ e->GetParString(0));
|
||
+
|
||
+ SizeT resDimInit[ MAXRANK];
|
||
+ for( SizeT p=1; p<nParam; ++p)
|
||
+ {
|
||
+ DLong newDim;
|
||
+ e->AssureLongScalarPar( p, newDim);
|
||
+
|
||
+ if( newDim <= 0)
|
||
+ e->Throw( "Array dimensions must be greater than 0.");
|
||
+
|
||
+ if( rank >= p)
|
||
+ {
|
||
+ SizeT oldDim = p0->Dim( p-1);
|
||
+
|
||
+ if( newDim > oldDim)
|
||
+ {
|
||
+ if( (newDim % oldDim) != 0)
|
||
+ e->Throw( "Result dimensions must be integer factor "
|
||
+ "of original dimensions.");
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ if( (oldDim % newDim) != 0)
|
||
+ e->Throw( "Result dimensions must be integer factor "
|
||
+ "of original dimensions.");
|
||
+ }
|
||
+ }
|
||
+
|
||
+ resDimInit[ p-1] = newDim;
|
||
+ }
|
||
+
|
||
+ dimension resDim( resDimInit, nParam-1);
|
||
+
|
||
+ static int sampleIx = e->KeywordIx( "SAMPLE");
|
||
+ bool sample = e->KeywordSet( sampleIx);
|
||
+
|
||
+ return p0->Rebin( resDim, sample);
|
||
+ }
|
||
+
|
||
+ BaseGDL* obj_class( EnvT* e)
|
||
+ {
|
||
+ SizeT nParam = e->NParam();
|
||
+
|
||
+ static int countIx = e->KeywordIx( "COUNT");
|
||
+ static int superIx = e->KeywordIx( "SUPERCLASS");
|
||
+
|
||
+ bool super = e->KeywordSet( superIx);
|
||
+
|
||
+ bool count = e->KeywordPresent( countIx);
|
||
+ if( count)
|
||
+ e->AssureGlobalKW( countIx);
|
||
+
|
||
+ if( nParam > 0)
|
||
+ {
|
||
+ BaseGDL* p0 = e->GetParDefined( 0);
|
||
+
|
||
+ if( p0->Type() != STRING && p0->Type() != OBJECT)
|
||
+ e->Throw( "Argument must be a scalar object reference or string: "+
|
||
+ e->GetParString(0));
|
||
+
|
||
+ if( !p0->Scalar())
|
||
+ e->Throw( "Expression must be a scalar or 1 element "
|
||
+ "array in this context: "+e->GetParString(0));
|
||
+
|
||
+ DStructDesc* objDesc;
|
||
+
|
||
+ if( p0->Type() == STRING)
|
||
+ {
|
||
+ DString objName;
|
||
+ e->AssureScalarPar<DStringGDL>( 0, objName);
|
||
+ objName = StrUpCase( objName);
|
||
+
|
||
+ objDesc = FindInStructList( structList, objName);
|
||
+ if( objDesc == NULL)
|
||
+ {
|
||
+ if( count)
|
||
+ e->SetKW( countIx, new DLongGDL( 0));
|
||
+ return new DStringGDL( "");
|
||
+ }
|
||
+ }
|
||
+ else // OBJECT
|
||
+ {
|
||
+ DObj objRef;
|
||
+ e->AssureScalarPar<DObjGDL>( 0, objRef);
|
||
+
|
||
+ if( objRef == 0)
|
||
+ {
|
||
+ if( count)
|
||
+ e->SetKW( countIx, new DLongGDL( 0));
|
||
+ return new DStringGDL( "");
|
||
+ }
|
||
+
|
||
+ DStructGDL* oStruct;
|
||
+ try {
|
||
+ oStruct = e->GetObjHeap( objRef);
|
||
+ }
|
||
+ catch ( GDLInterpreter::HeapException)
|
||
+ { // non valid object
|
||
+ if( count)
|
||
+ e->SetKW( countIx, new DLongGDL( 0));
|
||
+ return new DStringGDL( "");
|
||
+ }
|
||
+
|
||
+ objDesc = oStruct->Desc(); // cannot be NULL
|
||
+ }
|
||
+
|
||
+ if( !super)
|
||
+ {
|
||
+ if( count)
|
||
+ e->SetKW( countIx, new DLongGDL( 1));
|
||
+ return new DStringGDL( objDesc->Name());
|
||
+ }
|
||
+
|
||
+ deque< string> pNames;
|
||
+ objDesc->GetParentNames( pNames);
|
||
+
|
||
+ SizeT nNames = pNames.size();
|
||
+
|
||
+ if( count)
|
||
+ e->SetKW( countIx, new DLongGDL( nNames));
|
||
+
|
||
+ if( nNames == 0)
|
||
+ {
|
||
+ return new DStringGDL( "");
|
||
+ }
|
||
+
|
||
+ DStringGDL* res = new DStringGDL( dimension( nNames),
|
||
+ BaseGDL::NOZERO);
|
||
+
|
||
+ for( SizeT i=0; i<nNames; ++i)
|
||
+ {
|
||
+ (*res)[i] = pNames[i];
|
||
+ }
|
||
+
|
||
+ return res;
|
||
+ }
|
||
+
|
||
+ if( super)
|
||
+ e->Throw( "Conflicting keywords.");
|
||
+
|
||
+ SizeT nObj = structList.size();
|
||
+
|
||
+ DStringGDL* res = new DStringGDL( dimension( nObj),
|
||
+ BaseGDL::NOZERO);
|
||
+
|
||
+ for( SizeT i=0; i<nObj; ++i)
|
||
+ {
|
||
+ (*res)[i] = structList[i]->Name();
|
||
+ }
|
||
+
|
||
+ return res;
|
||
+ }
|
||
+
|
||
+ BaseGDL* obj_isa( EnvT* e)
|
||
+ {
|
||
+ SizeT nParam = e->NParam( 2);
|
||
+
|
||
+ BaseGDL* p0 = e->GetPar( 0);
|
||
+ if( p0 == NULL || p0->Type() != OBJECT)
|
||
+ e->Throw( "Object reference type required in this context: "+
|
||
+ e->GetParString(0));
|
||
+
|
||
+ DString className;
|
||
+ e->AssureScalarPar<DStringGDL>( 1, className);
|
||
+ className = StrUpCase( className);
|
||
+
|
||
+ DObjGDL* pObj = static_cast<DObjGDL*>( p0);
|
||
+
|
||
+ DByteGDL* res = new DByteGDL( pObj->Dim()); // zero
|
||
+
|
||
+ GDLInterpreter* interpreter = e->Interpreter();
|
||
+
|
||
+ SizeT nElem = pObj->N_Elements();
|
||
+ for( SizeT i=0; i<nElem; ++i)
|
||
+ {
|
||
+ if( interpreter->ObjValid( (*pObj)[ i]))
|
||
+ {
|
||
+ DStructGDL* oStruct = e->GetObjHeap( (*pObj)[i]);
|
||
+ if( oStruct->Desc()->IsParent( className))
|
||
+ (*res)[i] = 1;
|
||
+ }
|
||
+ }
|
||
+
|
||
+ return res;
|
||
+ }
|
||
+
|
||
+ BaseGDL* n_tags( EnvT* e)
|
||
+ {
|
||
+ e->NParam( 1);
|
||
+
|
||
+ BaseGDL* p0 = e->GetPar( 0);
|
||
+ if( p0 == NULL)
|
||
+ return new DLongGDL( 0);
|
||
+
|
||
+ if( p0->Type() != STRUCT)
|
||
+ return new DLongGDL( 0);
|
||
+
|
||
+ DStructGDL* s = static_cast<DStructGDL*>( p0);
|
||
+
|
||
+ static int lengthIx = e->KeywordIx( "LENGTH");
|
||
+ bool length = e->KeywordSet( lengthIx);
|
||
+
|
||
+ if( length)
|
||
+ return new DLongGDL( s->Sizeof());
|
||
+
|
||
+ return new DLongGDL( s->Desc()->NTags());
|
||
+ }
|
||
+
|
||
+ BaseGDL* bytscl( EnvT* e)
|
||
+ {
|
||
+ e->NParam( 1);
|
||
+
|
||
+ BaseGDL* p0=e->GetNumericParDefined( 0);
|
||
+
|
||
+ static int minIx = e->KeywordIx( "MIN");
|
||
+ static int maxIx = e->KeywordIx( "MAX");
|
||
+ static int topIx = e->KeywordIx( "TOP");
|
||
+ bool omitNaN = e->KeywordPresent( 3);
|
||
+
|
||
+ DLong topL=255;
|
||
+ if( e->GetKW( topIx) != NULL)
|
||
+ e->AssureLongScalarKW( topIx, topL);
|
||
+ DByte top = static_cast<DByte>(topL);
|
||
+ DDouble dTop = static_cast<DDouble>(top);
|
||
+
|
||
+ DDouble min;
|
||
+ bool minSet = false;
|
||
+ if( e->GetKW( minIx) != NULL)
|
||
+ {
|
||
+ e->AssureDoubleScalarKW( minIx, min);
|
||
+ minSet = true;
|
||
+ }
|
||
+
|
||
+ DDouble max;
|
||
+ bool maxSet = false;
|
||
+ if( e->GetKW( maxIx) != NULL)
|
||
+ {
|
||
+ e->AssureDoubleScalarKW( maxIx, max);
|
||
+ maxSet = true;
|
||
+ }
|
||
+
|
||
+ DDoubleGDL* dRes =
|
||
+ static_cast<DDoubleGDL*>(p0->Convert2( DOUBLE, BaseGDL::COPY));
|
||
+
|
||
+ DLong maxEl, minEl;
|
||
+ if( !maxSet || !minSet)
|
||
+ dRes->MinMax( &minEl, &maxEl, NULL, NULL, omitNaN);
|
||
+ if( !minSet)
|
||
+ min = (*dRes)[ minEl];
|
||
+ if( !maxSet)
|
||
+ max = (*dRes)[ maxEl];
|
||
+
|
||
+ SizeT nEl = dRes->N_Elements();
|
||
+ for( SizeT i=0; i<nEl; ++i)
|
||
+ {
|
||
+ DDouble& d = (*dRes)[ i];
|
||
+ if( d <= min)
|
||
+ (*dRes)[ i] = 0;
|
||
+ else if( d >= max)
|
||
+ (*dRes)[ i] = dTop;
|
||
+ else
|
||
+ (*dRes)[ i] = round((d - min) / (max-min) * dTop);
|
||
+ }
|
||
+
|
||
+ return dRes->Convert2( BYTE);
|
||
+ }
|
||
+
|
||
+ BaseGDL* strtok_fun( EnvT* e)
|
||
+ {
|
||
+ SizeT nParam=e->NParam( 1);
|
||
+
|
||
+ DString stringIn;
|
||
+ e->AssureStringScalarPar( 0, stringIn);
|
||
+
|
||
+ DString pattern = " \t";
|
||
+ if(nParam > 1) {
|
||
+ e->AssureStringScalarPar( 1, pattern);
|
||
+ }
|
||
+
|
||
+ static int extractIx = e->KeywordIx( "EXTRACT");
|
||
+ bool extract = e->KeywordSet( extractIx);
|
||
+
|
||
+ static int lengthIx = e->KeywordIx( "LENGTH");
|
||
+ bool lengthPresent = e->KeywordPresent( lengthIx);
|
||
+
|
||
+ if( extract && lengthPresent)
|
||
+ e->Throw( "Conflicting keywords.");
|
||
+
|
||
+ static int pre0Ix = e->KeywordIx( "PRESERVE_NULL");
|
||
+ bool pre0 = e->KeywordSet( pre0Ix);
|
||
+
|
||
+ static int regexIx = e->KeywordIx( "REGEX");
|
||
+ bool regex = e->KeywordPresent( regexIx);
|
||
+ char err_msg[MAX_REGEXPERR_LENGTH];
|
||
+ regex_t regexp;
|
||
+
|
||
+ deque<long> tokenStart;
|
||
+ deque<long> tokenLen;
|
||
+
|
||
+ int strLen = stringIn.length();
|
||
+
|
||
+ DString escape = "";
|
||
+ e->AssureStringScalarKWIfPresent( "ESCAPE", escape);
|
||
+ deque<long> escList;
|
||
+ long pos = 0;
|
||
+ while(pos != string::npos)
|
||
+ {
|
||
+ pos = stringIn.find_first_of( escape, pos);
|
||
+ if( pos != string::npos)
|
||
+ {
|
||
+ escList.push_back( pos+1); // remember escaped char
|
||
+ pos += 2; // skip escaped char
|
||
+ }
|
||
+ }
|
||
+ deque<long>::iterator escBeg = escList.begin();
|
||
+ deque<long>::iterator escEnd = escList.end();
|
||
+
|
||
+ long tokB = 0;
|
||
+ long tokE;
|
||
+ long nextE = 0;
|
||
+ long actLen;
|
||
+
|
||
+ // If regex then compile regex
|
||
+ if( regex) {
|
||
+ if (pattern == " \t") pattern = " "; // regcomp doesn't like "\t" JMG
|
||
+ int compRes = regcomp( ®exp, pattern.c_str(), REG_EXTENDED);
|
||
+ if (compRes) {
|
||
+ regerror(compRes, ®exp, err_msg, MAX_REGEXPERR_LENGTH);
|
||
+ throw GDLException(e->CallingNode(),
|
||
+ "STREGEX: Error processing regular expression: "+
|
||
+ pattern+"\n "+string(err_msg)+".");
|
||
+ }
|
||
+ }
|
||
+
|
||
+ for(;;)
|
||
+ {
|
||
+ regmatch_t pmatch[1];
|
||
+ if( regex) {
|
||
+ int matchres = regexec( ®exp, stringIn.c_str()+nextE, 1, pmatch, 0);
|
||
+ tokE = matchres? -1:pmatch[0].rm_so;
|
||
+ } else {
|
||
+ tokE = stringIn.find_first_of( pattern, nextE);
|
||
+ }
|
||
+
|
||
+ if( tokE == string::npos)
|
||
+ {
|
||
+ actLen = strLen - tokB;
|
||
+ if( actLen > 0 || pre0)
|
||
+ {
|
||
+ tokenStart.push_back( tokB);
|
||
+ tokenLen.push_back( actLen);
|
||
+ }
|
||
+ break;
|
||
+ }
|
||
+
|
||
+ if( find( escBeg, escEnd, tokE) == escEnd)
|
||
+ {
|
||
+ if (regex) actLen = tokE; else actLen = tokE - tokB;
|
||
+ if( actLen > 0 || pre0)
|
||
+ {
|
||
+ tokenStart.push_back( tokB);
|
||
+ tokenLen.push_back( actLen);
|
||
+ }
|
||
+ if (regex) tokB += pmatch[0].rm_eo; else tokB = tokE + 1;
|
||
+ }
|
||
+ if (regex) nextE += pmatch[0].rm_eo; else nextE = tokE + 1;
|
||
+ } // for(;;)
|
||
+
|
||
+ if (regex) regfree( ®exp);
|
||
+
|
||
+ SizeT nTok = tokenStart.size();
|
||
+
|
||
+ if( !extract)
|
||
+ {
|
||
+ dimension dim(nTok);
|
||
+ if( lengthPresent)
|
||
+ {
|
||
+ e->AssureGlobalKW( lengthIx);
|
||
+
|
||
+ if( nTok > 0)
|
||
+ {
|
||
+ DLongGDL* len = new DLongGDL(dim);
|
||
+ for(int i=0; i < nTok; i++)
|
||
+ (*len)[i] = tokenLen[i];
|
||
+
|
||
+ e->SetKW( lengthIx, len);
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ e->SetKW( lengthIx, new DLongGDL( 0));
|
||
+ }
|
||
+ }
|
||
+
|
||
+ if( nTok == 0) return new DLongGDL( 0);
|
||
+
|
||
+ DLongGDL* d = new DLongGDL(dim);
|
||
+ for(int i=0; i < nTok; i++)
|
||
+ (*d)[i] = tokenStart[i];
|
||
+ return d;
|
||
+ }
|
||
+
|
||
+ // EXTRACT
|
||
+ if( nTok == 0) return new DStringGDL( "");
|
||
+
|
||
+ dimension dim(nTok);
|
||
+ DStringGDL *d = new DStringGDL(dim);
|
||
+ for(int i=0; i < nTok; i++)
|
||
+ {
|
||
+ (*d)[i] = stringIn.substr(tokenStart[i], tokenLen[i]);
|
||
+
|
||
+ // remove escape
|
||
+ DString& act = (*d)[i];
|
||
+ long escPos = act.find_first_of( escape, 0);
|
||
+ while( escPos != string::npos)
|
||
+ {
|
||
+ act = act.substr( 0, escPos)+act.substr( escPos+1);
|
||
+ escPos = act.find_first_of( escape, escPos+1);
|
||
+ }
|
||
+ }
|
||
+ return d;
|
||
+ }
|
||
+
|
||
+ BaseGDL* getenv_fun( EnvT* e)
|
||
+ {
|
||
+ SizeT nParam=e->NParam();
|
||
+
|
||
+ static int environmentIx = e->KeywordIx( "ENVIRONMENT" );
|
||
+ bool environment = e->KeywordSet( environmentIx );
|
||
+
|
||
+ SizeT nEnv;
|
||
+ DStringGDL* env;
|
||
+
|
||
+ if( environment) {
|
||
+ // determine number of environment entries
|
||
+ for(nEnv = 0; environ[nEnv] != NULL ; ++nEnv);
|
||
+
|
||
+ dimension dim( nEnv );
|
||
+ env = new DStringGDL(dim);
|
||
+
|
||
+ // copy stuff into local string array
|
||
+ for(SizeT i=0; i < nEnv ; ++i)
|
||
+ (*env)[i] = environ[i];
|
||
+
|
||
+ } else {
|
||
+
|
||
+ if(nParam != 1)
|
||
+ e->Throw( "Incorrect number of arguments.");
|
||
+
|
||
+ DStringGDL* name = e->GetParAs<DStringGDL>(0);
|
||
+ nEnv = name->N_Elements();
|
||
+
|
||
+ env = new DStringGDL( name->Dim());
|
||
+
|
||
+ // copy the stuff into local string only if param found
|
||
+ char *resPtr;
|
||
+ for(SizeT i=0; i < nEnv ; ++i)
|
||
+ {
|
||
+ // handle special environment variables
|
||
+ // GDL_TMPDIR, IDL_TMPDIR
|
||
+ if( (*name)[i] == "GDL_TMPDIR" || (*name)[i] == "IDL_TMPDIR")
|
||
+ {
|
||
+ resPtr = getenv((*name)[i].c_str());
|
||
+
|
||
+ if( resPtr != NULL)
|
||
+ (*env)[i] = resPtr;
|
||
+ else
|
||
+ (*env)[i] = SysVar::Dir();
|
||
+
|
||
+ AppendIfNeeded( (*env)[i], "/");
|
||
+ }
|
||
+ else // normal environment variables
|
||
+ if( (resPtr = getenv((*name)[i].c_str())) )
|
||
+ (*env)[i] = resPtr;
|
||
+ }
|
||
+ }
|
||
+
|
||
+ return env;
|
||
+ }
|
||
+
|
||
+ BaseGDL* tag_names_fun( EnvT* e)
|
||
+ {
|
||
+ SizeT nParam=e->NParam();
|
||
+ DStructGDL* struc= e->GetParAs<DStructGDL>(0);
|
||
+
|
||
+ static int structureNameIx = e->KeywordIx( "STRUCTURE_NAME" );
|
||
+ bool structureName = e->KeywordSet( structureNameIx );
|
||
+
|
||
+ DStringGDL* tagNames;
|
||
+
|
||
+ if(structureName){
|
||
+
|
||
+ if ((*struc).Desc()->Name() != "$truct")
|
||
+ tagNames = new DStringGDL((*struc).Desc()->Name());
|
||
+ else
|
||
+ tagNames = new DStringGDL("");
|
||
+
|
||
+ } else {
|
||
+ SizeT nTags = (*struc).Desc()->NTags();
|
||
+
|
||
+ tagNames = new DStringGDL(dimension(nTags));
|
||
+ for(int i=0; i < nTags; ++i)
|
||
+ (*tagNames)[i] = (*struc).Desc()->TagName(i);
|
||
+ }
|
||
+
|
||
+ return tagNames;
|
||
+ }
|
||
+
|
||
+ BaseGDL* stregex_fun( EnvT* e)
|
||
+ {
|
||
+ SizeT nParam=e->NParam( 2);
|
||
+
|
||
+ DStringGDL* stringExpr= e->GetParAs<DStringGDL>(0);
|
||
+ DString pattern;
|
||
+ e->AssureStringScalarPar(1, pattern);
|
||
+
|
||
+ static int booleanIx = e->KeywordIx( "BOOLEAN" );
|
||
+ bool booleanKW = e->KeywordSet( booleanIx );
|
||
+
|
||
+ static int extractIx = e->KeywordIx( "EXTRACT" );
|
||
+ bool extractKW = e->KeywordSet( extractIx );
|
||
+
|
||
+ static int foldCaseIx = e->KeywordIx( "FOLD_CASE" );
|
||
+ bool foldCaseKW = e->KeywordSet( foldCaseIx );
|
||
+
|
||
+ //XXXpch: this is wrong, should check arg_present
|
||
+ static int lengthIx = e->KeywordIx( "LENGTH" );
|
||
+ bool lengthKW = e->KeywordSet( lengthIx );
|
||
+
|
||
+ static int subexprIx = e->KeywordIx( "SUBEXPR" );
|
||
+ bool subexprKW = e->KeywordSet( subexprIx );
|
||
+
|
||
+ if( booleanKW && (subexprKW || extractKW || lengthKW))
|
||
+ e->Throw( "Conflicting keywords.");
|
||
+ // if( subexprKW)
|
||
+ // e->Throw( "Subexpression not yet implemented.");
|
||
+
|
||
+
|
||
+ int nStr = stringExpr->N_Elements();
|
||
+ dimension dim = stringExpr->Dim();
|
||
+
|
||
+ DLongGDL* len;
|
||
+ if( lengthKW) {
|
||
+ e->AssureGlobalKW( lengthIx);
|
||
+ len = new DLongGDL(dim);
|
||
+ }
|
||
+
|
||
+ BaseGDL* result;
|
||
+
|
||
+ if( booleanKW)
|
||
+ result = new DByteGDL(dim);
|
||
+ else if( extractKW && !subexprKW)
|
||
+ result = new DStringGDL(dim);
|
||
+ else
|
||
+ result = new DLongGDL(dim);
|
||
+
|
||
+ char err_msg[MAX_REGEXPERR_LENGTH];
|
||
+
|
||
+ // set the compile flags
|
||
+ int cflags = REG_EXTENDED;
|
||
+ if (foldCaseKW)
|
||
+ cflags |= REG_ICASE;
|
||
+ if (booleanKW)
|
||
+ cflags |= REG_NOSUB;
|
||
+
|
||
+ // cout << pattern.c_str() << endl;
|
||
+
|
||
+ // compile the regular expression
|
||
+ regex_t regexp;
|
||
+ int compRes = regcomp( ®exp, pattern.c_str(), cflags);
|
||
+
|
||
+ if (compRes) {
|
||
+ regerror(compRes, ®exp, err_msg, MAX_REGEXPERR_LENGTH);
|
||
+ throw GDLException(e->CallingNode(),
|
||
+ "STREGEX: Error processing regular expression: "+
|
||
+ pattern+"\n "+string(err_msg)+".");
|
||
+ }
|
||
+
|
||
+ int nmatch = 1;
|
||
+ if( subexprKW) nmatch = 16;
|
||
+
|
||
+ regmatch_t pmatch[16];
|
||
+ int eflags = 0;
|
||
+
|
||
+ // now match towards the string
|
||
+ int matchres = regexec( ®exp, (*stringExpr)[0].c_str(),
|
||
+ nmatch, pmatch, eflags);
|
||
+
|
||
+ // subexpressions
|
||
+ if ( extractKW && subexprKW) {
|
||
+
|
||
+ // Find number of subexpressions
|
||
+ SizeT nOut = 0;
|
||
+ for( SizeT i = 0; i<nmatch; ++i) {
|
||
+ if ( pmatch[i].rm_so == -1) break;
|
||
+ nOut++;
|
||
+ }
|
||
+
|
||
+ // Loop through subexpressions & fill output array
|
||
+ dim << nOut;
|
||
+ result = new DStringGDL(dim);
|
||
+ for( SizeT i = 0; i<nOut; ++i) {
|
||
+ (* static_cast<DStringGDL*>(result))[i] =
|
||
+ (*stringExpr)[0].substr( pmatch[i].rm_so,
|
||
+ pmatch[i].rm_eo - pmatch[i].rm_so);
|
||
+ }
|
||
+ } else {
|
||
+ if( booleanKW)
|
||
+ (* static_cast<DByteGDL*>(result)) = (matchres == 0);
|
||
+ else if ( extractKW)
|
||
+ (* static_cast<DStringGDL*>(result))[0] =
|
||
+ (*stringExpr)[0].substr( pmatch[0].rm_so,
|
||
+ pmatch[0].rm_eo - pmatch[0].rm_so);
|
||
+ else
|
||
+ (* static_cast<DLongGDL*>(result))[0] = matchres? -1:pmatch[0].rm_so;
|
||
+ }
|
||
+
|
||
+ if( lengthKW)
|
||
+ (*len)[0] = pmatch[0].rm_eo - pmatch[0].rm_so;
|
||
+
|
||
+
|
||
+ regfree( ®exp);
|
||
+
|
||
+ if( lengthKW)
|
||
+ e->SetKW( lengthIx, len);
|
||
+
|
||
+ return result;
|
||
+ }
|
||
+
|
||
+ BaseGDL* routine_info( EnvT* e)
|
||
+ {
|
||
+ SizeT nParam=e->NParam();
|
||
+
|
||
+ static int functionsIx = e->KeywordIx( "FUNCTIONS" );
|
||
+ bool functionsKW = e->KeywordSet( functionsIx );
|
||
+ static int systemIx = e->KeywordIx( "SYSTEM" );
|
||
+ bool systemKW = e->KeywordSet( systemIx );
|
||
+ static int disabledIx = e->KeywordIx( "DISABLED" );
|
||
+ bool disabledKW = e->KeywordSet( disabledIx );
|
||
+
|
||
+ // GDL does not have disabled routines
|
||
+ if( disabledKW) return new DStringGDL("");
|
||
+
|
||
+ // if( functionsKW || systemKW || nParam == 0)
|
||
+ // {
|
||
+ deque<DString> subList;
|
||
+
|
||
+ if( functionsKW)
|
||
+ {
|
||
+ if( systemKW)
|
||
+ {
|
||
+ SizeT n = libFunList.size();
|
||
+ if( n == 0) return new DStringGDL("");
|
||
+
|
||
+ DStringGDL* res = new DStringGDL( dimension( n), BaseGDL::NOZERO);
|
||
+ for( SizeT i = 0; i<n; ++i)
|
||
+ (*res)[i] = libFunList[ i]->ObjectName();
|
||
+
|
||
+ return res;
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ SizeT n = funList.size();
|
||
+ if( n == 0) return new DStringGDL("");
|
||
+ subList.resize( n);
|
||
+
|
||
+ for( SizeT i = 0; i<n; ++i)
|
||
+ subList.push_back( funList[ i]->ObjectName());
|
||
+ }
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ if( systemKW)
|
||
+ {
|
||
+ SizeT n = libProList.size();
|
||
+ if( n == 0) return new DStringGDL("");
|
||
+
|
||
+ DStringGDL* res = new DStringGDL( dimension( n), BaseGDL::NOZERO);
|
||
+ for( SizeT i = 0; i<n; ++i)
|
||
+ (*res)[i] = libProList[ i]->ObjectName();
|
||
+
|
||
+ return res;
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ SizeT n = proList.size();
|
||
+ if( n == 0) return new DStringGDL("");
|
||
+ subList.resize( n);
|
||
+
|
||
+ for( SizeT i = 0; i<n; ++i)
|
||
+ subList.push_back( proList[ i]->ObjectName());
|
||
+ }
|
||
+ }
|
||
+
|
||
+ sort( subList.begin(), subList.end());
|
||
+ SizeT nS = subList.size();
|
||
+
|
||
+ DStringGDL* res = new DStringGDL( dimension( nS), BaseGDL::NOZERO);
|
||
+ for( SizeT s=0; s<nS; ++s)
|
||
+ (*res)[ s] = subList[ s];
|
||
+
|
||
+ return res;
|
||
+ // }
|
||
+ }
|
||
+
|
||
+ BaseGDL* temporary( EnvT* e)
|
||
+ {
|
||
+ SizeT nParam=e->NParam(1);
|
||
+
|
||
+ BaseGDL** p0 = &e->GetParDefined( 0);
|
||
+
|
||
+ BaseGDL* ret = *p0;
|
||
+
|
||
+ *p0 = NULL; // make parameter undefined
|
||
+ return ret;
|
||
+ }
|
||
+
|
||
+
|
||
+ inline DByte StrCmp( const string& s1, const string& s2, DLong n)
|
||
+ {
|
||
+ if( n <= 0) return 1;
|
||
+ if( s1.substr(0,n) == s2.substr(0,n)) return 1;
|
||
+ return 0;
|
||
+ }
|
||
+ inline DByte StrCmp( const string& s1, const string& s2)
|
||
+ {
|
||
+ if( s1 == s2) return 1;
|
||
+ return 0;
|
||
+ }
|
||
+ inline DByte StrCmpFold( const string& s1, const string& s2, DLong n)
|
||
+ {
|
||
+ if( n <= 0) return 1;
|
||
+ if( StrUpCase( s1.substr(0,n)) == StrUpCase(s2.substr(0,n))) return 1;
|
||
+ return 0;
|
||
+ }
|
||
+ inline DByte StrCmpFold( const string& s1, const string& s2)
|
||
+ {
|
||
+ if( StrUpCase( s1) == StrUpCase(s2)) return 1;
|
||
+ return 0;
|
||
+ }
|
||
+
|
||
+ BaseGDL* strcmp_fun( EnvT* e)
|
||
+ {
|
||
+ SizeT nParam=e->NParam(2);
|
||
+
|
||
+ DStringGDL* s0 = static_cast<DStringGDL*>( e->GetParAs< DStringGDL>( 0));
|
||
+ DStringGDL* s1 = static_cast<DStringGDL*>( e->GetParAs< DStringGDL>( 1));
|
||
+
|
||
+ DLongGDL* l2 = NULL;
|
||
+ if( nParam > 2)
|
||
+ {
|
||
+ l2 = static_cast<DLongGDL*>( e->GetParAs< DLongGDL>( 2));
|
||
+ }
|
||
+
|
||
+ static int foldIx = e->KeywordIx( "FOLD_CASE");
|
||
+ bool fold = e->KeywordSet( foldIx );
|
||
+
|
||
+ if( s0->Scalar() && s1->Scalar())
|
||
+ {
|
||
+ if( l2 == NULL)
|
||
+ {
|
||
+ if( fold)
|
||
+ return new DByteGDL( StrCmpFold( (*s0)[0], (*s1)[0]));
|
||
+ else
|
||
+ return new DByteGDL( StrCmp( (*s0)[0], (*s1)[0]));
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ DByteGDL* res = new DByteGDL( l2->Dim(), BaseGDL::NOZERO);
|
||
+ SizeT nEl = l2->N_Elements();
|
||
+ if( fold)
|
||
+ for( SizeT i=0; i<nEl; ++i)
|
||
+ (*res)[i] = StrCmpFold( (*s0)[0], (*s1)[0], (*l2)[i]);
|
||
+ else
|
||
+ for( SizeT i=0; i<nEl; ++i)
|
||
+ (*res)[i] = StrCmp( (*s0)[0], (*s1)[0], (*l2)[i]);
|
||
+ return res;
|
||
+ }
|
||
+ }
|
||
+ else // at least one array
|
||
+ {
|
||
+ if( l2 == NULL)
|
||
+ {
|
||
+ if( s0->Scalar())
|
||
+ {
|
||
+ DByteGDL* res = new DByteGDL( s1->Dim(), BaseGDL::NOZERO);
|
||
+ SizeT nEl = s1->N_Elements();
|
||
+ if( fold)
|
||
+ for( SizeT i=0; i<nEl; ++i)
|
||
+ (*res)[i] = StrCmpFold( (*s0)[0], (*s1)[i]);
|
||
+ else
|
||
+ for( SizeT i=0; i<nEl; ++i)
|
||
+ (*res)[i] = StrCmp( (*s0)[0], (*s1)[i]);
|
||
+ return res;
|
||
+ }
|
||
+ else if( s1->Scalar())
|
||
+ {
|
||
+ DByteGDL* res = new DByteGDL( s0->Dim(), BaseGDL::NOZERO);
|
||
+ SizeT nEl = s0->N_Elements();
|
||
+ if( fold)
|
||
+ for( SizeT i=0; i<nEl; ++i)
|
||
+ (*res)[i] = StrCmpFold( (*s0)[i], (*s1)[0]);
|
||
+ else
|
||
+ for( SizeT i=0; i<nEl; ++i)
|
||
+ (*res)[i] = StrCmp( (*s0)[i], (*s1)[0]);
|
||
+ return res;
|
||
+ }
|
||
+ else // both arrays
|
||
+ {
|
||
+ DByteGDL* res;
|
||
+ SizeT nEl;
|
||
+ if( s0->N_Elements() <= s1->N_Elements())
|
||
+ {
|
||
+ res = new DByteGDL( s0->Dim(), BaseGDL::NOZERO);
|
||
+ nEl = s0->N_Elements();
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ res = new DByteGDL( s1->Dim(), BaseGDL::NOZERO);
|
||
+ nEl = s1->N_Elements();
|
||
+ }
|
||
+ if( fold)
|
||
+ for( SizeT i=0; i<nEl; ++i)
|
||
+ (*res)[i] = StrCmpFold( (*s0)[i], (*s1)[0]);
|
||
+ else
|
||
+ for( SizeT i=0; i<nEl; ++i)
|
||
+ (*res)[i] = StrCmp( (*s0)[i], (*s1)[0]);
|
||
+ return res;
|
||
+ }
|
||
+ }
|
||
+ else // l2 != NULL
|
||
+ {
|
||
+ DByteGDL* res;
|
||
+ SizeT nEl;
|
||
+ bool l2Scalar = l2->Scalar();
|
||
+ if( s0->Scalar())
|
||
+ {
|
||
+ if( l2Scalar || s1->N_Elements() <= l2->N_Elements())
|
||
+ {
|
||
+ res = new DByteGDL( s1->Dim(), BaseGDL::NOZERO);
|
||
+ nEl = s1->N_Elements();
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ res = new DByteGDL( l2->Dim(), BaseGDL::NOZERO);
|
||
+ nEl = l2->N_Elements();
|
||
+ }
|
||
+ if( fold)
|
||
+ for( SizeT i=0; i<nEl; ++i)
|
||
+ (*res)[i] = StrCmpFold( (*s0)[0], (*s1)[i], (*l2)[l2Scalar?0:i]);
|
||
+ else
|
||
+ for( SizeT i=0; i<nEl; ++i)
|
||
+ (*res)[i] = StrCmp( (*s0)[0], (*s1)[i], (*l2)[l2Scalar?0:i]);
|
||
+ return res;
|
||
+ }
|
||
+ else if( s1->Scalar())
|
||
+ {
|
||
+ if( l2Scalar || s0->N_Elements() <= l2->N_Elements())
|
||
+ {
|
||
+ res = new DByteGDL( s0->Dim(), BaseGDL::NOZERO);
|
||
+ nEl = s0->N_Elements();
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ res = new DByteGDL( l2->Dim(), BaseGDL::NOZERO);
|
||
+ nEl = l2->N_Elements();
|
||
+ }
|
||
+ if( fold)
|
||
+ for( SizeT i=0; i<nEl; ++i)
|
||
+ (*res)[i] = StrCmpFold( (*s0)[i], (*s1)[0], (*l2)[l2Scalar?0:i]);
|
||
+ else
|
||
+ for( SizeT i=0; i<nEl; ++i)
|
||
+ (*res)[i] = StrCmp( (*s0)[i], (*s1)[0], (*l2)[l2Scalar?0:i]);
|
||
+ return res;
|
||
+ }
|
||
+ else // s1 and s2 are arrays
|
||
+ {
|
||
+ if( l2Scalar)
|
||
+ if( s0->N_Elements() <= s1->N_Elements())
|
||
+ {
|
||
+ res = new DByteGDL( s0->Dim(), BaseGDL::NOZERO);
|
||
+ nEl = s0->N_Elements();
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ res = new DByteGDL( s1->Dim(), BaseGDL::NOZERO);
|
||
+ nEl = s1->N_Elements();
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ if( s0->N_Elements() <= s1->N_Elements())
|
||
+ if( s0->N_Elements() <= l2->N_Elements())
|
||
+ {
|
||
+ res = new DByteGDL( s0->Dim(), BaseGDL::NOZERO);
|
||
+ nEl = s0->N_Elements();
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ res = new DByteGDL( l2->Dim(), BaseGDL::NOZERO);
|
||
+ nEl = l2->N_Elements();
|
||
+ }
|
||
+ else
|
||
+ if( s1->N_Elements() <= l2->N_Elements())
|
||
+ {
|
||
+ res = new DByteGDL( s1->Dim(), BaseGDL::NOZERO);
|
||
+ nEl = s1->N_Elements();
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ res = new DByteGDL( l2->Dim(), BaseGDL::NOZERO);
|
||
+ nEl = l2->N_Elements();
|
||
+ }
|
||
+ }
|
||
+ if( fold)
|
||
+ for( SizeT i=0; i<nEl; ++i)
|
||
+ (*res)[i] = StrCmpFold( (*s0)[i], (*s1)[i], (*l2)[l2Scalar?0:i]);
|
||
+ else
|
||
+ for( SizeT i=0; i<nEl; ++i)
|
||
+ (*res)[i] = StrCmp( (*s0)[i], (*s1)[i], (*l2)[l2Scalar?0:i]);
|
||
+ return res;
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+
|
||
+ string TagName( EnvT* e, const string& name)
|
||
+ {
|
||
+ string n = StrUpCase( name);
|
||
+ SizeT len = n.size();
|
||
+ if( n[0] != '_' && (n[0] < 'A' || n[0] > 'Z'))
|
||
+ e->Throw( "Illegal tag name: "+name+".");
|
||
+ for( SizeT i=1; i<len; ++i)
|
||
+ {
|
||
+ if( n[i] == ' ')
|
||
+ n[i] = '_';
|
||
+ else
|
||
+ if( n[i] != '_' && n[i] != '$' &&
|
||
+ (n[i] < 'A' || n[i] > 'Z') &&
|
||
+ (n[i] < '0' || n[i] > '9'))
|
||
+ e->Throw( "Illegal tag name: "+name+".");
|
||
+ }
|
||
+ return n;
|
||
+ }
|
||
+
|
||
+ BaseGDL* create_struct( EnvT* e)
|
||
+ {
|
||
+ static int nameIx = e->KeywordIx( "NAME" );
|
||
+ DString name = "$truct";
|
||
+ if( e->KeywordPresent( nameIx)) {
|
||
+ // Check if name exists, if not then treat as unnamed
|
||
+ if (e->GetKW( nameIx) != NULL)
|
||
+ e->AssureStringScalarKW( nameIx, name);
|
||
+ }
|
||
+
|
||
+ if( name != "$truct") // named struct
|
||
+ {
|
||
+ name = StrUpCase( name);
|
||
+
|
||
+ SizeT nParam=e->NParam();
|
||
+
|
||
+ if( nParam == 0)
|
||
+ {
|
||
+ DStructDesc* desc =
|
||
+ e->Interpreter()->GetStruct( name, e->CallingNode());
|
||
+
|
||
+ dimension dim( 1);
|
||
+ return new DStructGDL( desc, dim);
|
||
+ }
|
||
+
|
||
+ DStructDesc* nStructDesc;
|
||
+ auto_ptr<DStructDesc> nStructDescGuard;
|
||
+
|
||
+ DStructDesc* oStructDesc=
|
||
+ FindInStructList( structList, name);
|
||
+
|
||
+ if( oStructDesc == NULL || oStructDesc->NTags() > 0)
|
||
+ {
|
||
+ // not defined at all yet (-> define now)
|
||
+ // or completely defined (-> define now and check equality)
|
||
+ nStructDesc= new DStructDesc( name);
|
||
+
|
||
+ // guard it
|
||
+ nStructDescGuard.reset( nStructDesc);
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ // NTags() == 0
|
||
+ // not completely defined (only name in list)
|
||
+ nStructDesc= oStructDesc;
|
||
+ }
|
||
+
|
||
+ // the instance variable
|
||
+ // dimension dim( 1);
|
||
+ // DStructGDL* instance = new DStructGDL( nStructDesc, dim);
|
||
+ DStructGDL* instance = new DStructGDL( nStructDesc);
|
||
+ auto_ptr<DStructGDL> instance_guard(instance);
|
||
+
|
||
+ for( SizeT p=0; p<nParam; ++p)
|
||
+ {
|
||
+ BaseGDL* par = e->GetParDefined( p);
|
||
+ DStructGDL* parStruct = dynamic_cast<DStructGDL*>( par);
|
||
+ if( parStruct != NULL)
|
||
+ {
|
||
+ // add struct
|
||
+ if( !parStruct->Scalar())
|
||
+ e->Throw("Expression must be a scalar in this context: "+
|
||
+ e->GetParString( p));
|
||
+
|
||
+ DStructDesc* desc = parStruct->Desc();
|
||
+ for( SizeT t=0; t< desc->NTags(); ++t)
|
||
+ {
|
||
+ instance->NewTag( desc->TagName( t),
|
||
+ parStruct->GetTag( t)->Dup());
|
||
+ }
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ // add tag value pair
|
||
+ DStringGDL* tagNames = e->GetParAs<DStringGDL>( p);
|
||
+ SizeT nTags = tagNames->N_Elements();
|
||
+
|
||
+ SizeT tagStart = p+1;
|
||
+ SizeT tagEnd = p+nTags;
|
||
+ if( tagEnd >= nParam)
|
||
+ e->Throw( "Incorrect number of arguments.");
|
||
+
|
||
+ do{
|
||
+ ++p;
|
||
+ BaseGDL* value = e->GetParDefined( p);
|
||
+
|
||
+ // add
|
||
+ instance->NewTag( TagName( e, (*tagNames)[ p-tagStart]),
|
||
+ value->Dup());
|
||
+ }
|
||
+ while( p<tagEnd);
|
||
+ }
|
||
+ }
|
||
+
|
||
+ if( oStructDesc != NULL)
|
||
+ {
|
||
+ if( oStructDesc != nStructDesc)
|
||
+ {
|
||
+ oStructDesc->AssureIdentical(nStructDesc);
|
||
+ instance->DStructGDL::SetDesc(oStructDesc);
|
||
+ //delete nStructDesc; // auto_ptr
|
||
+ }
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ // release from guard (if not NULL)
|
||
+ nStructDescGuard.release();
|
||
+ // insert into struct list
|
||
+ structList.push_back(nStructDesc);
|
||
+ }
|
||
+
|
||
+ instance_guard.release();
|
||
+ return instance;
|
||
+ }
|
||
+ else
|
||
+ { // unnamed struc
|
||
+
|
||
+ // Handle case of single structure parameter
|
||
+ SizeT nParam;
|
||
+ nParam = e->NParam();
|
||
+ BaseGDL* par = e->GetParDefined( 0);
|
||
+ DStructGDL* parStruct = dynamic_cast<DStructGDL*>( par);
|
||
+ if (nParam != 1 || parStruct == NULL)
|
||
+ nParam=e->NParam(2);
|
||
+
|
||
+ DStructDesc* nStructDesc = new DStructDesc( "$truct");
|
||
+ // instance takes care of nStructDesc since it is unnamed
|
||
+ // dimension dim( 1);
|
||
+ // DStructGDL* instance = new DStructGDL( nStructDesc, dim);
|
||
+ DStructGDL* instance = new DStructGDL( nStructDesc);
|
||
+ auto_ptr<DStructGDL> instance_guard(instance);
|
||
+
|
||
+ for( SizeT p=0; p<nParam;)
|
||
+ {
|
||
+ BaseGDL* par = e->GetParDefined( p);
|
||
+ DStructGDL* parStruct = dynamic_cast<DStructGDL*>( par);
|
||
+ if( parStruct != NULL)
|
||
+ {
|
||
+ // add struct
|
||
+ if( !parStruct->Scalar())
|
||
+ e->Throw("Expression must be a scalar in this context: "+
|
||
+ e->GetParString( p));
|
||
+
|
||
+ DStructDesc* desc = parStruct->Desc();
|
||
+ for( SizeT t=0; t< desc->NTags(); ++t)
|
||
+ {
|
||
+ instance->NewTag( desc->TagName( t),
|
||
+ parStruct->GetTag( t)->Dup());
|
||
+ }
|
||
+ ++p;
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ // add tag value pair
|
||
+ DStringGDL* tagNames = e->GetParAs<DStringGDL>( p);
|
||
+ SizeT nTags = tagNames->N_Elements();
|
||
+
|
||
+ SizeT tagStart = p+1;
|
||
+ SizeT tagEnd = p+nTags;
|
||
+ if( tagEnd >= nParam)
|
||
+ e->Throw( "Incorrect number of arguments.");
|
||
+
|
||
+ for(++p; p<=tagEnd; ++p)
|
||
+ {
|
||
+ BaseGDL* value = e->GetParDefined( p);
|
||
+
|
||
+ // add
|
||
+ instance->NewTag( TagName( e, (*tagNames)[ p-tagStart]),
|
||
+ value->Dup());
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+
|
||
+ instance_guard.release();
|
||
+ return instance;
|
||
+ }
|
||
+ }
|
||
+
|
||
+ BaseGDL* rotate( EnvT* e)
|
||
+ {
|
||
+ e->NParam(2);
|
||
+
|
||
+ BaseGDL* p0 = e->GetParDefined( 0);
|
||
+ if( p0->Rank() != 1 && p0->Rank() != 2)
|
||
+ e->Throw( "Expression must be a scalar or 1 element array in this context: "+
|
||
+ e->GetParString( 0));
|
||
+
|
||
+ if( p0->Type() == STRUCT)
|
||
+ e->Throw( "STRUCT expression not allowed in this context: "+
|
||
+ e->GetParString( 0));
|
||
+
|
||
+ DLong dir;
|
||
+ e->AssureLongScalarPar( 1, dir);
|
||
+
|
||
+ return p0->Rotate( dir);
|
||
+ }
|
||
+
|
||
+} // namespace
|
||
+
|
||
diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc2/src/gdlc.g cvs/gdl/src/gdlc.g
|
||
--- gdl-0.9rc2/src/gdlc.g 2009-01-20 12:33:55.000000000 -0700
|
||
+++ cvs/gdl/src/gdlc.g 2009-01-26 09:43:54.000000000 -0700
|
||
@@ -242,6 +242,7 @@
|
||
compileOpt=NONE; // reset compileOpt
|
||
if( subReached) goto bailOut;
|
||
}
|
||
+ | common_block
|
||
)* // optional - only main program is also ok
|
||
|
||
( statement_list END! (end_unit)? )? // $MAIN$ program
|
||
Only in gdl-0.9rc2/src: gdlc.i.noopt.g
|
||
Only in gdl-0.9rc2/src: gdlc.i.opt.g
|
||
Only in gdl-0.9rc2/src: gdlc.i.rc1.g
|
||
diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc2/src/gdlc.tree.g cvs/gdl/src/gdlc.tree.g
|
||
--- gdl-0.9rc2/src/gdlc.tree.g 2009-01-20 12:33:56.000000000 -0700
|
||
+++ cvs/gdl/src/gdlc.tree.g 2009-01-26 09:43:54.000000000 -0700
|
||
@@ -177,12 +177,46 @@
|
||
|
||
// file parsing
|
||
translation_unit
|
||
+{
|
||
+ bool mainStarted = false;
|
||
+}
|
||
: ( options {greedy=true;}: procedure_def
|
||
- | function_def
|
||
- | forward_function)*
|
||
-
|
||
+ | function_def
|
||
+ | forward_function
|
||
+ | {
|
||
+ EnvBaseT* envBefore = comp.GetEnv();
|
||
+ if( !mainStarted)
|
||
+ {
|
||
+ comp.StartPro( "$MAIN$");
|
||
+ mainStarted = true;
|
||
+ }
|
||
+ comp.ContinueMainPro();
|
||
+ }
|
||
+ common_block
|
||
+ {
|
||
+ comp.EndInteractiveStatement();
|
||
+ comp.SetEnv( envBefore);
|
||
+ }
|
||
+ )*
|
||
+
|
||
+ (
|
||
+ {
|
||
+ if( !mainStarted)
|
||
+ {
|
||
+ comp.StartPro( "$MAIN$");
|
||
+ mainStarted = true;
|
||
+ }
|
||
+ comp.ContinueMainPro();
|
||
+ }
|
||
+ retAST:statement_list
|
||
+ {
|
||
+ comp.SetTree( #retAST);
|
||
+ comp.EndPro();
|
||
+ }
|
||
+ )?
|
||
+
|
||
// optional main program
|
||
- ( main_program)?
|
||
+// ( main_program)?
|
||
|
||
exception
|
||
catch [ GDLException& e]
|
||
@@ -221,16 +255,6 @@
|
||
}
|
||
;
|
||
|
||
-main_program!
|
||
- : {
|
||
- comp.StartPro( "$MAIN$");
|
||
- }
|
||
- retAST:statement_list
|
||
- {
|
||
- comp.SetTree( #retAST);
|
||
- comp.EndPro();
|
||
- }
|
||
- ;
|
||
|
||
forward_function!
|
||
: #(FORWARD
|
||
Only in gdl-0.9rc2/src: GDLInterpreter.cvs.cpp
|
||
Only in gdl-0.9rc2/src: GDLInterpreterHack.cpp
|
||
Only in gdl-0.9rc2/src: GDLInterpreter.opt.cpp.off
|
||
diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc2/src/GDLParser.cpp cvs/gdl/src/GDLParser.cpp
|
||
--- gdl-0.9rc2/src/GDLParser.cpp 2009-01-20 12:33:52.000000000 -0700
|
||
+++ cvs/gdl/src/GDLParser.cpp 2009-01-26 09:43:53.000000000 -0700
|
||
@@ -743,6 +743,12 @@
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
}
|
||
}
|
||
+ else if ((LA(1) == COMMON) && (LA(2) == IDENTIFIER)) {
|
||
+ common_block();
|
||
+ if (inputState->guessing==0) {
|
||
+ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
+ }
|
||
+ }
|
||
else {
|
||
goto _loop4;
|
||
}
|
||
@@ -1156,6 +1162,89 @@
|
||
returnAST = function_def_AST;
|
||
}
|
||
|
||
+void GDLParser::common_block() {
|
||
+ returnAST = RefDNode(antlr::nullAST);
|
||
+ antlr::ASTPair currentAST;
|
||
+ RefDNode common_block_AST = RefDNode(antlr::nullAST);
|
||
+
|
||
+ match(COMMON);
|
||
+ RefDNode tmp11_AST = RefDNode(antlr::nullAST);
|
||
+ if ( inputState->guessing == 0 ) {
|
||
+ tmp11_AST = astFactory->create(LT(1));
|
||
+ astFactory->addASTChild(currentAST, antlr::RefAST(tmp11_AST));
|
||
+ }
|
||
+ match(IDENTIFIER);
|
||
+ {
|
||
+ switch ( LA(1)) {
|
||
+ case antlr::Token::EOF_TYPE:
|
||
+ case IDENTIFIER:
|
||
+ case BEGIN:
|
||
+ case CASE:
|
||
+ case COMMON:
|
||
+ case COMPILE_OPT:
|
||
+ case ELSE:
|
||
+ case FOR:
|
||
+ case FORWARD:
|
||
+ case FUNCTION:
|
||
+ case GOTO:
|
||
+ case IF:
|
||
+ case INHERITS:
|
||
+ case ON_IOERROR:
|
||
+ case PRO:
|
||
+ case REPEAT:
|
||
+ case SWITCH:
|
||
+ case UNTIL:
|
||
+ case WHILE:
|
||
+ case END_U:
|
||
+ case DEC:
|
||
+ case INC:
|
||
+ case LBRACE:
|
||
+ case SYSVARNAME:
|
||
+ case ASTERIX:
|
||
+ {
|
||
+ if ( inputState->guessing==0 ) {
|
||
+ common_block_AST = RefDNode(currentAST.root);
|
||
+ common_block_AST = RefDNode(astFactory->make((new antlr::ASTArray(2))->add(antlr::RefAST(astFactory->create(COMMONDECL,"commondecl")))->add(antlr::RefAST(common_block_AST))));
|
||
+ currentAST.root = common_block_AST;
|
||
+ if ( common_block_AST!=RefDNode(antlr::nullAST) &&
|
||
+ common_block_AST->getFirstChild() != RefDNode(antlr::nullAST) )
|
||
+ currentAST.child = common_block_AST->getFirstChild();
|
||
+ else
|
||
+ currentAST.child = common_block_AST;
|
||
+ currentAST.advanceChildToEnd();
|
||
+ }
|
||
+ break;
|
||
+ }
|
||
+ case COMMA:
|
||
+ {
|
||
+ match(COMMA);
|
||
+ identifier_list();
|
||
+ if (inputState->guessing==0) {
|
||
+ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
+ }
|
||
+ if ( inputState->guessing==0 ) {
|
||
+ common_block_AST = RefDNode(currentAST.root);
|
||
+ common_block_AST = RefDNode(astFactory->make((new antlr::ASTArray(2))->add(antlr::RefAST(astFactory->create(COMMONDEF,"commondef")))->add(antlr::RefAST(common_block_AST))));
|
||
+ currentAST.root = common_block_AST;
|
||
+ if ( common_block_AST!=RefDNode(antlr::nullAST) &&
|
||
+ common_block_AST->getFirstChild() != RefDNode(antlr::nullAST) )
|
||
+ currentAST.child = common_block_AST->getFirstChild();
|
||
+ else
|
||
+ currentAST.child = common_block_AST;
|
||
+ currentAST.advanceChildToEnd();
|
||
+ }
|
||
+ break;
|
||
+ }
|
||
+ default:
|
||
+ {
|
||
+ throw antlr::NoViableAltException(LT(1), getFilename());
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+ common_block_AST = RefDNode(currentAST.root);
|
||
+ returnAST = common_block_AST;
|
||
+}
|
||
+
|
||
void GDLParser::statement_list() {
|
||
returnAST = RefDNode(antlr::nullAST);
|
||
antlr::ASTPair currentAST;
|
||
@@ -1211,18 +1300,18 @@
|
||
switch ( LA(1)) {
|
||
case FUNCTION:
|
||
{
|
||
- RefDNode tmp10_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp13_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp10_AST = astFactory->create(LT(1));
|
||
+ tmp13_AST = astFactory->create(LT(1));
|
||
}
|
||
match(FUNCTION);
|
||
break;
|
||
}
|
||
case PRO:
|
||
{
|
||
- RefDNode tmp11_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp14_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp11_AST = astFactory->create(LT(1));
|
||
+ tmp14_AST = astFactory->create(LT(1));
|
||
}
|
||
match(PRO);
|
||
break;
|
||
@@ -1233,9 +1322,9 @@
|
||
}
|
||
}
|
||
}
|
||
- RefDNode tmp12_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp15_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp12_AST = astFactory->create(LT(1));
|
||
+ tmp15_AST = astFactory->create(LT(1));
|
||
}
|
||
match(IDENTIFIER);
|
||
if ( inputState->guessing==0 ) {
|
||
@@ -1248,14 +1337,14 @@
|
||
switch ( LA(1)) {
|
||
case METHOD:
|
||
{
|
||
- RefDNode tmp13_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp16_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp13_AST = astFactory->create(LT(1));
|
||
+ tmp16_AST = astFactory->create(LT(1));
|
||
}
|
||
match(METHOD);
|
||
- RefDNode tmp14_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp17_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp14_AST = astFactory->create(LT(1));
|
||
+ tmp17_AST = astFactory->create(LT(1));
|
||
}
|
||
match(IDENTIFIER);
|
||
break;
|
||
@@ -1275,9 +1364,9 @@
|
||
switch ( LA(1)) {
|
||
case COMMA:
|
||
{
|
||
- RefDNode tmp15_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp18_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp15_AST = astFactory->create(LT(1));
|
||
+ tmp18_AST = astFactory->create(LT(1));
|
||
}
|
||
match(COMMA);
|
||
parameter_declaration();
|
||
@@ -1304,10 +1393,10 @@
|
||
|
||
{
|
||
if ((LA(1) == IDENTIFIER) && (LA(2) == COMMA || LA(2) == END_U)) {
|
||
- RefDNode tmp16_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp19_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp16_AST = astFactory->create(LT(1));
|
||
- astFactory->addASTChild(currentAST, antlr::RefAST(tmp16_AST));
|
||
+ tmp19_AST = astFactory->create(LT(1));
|
||
+ astFactory->addASTChild(currentAST, antlr::RefAST(tmp19_AST));
|
||
}
|
||
match(IDENTIFIER);
|
||
}
|
||
@@ -1328,10 +1417,10 @@
|
||
match(COMMA);
|
||
{
|
||
if ((LA(1) == IDENTIFIER) && (LA(2) == COMMA || LA(2) == END_U)) {
|
||
- RefDNode tmp18_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp21_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp18_AST = astFactory->create(LT(1));
|
||
- astFactory->addASTChild(currentAST, antlr::RefAST(tmp18_AST));
|
||
+ tmp21_AST = astFactory->create(LT(1));
|
||
+ astFactory->addASTChild(currentAST, antlr::RefAST(tmp21_AST));
|
||
}
|
||
match(IDENTIFIER);
|
||
}
|
||
@@ -1555,72 +1644,72 @@
|
||
switch ( LA(1)) {
|
||
case END:
|
||
{
|
||
- RefDNode tmp19_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp22_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp19_AST = astFactory->create(LT(1));
|
||
+ tmp22_AST = astFactory->create(LT(1));
|
||
}
|
||
match(END);
|
||
break;
|
||
}
|
||
case ENDIF:
|
||
{
|
||
- RefDNode tmp20_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp23_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp20_AST = astFactory->create(LT(1));
|
||
+ tmp23_AST = astFactory->create(LT(1));
|
||
}
|
||
match(ENDIF);
|
||
break;
|
||
}
|
||
case ENDELSE:
|
||
{
|
||
- RefDNode tmp21_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp24_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp21_AST = astFactory->create(LT(1));
|
||
+ tmp24_AST = astFactory->create(LT(1));
|
||
}
|
||
match(ENDELSE);
|
||
break;
|
||
}
|
||
case ENDCASE:
|
||
{
|
||
- RefDNode tmp22_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp25_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp22_AST = astFactory->create(LT(1));
|
||
+ tmp25_AST = astFactory->create(LT(1));
|
||
}
|
||
match(ENDCASE);
|
||
break;
|
||
}
|
||
case ENDSWITCH:
|
||
{
|
||
- RefDNode tmp23_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp26_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp23_AST = astFactory->create(LT(1));
|
||
+ tmp26_AST = astFactory->create(LT(1));
|
||
}
|
||
match(ENDSWITCH);
|
||
break;
|
||
}
|
||
case ENDFOR:
|
||
{
|
||
- RefDNode tmp24_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp27_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp24_AST = astFactory->create(LT(1));
|
||
+ tmp27_AST = astFactory->create(LT(1));
|
||
}
|
||
match(ENDFOR);
|
||
break;
|
||
}
|
||
case ENDWHILE:
|
||
{
|
||
- RefDNode tmp25_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp28_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp25_AST = astFactory->create(LT(1));
|
||
+ tmp28_AST = astFactory->create(LT(1));
|
||
}
|
||
match(ENDWHILE);
|
||
break;
|
||
}
|
||
case ENDREP:
|
||
{
|
||
- RefDNode tmp26_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp29_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp26_AST = astFactory->create(LT(1));
|
||
+ tmp29_AST = astFactory->create(LT(1));
|
||
}
|
||
match(ENDREP);
|
||
break;
|
||
@@ -1682,20 +1771,20 @@
|
||
switch ( LA(1)) {
|
||
case DEC:
|
||
{
|
||
- RefDNode tmp30_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp33_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp30_AST = astFactory->create(LT(1));
|
||
- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp30_AST));
|
||
+ tmp33_AST = astFactory->create(LT(1));
|
||
+ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp33_AST));
|
||
}
|
||
match(DEC);
|
||
break;
|
||
}
|
||
case INC:
|
||
{
|
||
- RefDNode tmp31_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp34_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp31_AST = astFactory->create(LT(1));
|
||
- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp31_AST));
|
||
+ tmp34_AST = astFactory->create(LT(1));
|
||
+ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp34_AST));
|
||
}
|
||
match(INC);
|
||
break;
|
||
@@ -1830,20 +1919,20 @@
|
||
switch ( LA(1)) {
|
||
case DEC:
|
||
{
|
||
- RefDNode tmp32_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp35_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp32_AST = astFactory->create(LT(1));
|
||
- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp32_AST));
|
||
+ tmp35_AST = astFactory->create(LT(1));
|
||
+ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp35_AST));
|
||
}
|
||
match(DEC);
|
||
break;
|
||
}
|
||
case INC:
|
||
{
|
||
- RefDNode tmp33_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp36_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp33_AST = astFactory->create(LT(1));
|
||
- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp33_AST));
|
||
+ tmp36_AST = astFactory->create(LT(1));
|
||
+ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp36_AST));
|
||
}
|
||
match(INC);
|
||
break;
|
||
@@ -1914,190 +2003,190 @@
|
||
switch ( LA(1)) {
|
||
case AND_OP_EQ:
|
||
{
|
||
- RefDNode tmp35_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp38_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp35_AST = astFactory->create(LT(1));
|
||
- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp35_AST));
|
||
+ tmp38_AST = astFactory->create(LT(1));
|
||
+ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp38_AST));
|
||
}
|
||
match(AND_OP_EQ);
|
||
break;
|
||
}
|
||
case ASTERIX_EQ:
|
||
{
|
||
- RefDNode tmp36_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp39_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp36_AST = astFactory->create(LT(1));
|
||
- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp36_AST));
|
||
+ tmp39_AST = astFactory->create(LT(1));
|
||
+ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp39_AST));
|
||
}
|
||
match(ASTERIX_EQ);
|
||
break;
|
||
}
|
||
case EQ_OP_EQ:
|
||
{
|
||
- RefDNode tmp37_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp40_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp37_AST = astFactory->create(LT(1));
|
||
- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp37_AST));
|
||
+ tmp40_AST = astFactory->create(LT(1));
|
||
+ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp40_AST));
|
||
}
|
||
match(EQ_OP_EQ);
|
||
break;
|
||
}
|
||
case GE_OP_EQ:
|
||
{
|
||
- RefDNode tmp38_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp41_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp38_AST = astFactory->create(LT(1));
|
||
- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp38_AST));
|
||
+ tmp41_AST = astFactory->create(LT(1));
|
||
+ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp41_AST));
|
||
}
|
||
match(GE_OP_EQ);
|
||
break;
|
||
}
|
||
case GTMARK_EQ:
|
||
{
|
||
- RefDNode tmp39_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp42_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp39_AST = astFactory->create(LT(1));
|
||
- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp39_AST));
|
||
+ tmp42_AST = astFactory->create(LT(1));
|
||
+ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp42_AST));
|
||
}
|
||
match(GTMARK_EQ);
|
||
break;
|
||
}
|
||
case GT_OP_EQ:
|
||
{
|
||
- RefDNode tmp40_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp43_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp40_AST = astFactory->create(LT(1));
|
||
- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp40_AST));
|
||
+ tmp43_AST = astFactory->create(LT(1));
|
||
+ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp43_AST));
|
||
}
|
||
match(GT_OP_EQ);
|
||
break;
|
||
}
|
||
case LE_OP_EQ:
|
||
{
|
||
- RefDNode tmp41_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp44_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp41_AST = astFactory->create(LT(1));
|
||
- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp41_AST));
|
||
+ tmp44_AST = astFactory->create(LT(1));
|
||
+ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp44_AST));
|
||
}
|
||
match(LE_OP_EQ);
|
||
break;
|
||
}
|
||
case LTMARK_EQ:
|
||
{
|
||
- RefDNode tmp42_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp45_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp42_AST = astFactory->create(LT(1));
|
||
- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp42_AST));
|
||
+ tmp45_AST = astFactory->create(LT(1));
|
||
+ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp45_AST));
|
||
}
|
||
match(LTMARK_EQ);
|
||
break;
|
||
}
|
||
case LT_OP_EQ:
|
||
{
|
||
- RefDNode tmp43_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp46_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp43_AST = astFactory->create(LT(1));
|
||
- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp43_AST));
|
||
+ tmp46_AST = astFactory->create(LT(1));
|
||
+ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp46_AST));
|
||
}
|
||
match(LT_OP_EQ);
|
||
break;
|
||
}
|
||
case MATRIX_OP1_EQ:
|
||
{
|
||
- RefDNode tmp44_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp47_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp44_AST = astFactory->create(LT(1));
|
||
- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp44_AST));
|
||
+ tmp47_AST = astFactory->create(LT(1));
|
||
+ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp47_AST));
|
||
}
|
||
match(MATRIX_OP1_EQ);
|
||
break;
|
||
}
|
||
case MATRIX_OP2_EQ:
|
||
{
|
||
- RefDNode tmp45_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp48_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp45_AST = astFactory->create(LT(1));
|
||
- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp45_AST));
|
||
+ tmp48_AST = astFactory->create(LT(1));
|
||
+ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp48_AST));
|
||
}
|
||
match(MATRIX_OP2_EQ);
|
||
break;
|
||
}
|
||
case MINUS_EQ:
|
||
{
|
||
- RefDNode tmp46_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp49_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp46_AST = astFactory->create(LT(1));
|
||
- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp46_AST));
|
||
+ tmp49_AST = astFactory->create(LT(1));
|
||
+ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp49_AST));
|
||
}
|
||
match(MINUS_EQ);
|
||
break;
|
||
}
|
||
case MOD_OP_EQ:
|
||
{
|
||
- RefDNode tmp47_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp50_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp47_AST = astFactory->create(LT(1));
|
||
- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp47_AST));
|
||
+ tmp50_AST = astFactory->create(LT(1));
|
||
+ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp50_AST));
|
||
}
|
||
match(MOD_OP_EQ);
|
||
break;
|
||
}
|
||
case NE_OP_EQ:
|
||
{
|
||
- RefDNode tmp48_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp51_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp48_AST = astFactory->create(LT(1));
|
||
- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp48_AST));
|
||
+ tmp51_AST = astFactory->create(LT(1));
|
||
+ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp51_AST));
|
||
}
|
||
match(NE_OP_EQ);
|
||
break;
|
||
}
|
||
case OR_OP_EQ:
|
||
{
|
||
- RefDNode tmp49_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp52_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp49_AST = astFactory->create(LT(1));
|
||
- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp49_AST));
|
||
+ tmp52_AST = astFactory->create(LT(1));
|
||
+ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp52_AST));
|
||
}
|
||
match(OR_OP_EQ);
|
||
break;
|
||
}
|
||
case PLUS_EQ:
|
||
{
|
||
- RefDNode tmp50_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp53_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp50_AST = astFactory->create(LT(1));
|
||
- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp50_AST));
|
||
+ tmp53_AST = astFactory->create(LT(1));
|
||
+ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp53_AST));
|
||
}
|
||
match(PLUS_EQ);
|
||
break;
|
||
}
|
||
case POW_EQ:
|
||
{
|
||
- RefDNode tmp51_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp54_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp51_AST = astFactory->create(LT(1));
|
||
- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp51_AST));
|
||
+ tmp54_AST = astFactory->create(LT(1));
|
||
+ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp54_AST));
|
||
}
|
||
match(POW_EQ);
|
||
break;
|
||
}
|
||
case SLASH_EQ:
|
||
{
|
||
- RefDNode tmp52_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp55_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp52_AST = astFactory->create(LT(1));
|
||
- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp52_AST));
|
||
+ tmp55_AST = astFactory->create(LT(1));
|
||
+ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp55_AST));
|
||
}
|
||
match(SLASH_EQ);
|
||
break;
|
||
}
|
||
case XOR_OP_EQ:
|
||
{
|
||
- RefDNode tmp53_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp56_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp53_AST = astFactory->create(LT(1));
|
||
- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp53_AST));
|
||
+ tmp56_AST = astFactory->create(LT(1));
|
||
+ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp56_AST));
|
||
}
|
||
match(XOR_OP_EQ);
|
||
break;
|
||
@@ -2121,20 +2210,20 @@
|
||
switch ( LA(1)) {
|
||
case DEC:
|
||
{
|
||
- RefDNode tmp54_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp57_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp54_AST = astFactory->create(LT(1));
|
||
- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp54_AST));
|
||
+ tmp57_AST = astFactory->create(LT(1));
|
||
+ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp57_AST));
|
||
}
|
||
match(DEC);
|
||
break;
|
||
}
|
||
case INC:
|
||
{
|
||
- RefDNode tmp55_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp58_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp55_AST = astFactory->create(LT(1));
|
||
- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp55_AST));
|
||
+ tmp58_AST = astFactory->create(LT(1));
|
||
+ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp58_AST));
|
||
}
|
||
match(INC);
|
||
break;
|
||
@@ -2220,10 +2309,10 @@
|
||
int numBranch=0;
|
||
|
||
|
||
- RefDNode tmp57_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp60_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp57_AST = astFactory->create(LT(1));
|
||
- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp57_AST));
|
||
+ tmp60_AST = astFactory->create(LT(1));
|
||
+ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp60_AST));
|
||
}
|
||
match(SWITCH);
|
||
expr();
|
||
@@ -2322,7 +2411,7 @@
|
||
}
|
||
if ( inputState->guessing==0 ) {
|
||
|
||
- tmp57_AST->SetNumBranch(numBranch);
|
||
+ tmp60_AST->SetNumBranch(numBranch);
|
||
|
||
}
|
||
switch_statement_AST = RefDNode(currentAST.root);
|
||
@@ -2342,10 +2431,10 @@
|
||
switch ( LA(1)) {
|
||
case QUESTION:
|
||
{
|
||
- RefDNode tmp59_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp62_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp59_AST = astFactory->create(LT(1));
|
||
- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp59_AST));
|
||
+ tmp62_AST = astFactory->create(LT(1));
|
||
+ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp62_AST));
|
||
}
|
||
match(QUESTION);
|
||
expr();
|
||
@@ -2595,18 +2684,18 @@
|
||
switch ( LA(1)) {
|
||
case ENDSWITCH:
|
||
{
|
||
- RefDNode tmp66_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp69_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp66_AST = astFactory->create(LT(1));
|
||
+ tmp69_AST = astFactory->create(LT(1));
|
||
}
|
||
match(ENDSWITCH);
|
||
break;
|
||
}
|
||
case END:
|
||
{
|
||
- RefDNode tmp67_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp70_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp67_AST = astFactory->create(LT(1));
|
||
+ tmp70_AST = astFactory->create(LT(1));
|
||
}
|
||
match(END);
|
||
break;
|
||
@@ -2633,9 +2722,9 @@
|
||
}
|
||
case ENDELSE:
|
||
{
|
||
- RefDNode tmp68_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp71_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp68_AST = astFactory->create(LT(1));
|
||
+ tmp71_AST = astFactory->create(LT(1));
|
||
}
|
||
match(ENDELSE);
|
||
break;
|
||
@@ -2656,10 +2745,10 @@
|
||
int numBranch=0;
|
||
|
||
|
||
- RefDNode tmp69_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp72_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp69_AST = astFactory->create(LT(1));
|
||
- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp69_AST));
|
||
+ tmp72_AST = astFactory->create(LT(1));
|
||
+ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp72_AST));
|
||
}
|
||
match(CASE);
|
||
expr();
|
||
@@ -2758,7 +2847,7 @@
|
||
}
|
||
if ( inputState->guessing==0 ) {
|
||
|
||
- tmp69_AST->SetNumBranch(numBranch);
|
||
+ tmp72_AST->SetNumBranch(numBranch);
|
||
|
||
}
|
||
case_statement_AST = RefDNode(currentAST.root);
|
||
@@ -2976,18 +3065,18 @@
|
||
switch ( LA(1)) {
|
||
case ENDCASE:
|
||
{
|
||
- RefDNode tmp76_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp79_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp76_AST = astFactory->create(LT(1));
|
||
+ tmp79_AST = astFactory->create(LT(1));
|
||
}
|
||
match(ENDCASE);
|
||
break;
|
||
}
|
||
case END:
|
||
{
|
||
- RefDNode tmp77_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp80_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp77_AST = astFactory->create(LT(1));
|
||
+ tmp80_AST = astFactory->create(LT(1));
|
||
}
|
||
match(END);
|
||
break;
|
||
@@ -3014,9 +3103,9 @@
|
||
}
|
||
case ENDELSE:
|
||
{
|
||
- RefDNode tmp78_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp81_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp78_AST = astFactory->create(LT(1));
|
||
+ tmp81_AST = astFactory->create(LT(1));
|
||
}
|
||
match(ENDELSE);
|
||
break;
|
||
@@ -3034,20 +3123,20 @@
|
||
antlr::ASTPair currentAST;
|
||
RefDNode identifier_list_AST = RefDNode(antlr::nullAST);
|
||
|
||
- RefDNode tmp79_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp82_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp79_AST = astFactory->create(LT(1));
|
||
- astFactory->addASTChild(currentAST, antlr::RefAST(tmp79_AST));
|
||
+ tmp82_AST = astFactory->create(LT(1));
|
||
+ astFactory->addASTChild(currentAST, antlr::RefAST(tmp82_AST));
|
||
}
|
||
match(IDENTIFIER);
|
||
{ // ( ... )*
|
||
for (;;) {
|
||
if ((LA(1) == COMMA)) {
|
||
match(COMMA);
|
||
- RefDNode tmp81_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp84_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp81_AST = astFactory->create(LT(1));
|
||
- astFactory->addASTChild(currentAST, antlr::RefAST(tmp81_AST));
|
||
+ tmp84_AST = astFactory->create(LT(1));
|
||
+ astFactory->addASTChild(currentAST, antlr::RefAST(tmp84_AST));
|
||
}
|
||
match(IDENTIFIER);
|
||
}
|
||
@@ -3067,17 +3156,17 @@
|
||
antlr::ASTPair currentAST;
|
||
RefDNode keyword_declaration_AST = RefDNode(antlr::nullAST);
|
||
|
||
- RefDNode tmp82_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp85_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp82_AST = astFactory->create(LT(1));
|
||
- astFactory->addASTChild(currentAST, antlr::RefAST(tmp82_AST));
|
||
+ tmp85_AST = astFactory->create(LT(1));
|
||
+ astFactory->addASTChild(currentAST, antlr::RefAST(tmp85_AST));
|
||
}
|
||
match(IDENTIFIER);
|
||
match(EQUAL);
|
||
- RefDNode tmp84_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp87_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp84_AST = astFactory->create(LT(1));
|
||
- astFactory->addASTChild(currentAST, antlr::RefAST(tmp84_AST));
|
||
+ tmp87_AST = astFactory->create(LT(1));
|
||
+ astFactory->addASTChild(currentAST, antlr::RefAST(tmp87_AST));
|
||
}
|
||
match(IDENTIFIER);
|
||
if ( inputState->guessing==0 ) {
|
||
@@ -3150,9 +3239,9 @@
|
||
antlr::RefToken ii = antlr::nullToken;
|
||
RefDNode ii_AST = RefDNode(antlr::nullAST);
|
||
|
||
- RefDNode tmp85_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp88_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp85_AST = astFactory->create(LT(1));
|
||
+ tmp88_AST = astFactory->create(LT(1));
|
||
}
|
||
match(COMPILE_OPT);
|
||
i = LT(1);
|
||
@@ -3168,9 +3257,9 @@
|
||
{ // ( ... )*
|
||
for (;;) {
|
||
if ((LA(1) == COMMA)) {
|
||
- RefDNode tmp86_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp89_AST = RefDNode(antlr::nullAST);
|
||
if ( inputState->guessing == 0 ) {
|
||
- tmp86_AST = astFactory->create(LT(1));
|
||
+ tmp89_AST = astFactory->create(LT(1));
|
||
}
|
||
match(COMMA);
|
||
ii = LT(1);
|
||
@@ -3194,67 +3283,6 @@
|
||
returnAST = compile_opt_AST;
|
||
}
|
||
|
||
-void GDLParser::common_block() {
|
||
- returnAST = RefDNode(antlr::nullAST);
|
||
- antlr::ASTPair currentAST;
|
||
- RefDNode common_block_AST = RefDNode(antlr::nullAST);
|
||
-
|
||
- match(COMMON);
|
||
- RefDNode tmp88_AST = RefDNode(antlr::nullAST);
|
||
- if ( inputState->guessing == 0 ) {
|
||
- tmp88_AST = astFactory->create(LT(1));
|
||
- astFactory->addASTChild(currentAST, antlr::RefAST(tmp88_AST));
|
||
- }
|
||
- match(IDENTIFIER);
|
||
- {
|
||
- switch ( LA(1)) {
|
||
- case ELSE:
|
||
- case UNTIL:
|
||
- case END_U:
|
||
- {
|
||
- if ( inputState->guessing==0 ) {
|
||
- common_block_AST = RefDNode(currentAST.root);
|
||
- common_block_AST = RefDNode(astFactory->make((new antlr::ASTArray(2))->add(antlr::RefAST(astFactory->create(COMMONDECL,"commondecl")))->add(antlr::RefAST(common_block_AST))));
|
||
- currentAST.root = common_block_AST;
|
||
- if ( common_block_AST!=RefDNode(antlr::nullAST) &&
|
||
- common_block_AST->getFirstChild() != RefDNode(antlr::nullAST) )
|
||
- currentAST.child = common_block_AST->getFirstChild();
|
||
- else
|
||
- currentAST.child = common_block_AST;
|
||
- currentAST.advanceChildToEnd();
|
||
- }
|
||
- break;
|
||
- }
|
||
- case COMMA:
|
||
- {
|
||
- match(COMMA);
|
||
- identifier_list();
|
||
- if (inputState->guessing==0) {
|
||
- astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
- }
|
||
- if ( inputState->guessing==0 ) {
|
||
- common_block_AST = RefDNode(currentAST.root);
|
||
- common_block_AST = RefDNode(astFactory->make((new antlr::ASTArray(2))->add(antlr::RefAST(astFactory->create(COMMONDEF,"commondef")))->add(antlr::RefAST(common_block_AST))));
|
||
- currentAST.root = common_block_AST;
|
||
- if ( common_block_AST!=RefDNode(antlr::nullAST) &&
|
||
- common_block_AST->getFirstChild() != RefDNode(antlr::nullAST) )
|
||
- currentAST.child = common_block_AST->getFirstChild();
|
||
- else
|
||
- currentAST.child = common_block_AST;
|
||
- currentAST.advanceChildToEnd();
|
||
- }
|
||
- break;
|
||
- }
|
||
- default:
|
||
- {
|
||
- throw antlr::NoViableAltException(LT(1), getFilename());
|
||
- }
|
||
- }
|
||
- }
|
||
- common_block_AST = RefDNode(currentAST.root);
|
||
- returnAST = common_block_AST;
|
||
-}
|
||
-
|
||
void GDLParser::endfor_mark() {
|
||
returnAST = RefDNode(antlr::nullAST);
|
||
antlr::ASTPair currentAST;
|
||
diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc2/src/GDLParser.hpp cvs/gdl/src/GDLParser.hpp
|
||
--- gdl-0.9rc2/src/GDLParser.hpp 2009-01-20 12:33:51.000000000 -0700
|
||
+++ cvs/gdl/src/GDLParser.hpp 2009-01-26 09:43:53.000000000 -0700
|
||
@@ -98,6 +98,7 @@
|
||
public: void forward_function();
|
||
public: void procedure_def();
|
||
public: void function_def();
|
||
+ public: void common_block();
|
||
public: void statement_list();
|
||
public: void interactive_compile();
|
||
public: void parameter_declaration();
|
||
@@ -118,7 +119,6 @@
|
||
public: void keyword_declaration();
|
||
public: std::string object_name();
|
||
public: void compile_opt();
|
||
- public: void common_block();
|
||
public: void endfor_mark();
|
||
public: void endrep_mark();
|
||
public: void endwhile_mark();
|
||
diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc2/src/GDLTreeParser.cpp cvs/gdl/src/GDLTreeParser.cpp
|
||
--- gdl-0.9rc2/src/GDLTreeParser.cpp 2009-01-20 12:33:54.000000000 -0700
|
||
+++ cvs/gdl/src/GDLTreeParser.cpp 2009-01-26 09:43:54.000000000 -0700
|
||
@@ -28,6 +28,11 @@
|
||
returnAST = RefDNode(antlr::nullAST);
|
||
antlr::ASTPair currentAST;
|
||
RefDNode translation_unit_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode retAST_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode retAST = RefDNode(antlr::nullAST);
|
||
+
|
||
+ bool mainStarted = false;
|
||
+
|
||
|
||
try { // for error handling
|
||
{ // ( ... )*
|
||
@@ -57,6 +62,24 @@
|
||
_t = _retTree;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
}
|
||
+ else if ((_t->getType() == COMMONDECL || _t->getType() == COMMONDEF)) {
|
||
+
|
||
+ EnvBaseT* envBefore = comp.GetEnv();
|
||
+ if( !mainStarted)
|
||
+ {
|
||
+ comp.StartPro( "$MAIN$");
|
||
+ mainStarted = true;
|
||
+ }
|
||
+ comp.ContinueMainPro();
|
||
+
|
||
+ common_block(_t);
|
||
+ _t = _retTree;
|
||
+ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
+
|
||
+ comp.EndInteractiveStatement();
|
||
+ comp.SetEnv( envBefore);
|
||
+
|
||
+ }
|
||
else {
|
||
goto _loop3;
|
||
}
|
||
@@ -110,9 +133,23 @@
|
||
case SLASH_EQ:
|
||
case XOR_OP_EQ:
|
||
{
|
||
- main_program(_t);
|
||
+
|
||
+ if( !mainStarted)
|
||
+ {
|
||
+ comp.StartPro( "$MAIN$");
|
||
+ mainStarted = true;
|
||
+ }
|
||
+ comp.ContinueMainPro();
|
||
+
|
||
+ retAST = (_t == ASTNULL) ? RefDNode(antlr::nullAST) : _t;
|
||
+ statement_list(_t);
|
||
_t = _retTree;
|
||
+ retAST_AST = returnAST;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
+
|
||
+ comp.SetTree( retAST_AST);
|
||
+ comp.EndPro();
|
||
+
|
||
break;
|
||
}
|
||
case 3:
|
||
@@ -158,12 +195,12 @@
|
||
RefDNode obj = RefDNode(antlr::nullAST);
|
||
RefDNode obj_AST = RefDNode(antlr::nullAST);
|
||
|
||
- RefDNode __t20 = _t;
|
||
+ RefDNode __t19 = _t;
|
||
RefDNode tmp1_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp1_AST_in = RefDNode(antlr::nullAST);
|
||
tmp1_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp1_AST_in = _t;
|
||
- antlr::ASTPair __currentAST20 = currentAST;
|
||
+ antlr::ASTPair __currentAST19 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),PRO);
|
||
@@ -377,8 +414,8 @@
|
||
|
||
comp.EndPro();
|
||
|
||
- currentAST = __currentAST20;
|
||
- _t = __t20;
|
||
+ currentAST = __currentAST19;
|
||
+ _t = __t19;
|
||
_t = _t->getNextSibling();
|
||
returnAST = procedure_def_AST;
|
||
_retTree = _t;
|
||
@@ -394,12 +431,12 @@
|
||
RefDNode obj = RefDNode(antlr::nullAST);
|
||
RefDNode obj_AST = RefDNode(antlr::nullAST);
|
||
|
||
- RefDNode __t25 = _t;
|
||
+ RefDNode __t24 = _t;
|
||
RefDNode tmp3_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp3_AST_in = RefDNode(antlr::nullAST);
|
||
tmp3_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp3_AST_in = _t;
|
||
- antlr::ASTPair __currentAST25 = currentAST;
|
||
+ antlr::ASTPair __currentAST24 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),FUNCTION);
|
||
@@ -613,8 +650,8 @@
|
||
|
||
comp.EndFun();
|
||
|
||
- currentAST = __currentAST25;
|
||
- _t = __t25;
|
||
+ currentAST = __currentAST24;
|
||
+ _t = __t24;
|
||
_t = _t->getNextSibling();
|
||
returnAST = function_def_AST;
|
||
_retTree = _t;
|
||
@@ -628,18 +665,18 @@
|
||
RefDNode id = RefDNode(antlr::nullAST);
|
||
RefDNode id_AST = RefDNode(antlr::nullAST);
|
||
|
||
- RefDNode __t10 = _t;
|
||
+ RefDNode __t9 = _t;
|
||
RefDNode tmp5_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp5_AST_in = RefDNode(antlr::nullAST);
|
||
tmp5_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp5_AST_in = _t;
|
||
- antlr::ASTPair __currentAST10 = currentAST;
|
||
+ antlr::ASTPair __currentAST9 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),FORWARD);
|
||
_t = _t->getFirstChild();
|
||
{ // ( ... )+
|
||
- int _cnt12=0;
|
||
+ int _cnt11=0;
|
||
for (;;) {
|
||
if (_t == RefDNode(antlr::nullAST) )
|
||
_t = ASTNULL;
|
||
@@ -654,40 +691,193 @@
|
||
|
||
}
|
||
else {
|
||
- if ( _cnt12>=1 ) { goto _loop12; } else {throw antlr::NoViableAltException(antlr::RefAST(_t));}
|
||
+ if ( _cnt11>=1 ) { goto _loop11; } else {throw antlr::NoViableAltException(antlr::RefAST(_t));}
|
||
}
|
||
|
||
- _cnt12++;
|
||
+ _cnt11++;
|
||
}
|
||
- _loop12:;
|
||
+ _loop11:;
|
||
} // ( ... )+
|
||
- currentAST = __currentAST10;
|
||
- _t = __t10;
|
||
+ currentAST = __currentAST9;
|
||
+ _t = __t9;
|
||
_t = _t->getNextSibling();
|
||
returnAST = forward_function_AST;
|
||
_retTree = _t;
|
||
}
|
||
|
||
-void GDLTreeParser::main_program(RefDNode _t) {
|
||
- RefDNode main_program_AST_in = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t;
|
||
+void GDLTreeParser::common_block(RefDNode _t) {
|
||
+ RefDNode common_block_AST_in = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t;
|
||
returnAST = RefDNode(antlr::nullAST);
|
||
antlr::ASTPair currentAST;
|
||
- RefDNode main_program_AST = RefDNode(antlr::nullAST);
|
||
- RefDNode retAST_AST = RefDNode(antlr::nullAST);
|
||
- RefDNode retAST = RefDNode(antlr::nullAST);
|
||
-
|
||
-
|
||
- comp.StartPro( "$MAIN$");
|
||
-
|
||
- retAST = (_t == ASTNULL) ? RefDNode(antlr::nullAST) : _t;
|
||
- statement_list(_t);
|
||
- _t = _retTree;
|
||
- retAST_AST = returnAST;
|
||
+ RefDNode common_block_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode id = RefDNode(antlr::nullAST);
|
||
+ RefDNode id_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode cv = RefDNode(antlr::nullAST);
|
||
+ RefDNode cv_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode id2 = RefDNode(antlr::nullAST);
|
||
+ RefDNode id2_AST = RefDNode(antlr::nullAST);
|
||
|
||
- comp.SetTree( retAST_AST);
|
||
- comp.EndPro();
|
||
+ if (_t == RefDNode(antlr::nullAST) )
|
||
+ _t = ASTNULL;
|
||
+ switch ( _t->getType()) {
|
||
+ case COMMONDEF:
|
||
+ {
|
||
+ RefDNode __t29 = _t;
|
||
+ RefDNode tmp6_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp6_AST_in = RefDNode(antlr::nullAST);
|
||
+ tmp6_AST = astFactory->create(antlr::RefAST(_t));
|
||
+ tmp6_AST_in = _t;
|
||
+ antlr::ASTPair __currentAST29 = currentAST;
|
||
+ currentAST.root = currentAST.child;
|
||
+ currentAST.child = RefDNode(antlr::nullAST);
|
||
+ match(antlr::RefAST(_t),COMMONDEF);
|
||
+ _t = _t->getFirstChild();
|
||
+ id = _t;
|
||
+ RefDNode id_AST_in = RefDNode(antlr::nullAST);
|
||
+ id_AST = astFactory->create(antlr::RefAST(id));
|
||
+ match(antlr::RefAST(_t),IDENTIFIER);
|
||
+ _t = _t->getNextSibling();
|
||
+
|
||
+ DCommonBase* actCommon=comp.CommonDef(id->getText());
|
||
+
|
||
+ { // ( ... )+
|
||
+ int _cnt31=0;
|
||
+ for (;;) {
|
||
+ if (_t == RefDNode(antlr::nullAST) )
|
||
+ _t = ASTNULL;
|
||
+ if ((_t->getType() == IDENTIFIER)) {
|
||
+ cv = _t;
|
||
+ RefDNode cv_AST_in = RefDNode(antlr::nullAST);
|
||
+ cv_AST = astFactory->create(antlr::RefAST(cv));
|
||
+ match(antlr::RefAST(_t),IDENTIFIER);
|
||
+ _t = _t->getNextSibling();
|
||
+
|
||
+ comp.CommonVar(actCommon,cv->getText());
|
||
+
|
||
+ }
|
||
+ else {
|
||
+ if ( _cnt31>=1 ) { goto _loop31; } else {throw antlr::NoViableAltException(antlr::RefAST(_t));}
|
||
+ }
|
||
+
|
||
+ _cnt31++;
|
||
+ }
|
||
+ _loop31:;
|
||
+ } // ( ... )+
|
||
+ currentAST = __currentAST29;
|
||
+ _t = __t29;
|
||
+ _t = _t->getNextSibling();
|
||
+ break;
|
||
+ }
|
||
+ case COMMONDECL:
|
||
+ {
|
||
+ RefDNode __t32 = _t;
|
||
+ RefDNode tmp7_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp7_AST_in = RefDNode(antlr::nullAST);
|
||
+ tmp7_AST = astFactory->create(antlr::RefAST(_t));
|
||
+ tmp7_AST_in = _t;
|
||
+ antlr::ASTPair __currentAST32 = currentAST;
|
||
+ currentAST.root = currentAST.child;
|
||
+ currentAST.child = RefDNode(antlr::nullAST);
|
||
+ match(antlr::RefAST(_t),COMMONDECL);
|
||
+ _t = _t->getFirstChild();
|
||
+ id2 = _t;
|
||
+ RefDNode id2_AST_in = RefDNode(antlr::nullAST);
|
||
+ id2_AST = astFactory->create(antlr::RefAST(id2));
|
||
+ match(antlr::RefAST(_t),IDENTIFIER);
|
||
+ _t = _t->getNextSibling();
|
||
+
|
||
+ comp.CommonDecl(id2->getText());
|
||
+
|
||
+ currentAST = __currentAST32;
|
||
+ _t = __t32;
|
||
+ _t = _t->getNextSibling();
|
||
+ break;
|
||
+ }
|
||
+ default:
|
||
+ {
|
||
+ throw antlr::NoViableAltException(antlr::RefAST(_t));
|
||
+ }
|
||
+ }
|
||
+ returnAST = common_block_AST;
|
||
+ _retTree = _t;
|
||
+}
|
||
+
|
||
+void GDLTreeParser::statement_list(RefDNode _t) {
|
||
+ RefDNode statement_list_AST_in = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t;
|
||
+ returnAST = RefDNode(antlr::nullAST);
|
||
+ antlr::ASTPair currentAST;
|
||
+ RefDNode statement_list_AST = RefDNode(antlr::nullAST);
|
||
|
||
- returnAST = main_program_AST;
|
||
+ { // ( ... )+
|
||
+ int _cnt54=0;
|
||
+ for (;;) {
|
||
+ if (_t == RefDNode(antlr::nullAST) )
|
||
+ _t = ASTNULL;
|
||
+ switch ( _t->getType()) {
|
||
+ case ASSIGN:
|
||
+ case BLOCK:
|
||
+ case BREAK:
|
||
+ case CONTINUE:
|
||
+ case COMMONDECL:
|
||
+ case COMMONDEF:
|
||
+ case MPCALL:
|
||
+ case MPCALL_PARENT:
|
||
+ case PCALL:
|
||
+ case RETURN:
|
||
+ case CASE:
|
||
+ case FOR:
|
||
+ case FORWARD:
|
||
+ case GOTO:
|
||
+ case IF:
|
||
+ case ON_IOERROR:
|
||
+ case REPEAT:
|
||
+ case SWITCH:
|
||
+ case WHILE:
|
||
+ case DEC:
|
||
+ case INC:
|
||
+ case AND_OP_EQ:
|
||
+ case ASTERIX_EQ:
|
||
+ case EQ_OP_EQ:
|
||
+ case GE_OP_EQ:
|
||
+ case GTMARK_EQ:
|
||
+ case GT_OP_EQ:
|
||
+ case LE_OP_EQ:
|
||
+ case LTMARK_EQ:
|
||
+ case LT_OP_EQ:
|
||
+ case MATRIX_OP1_EQ:
|
||
+ case MATRIX_OP2_EQ:
|
||
+ case MINUS_EQ:
|
||
+ case MOD_OP_EQ:
|
||
+ case NE_OP_EQ:
|
||
+ case OR_OP_EQ:
|
||
+ case PLUS_EQ:
|
||
+ case POW_EQ:
|
||
+ case SLASH_EQ:
|
||
+ case XOR_OP_EQ:
|
||
+ {
|
||
+ statement(_t);
|
||
+ _t = _retTree;
|
||
+ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
+ break;
|
||
+ }
|
||
+ case IDENTIFIER:
|
||
+ {
|
||
+ label(_t);
|
||
+ _t = _retTree;
|
||
+ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
+ break;
|
||
+ }
|
||
+ default:
|
||
+ {
|
||
+ if ( _cnt54>=1 ) { goto _loop54; } else {throw antlr::NoViableAltException(antlr::RefAST(_t));}
|
||
+ }
|
||
+ }
|
||
+ _cnt54++;
|
||
+ }
|
||
+ _loop54:;
|
||
+ } // ( ... )+
|
||
+ statement_list_AST = RefDNode(currentAST.root);
|
||
+ returnAST = statement_list_AST;
|
||
_retTree = _t;
|
||
}
|
||
|
||
@@ -878,13 +1068,13 @@
|
||
}
|
||
case DEC:
|
||
{
|
||
- RefDNode __t57 = _t;
|
||
- RefDNode tmp6_AST = RefDNode(antlr::nullAST);
|
||
- RefDNode tmp6_AST_in = RefDNode(antlr::nullAST);
|
||
- tmp6_AST = astFactory->create(antlr::RefAST(_t));
|
||
- tmp6_AST_in = _t;
|
||
- astFactory->addASTChild(currentAST, antlr::RefAST(tmp6_AST));
|
||
- antlr::ASTPair __currentAST57 = currentAST;
|
||
+ RefDNode __t56 = _t;
|
||
+ RefDNode tmp8_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp8_AST_in = RefDNode(antlr::nullAST);
|
||
+ tmp8_AST = astFactory->create(antlr::RefAST(_t));
|
||
+ tmp8_AST_in = _t;
|
||
+ astFactory->addASTChild(currentAST, antlr::RefAST(tmp8_AST));
|
||
+ antlr::ASTPair __currentAST56 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),DEC);
|
||
@@ -892,21 +1082,21 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
- currentAST = __currentAST57;
|
||
- _t = __t57;
|
||
+ currentAST = __currentAST56;
|
||
+ _t = __t56;
|
||
_t = _t->getNextSibling();
|
||
statement_AST = RefDNode(currentAST.root);
|
||
break;
|
||
}
|
||
case INC:
|
||
{
|
||
- RefDNode __t58 = _t;
|
||
- RefDNode tmp7_AST = RefDNode(antlr::nullAST);
|
||
- RefDNode tmp7_AST_in = RefDNode(antlr::nullAST);
|
||
- tmp7_AST = astFactory->create(antlr::RefAST(_t));
|
||
- tmp7_AST_in = _t;
|
||
- astFactory->addASTChild(currentAST, antlr::RefAST(tmp7_AST));
|
||
- antlr::ASTPair __currentAST58 = currentAST;
|
||
+ RefDNode __t57 = _t;
|
||
+ RefDNode tmp9_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp9_AST_in = RefDNode(antlr::nullAST);
|
||
+ tmp9_AST = astFactory->create(antlr::RefAST(_t));
|
||
+ tmp9_AST_in = _t;
|
||
+ astFactory->addASTChild(currentAST, antlr::RefAST(tmp9_AST));
|
||
+ antlr::ASTPair __currentAST57 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),INC);
|
||
@@ -914,19 +1104,19 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
- currentAST = __currentAST58;
|
||
- _t = __t58;
|
||
+ currentAST = __currentAST57;
|
||
+ _t = __t57;
|
||
_t = _t->getNextSibling();
|
||
statement_AST = RefDNode(currentAST.root);
|
||
break;
|
||
}
|
||
case BREAK:
|
||
{
|
||
- RefDNode tmp8_AST = RefDNode(antlr::nullAST);
|
||
- RefDNode tmp8_AST_in = RefDNode(antlr::nullAST);
|
||
- tmp8_AST = astFactory->create(antlr::RefAST(_t));
|
||
- tmp8_AST_in = _t;
|
||
- astFactory->addASTChild(currentAST, antlr::RefAST(tmp8_AST));
|
||
+ RefDNode tmp10_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp10_AST_in = RefDNode(antlr::nullAST);
|
||
+ tmp10_AST = astFactory->create(antlr::RefAST(_t));
|
||
+ tmp10_AST_in = _t;
|
||
+ astFactory->addASTChild(currentAST, antlr::RefAST(tmp10_AST));
|
||
match(antlr::RefAST(_t),BREAK);
|
||
_t = _t->getNextSibling();
|
||
statement_AST = RefDNode(currentAST.root);
|
||
@@ -934,11 +1124,11 @@
|
||
}
|
||
case CONTINUE:
|
||
{
|
||
- RefDNode tmp9_AST = RefDNode(antlr::nullAST);
|
||
- RefDNode tmp9_AST_in = RefDNode(antlr::nullAST);
|
||
- tmp9_AST = astFactory->create(antlr::RefAST(_t));
|
||
- tmp9_AST_in = _t;
|
||
- astFactory->addASTChild(currentAST, antlr::RefAST(tmp9_AST));
|
||
+ RefDNode tmp11_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp11_AST_in = RefDNode(antlr::nullAST);
|
||
+ tmp11_AST = astFactory->create(antlr::RefAST(_t));
|
||
+ tmp11_AST_in = _t;
|
||
+ astFactory->addASTChild(currentAST, antlr::RefAST(tmp11_AST));
|
||
match(antlr::RefAST(_t),CONTINUE);
|
||
_t = _t->getNextSibling();
|
||
statement_AST = RefDNode(currentAST.root);
|
||
@@ -953,85 +1143,6 @@
|
||
_retTree = _t;
|
||
}
|
||
|
||
-void GDLTreeParser::statement_list(RefDNode _t) {
|
||
- RefDNode statement_list_AST_in = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t;
|
||
- returnAST = RefDNode(antlr::nullAST);
|
||
- antlr::ASTPair currentAST;
|
||
- RefDNode statement_list_AST = RefDNode(antlr::nullAST);
|
||
-
|
||
- { // ( ... )+
|
||
- int _cnt55=0;
|
||
- for (;;) {
|
||
- if (_t == RefDNode(antlr::nullAST) )
|
||
- _t = ASTNULL;
|
||
- switch ( _t->getType()) {
|
||
- case ASSIGN:
|
||
- case BLOCK:
|
||
- case BREAK:
|
||
- case CONTINUE:
|
||
- case COMMONDECL:
|
||
- case COMMONDEF:
|
||
- case MPCALL:
|
||
- case MPCALL_PARENT:
|
||
- case PCALL:
|
||
- case RETURN:
|
||
- case CASE:
|
||
- case FOR:
|
||
- case FORWARD:
|
||
- case GOTO:
|
||
- case IF:
|
||
- case ON_IOERROR:
|
||
- case REPEAT:
|
||
- case SWITCH:
|
||
- case WHILE:
|
||
- case DEC:
|
||
- case INC:
|
||
- case AND_OP_EQ:
|
||
- case ASTERIX_EQ:
|
||
- case EQ_OP_EQ:
|
||
- case GE_OP_EQ:
|
||
- case GTMARK_EQ:
|
||
- case GT_OP_EQ:
|
||
- case LE_OP_EQ:
|
||
- case LTMARK_EQ:
|
||
- case LT_OP_EQ:
|
||
- case MATRIX_OP1_EQ:
|
||
- case MATRIX_OP2_EQ:
|
||
- case MINUS_EQ:
|
||
- case MOD_OP_EQ:
|
||
- case NE_OP_EQ:
|
||
- case OR_OP_EQ:
|
||
- case PLUS_EQ:
|
||
- case POW_EQ:
|
||
- case SLASH_EQ:
|
||
- case XOR_OP_EQ:
|
||
- {
|
||
- statement(_t);
|
||
- _t = _retTree;
|
||
- astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
- break;
|
||
- }
|
||
- case IDENTIFIER:
|
||
- {
|
||
- label(_t);
|
||
- _t = _retTree;
|
||
- astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
- break;
|
||
- }
|
||
- default:
|
||
- {
|
||
- if ( _cnt55>=1 ) { goto _loop55; } else {throw antlr::NoViableAltException(antlr::RefAST(_t));}
|
||
- }
|
||
- }
|
||
- _cnt55++;
|
||
- }
|
||
- _loop55:;
|
||
- } // ( ... )+
|
||
- statement_list_AST = RefDNode(currentAST.root);
|
||
- returnAST = statement_list_AST;
|
||
- _retTree = _t;
|
||
-}
|
||
-
|
||
void GDLTreeParser::parameter_declaration(RefDNode _t) {
|
||
RefDNode parameter_declaration_AST_in = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t;
|
||
returnAST = RefDNode(antlr::nullAST);
|
||
@@ -1040,18 +1151,18 @@
|
||
RefDNode id = RefDNode(antlr::nullAST);
|
||
RefDNode id_AST = RefDNode(antlr::nullAST);
|
||
|
||
- RefDNode __t14 = _t;
|
||
- RefDNode tmp10_AST = RefDNode(antlr::nullAST);
|
||
- RefDNode tmp10_AST_in = RefDNode(antlr::nullAST);
|
||
- tmp10_AST = astFactory->create(antlr::RefAST(_t));
|
||
- tmp10_AST_in = _t;
|
||
- antlr::ASTPair __currentAST14 = currentAST;
|
||
+ RefDNode __t13 = _t;
|
||
+ RefDNode tmp12_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp12_AST_in = RefDNode(antlr::nullAST);
|
||
+ tmp12_AST = astFactory->create(antlr::RefAST(_t));
|
||
+ tmp12_AST_in = _t;
|
||
+ antlr::ASTPair __currentAST13 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),PARADECL);
|
||
_t = _t->getFirstChild();
|
||
{ // ( ... )+
|
||
- int _cnt16=0;
|
||
+ int _cnt15=0;
|
||
for (;;) {
|
||
if (_t == RefDNode(antlr::nullAST) )
|
||
_t = ASTNULL;
|
||
@@ -1076,15 +1187,15 @@
|
||
}
|
||
default:
|
||
{
|
||
- if ( _cnt16>=1 ) { goto _loop16; } else {throw antlr::NoViableAltException(antlr::RefAST(_t));}
|
||
+ if ( _cnt15>=1 ) { goto _loop15; } else {throw antlr::NoViableAltException(antlr::RefAST(_t));}
|
||
}
|
||
}
|
||
- _cnt16++;
|
||
+ _cnt15++;
|
||
}
|
||
- _loop16:;
|
||
+ _loop15:;
|
||
} // ( ... )+
|
||
- currentAST = __currentAST14;
|
||
- _t = __t14;
|
||
+ currentAST = __currentAST13;
|
||
+ _t = __t13;
|
||
_t = _t->getNextSibling();
|
||
returnAST = parameter_declaration_AST;
|
||
_retTree = _t;
|
||
@@ -1100,12 +1211,12 @@
|
||
RefDNode val = RefDNode(antlr::nullAST);
|
||
RefDNode val_AST = RefDNode(antlr::nullAST);
|
||
|
||
- RefDNode __t18 = _t;
|
||
- RefDNode tmp11_AST = RefDNode(antlr::nullAST);
|
||
- RefDNode tmp11_AST_in = RefDNode(antlr::nullAST);
|
||
- tmp11_AST = astFactory->create(antlr::RefAST(_t));
|
||
- tmp11_AST_in = _t;
|
||
- antlr::ASTPair __currentAST18 = currentAST;
|
||
+ RefDNode __t17 = _t;
|
||
+ RefDNode tmp13_AST = RefDNode(antlr::nullAST);
|
||
+ RefDNode tmp13_AST_in = RefDNode(antlr::nullAST);
|
||
+ tmp13_AST = astFactory->create(antlr::RefAST(_t));
|
||
+ tmp13_AST_in = _t;
|
||
+ antlr::ASTPair __currentAST17 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),KEYDECL);
|
||
@@ -1120,8 +1231,8 @@
|
||
val_AST = astFactory->create(antlr::RefAST(val));
|
||
match(antlr::RefAST(_t),IDENTIFIER);
|
||
_t = _t->getNextSibling();
|
||
- currentAST = __currentAST18;
|
||
- _t = __t18;
|
||
+ currentAST = __currentAST17;
|
||
+ _t = __t17;
|
||
_t = _t->getNextSibling();
|
||
|
||
comp.AddKey(key->getText(),val->getText());
|
||
@@ -1130,103 +1241,6 @@
|
||
_retTree = _t;
|
||
}
|
||
|
||
-void GDLTreeParser::common_block(RefDNode _t) {
|
||
- RefDNode common_block_AST_in = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t;
|
||
- returnAST = RefDNode(antlr::nullAST);
|
||
- antlr::ASTPair currentAST;
|
||
- RefDNode common_block_AST = RefDNode(antlr::nullAST);
|
||
- RefDNode id = RefDNode(antlr::nullAST);
|
||
- RefDNode id_AST = RefDNode(antlr::nullAST);
|
||
- RefDNode cv = RefDNode(antlr::nullAST);
|
||
- RefDNode cv_AST = RefDNode(antlr::nullAST);
|
||
- RefDNode id2 = RefDNode(antlr::nullAST);
|
||
- RefDNode id2_AST = RefDNode(antlr::nullAST);
|
||
-
|
||
- if (_t == RefDNode(antlr::nullAST) )
|
||
- _t = ASTNULL;
|
||
- switch ( _t->getType()) {
|
||
- case COMMONDEF:
|
||
- {
|
||
- RefDNode __t30 = _t;
|
||
- RefDNode tmp12_AST = RefDNode(antlr::nullAST);
|
||
- RefDNode tmp12_AST_in = RefDNode(antlr::nullAST);
|
||
- tmp12_AST = astFactory->create(antlr::RefAST(_t));
|
||
- tmp12_AST_in = _t;
|
||
- antlr::ASTPair __currentAST30 = currentAST;
|
||
- currentAST.root = currentAST.child;
|
||
- currentAST.child = RefDNode(antlr::nullAST);
|
||
- match(antlr::RefAST(_t),COMMONDEF);
|
||
- _t = _t->getFirstChild();
|
||
- id = _t;
|
||
- RefDNode id_AST_in = RefDNode(antlr::nullAST);
|
||
- id_AST = astFactory->create(antlr::RefAST(id));
|
||
- match(antlr::RefAST(_t),IDENTIFIER);
|
||
- _t = _t->getNextSibling();
|
||
-
|
||
- DCommonBase* actCommon=comp.CommonDef(id->getText());
|
||
-
|
||
- { // ( ... )+
|
||
- int _cnt32=0;
|
||
- for (;;) {
|
||
- if (_t == RefDNode(antlr::nullAST) )
|
||
- _t = ASTNULL;
|
||
- if ((_t->getType() == IDENTIFIER)) {
|
||
- cv = _t;
|
||
- RefDNode cv_AST_in = RefDNode(antlr::nullAST);
|
||
- cv_AST = astFactory->create(antlr::RefAST(cv));
|
||
- match(antlr::RefAST(_t),IDENTIFIER);
|
||
- _t = _t->getNextSibling();
|
||
-
|
||
- comp.CommonVar(actCommon,cv->getText());
|
||
-
|
||
- }
|
||
- else {
|
||
- if ( _cnt32>=1 ) { goto _loop32; } else {throw antlr::NoViableAltException(antlr::RefAST(_t));}
|
||
- }
|
||
-
|
||
- _cnt32++;
|
||
- }
|
||
- _loop32:;
|
||
- } // ( ... )+
|
||
- currentAST = __currentAST30;
|
||
- _t = __t30;
|
||
- _t = _t->getNextSibling();
|
||
- break;
|
||
- }
|
||
- case COMMONDECL:
|
||
- {
|
||
- RefDNode __t33 = _t;
|
||
- RefDNode tmp13_AST = RefDNode(antlr::nullAST);
|
||
- RefDNode tmp13_AST_in = RefDNode(antlr::nullAST);
|
||
- tmp13_AST = astFactory->create(antlr::RefAST(_t));
|
||
- tmp13_AST_in = _t;
|
||
- antlr::ASTPair __currentAST33 = currentAST;
|
||
- currentAST.root = currentAST.child;
|
||
- currentAST.child = RefDNode(antlr::nullAST);
|
||
- match(antlr::RefAST(_t),COMMONDECL);
|
||
- _t = _t->getFirstChild();
|
||
- id2 = _t;
|
||
- RefDNode id2_AST_in = RefDNode(antlr::nullAST);
|
||
- id2_AST = astFactory->create(antlr::RefAST(id2));
|
||
- match(antlr::RefAST(_t),IDENTIFIER);
|
||
- _t = _t->getNextSibling();
|
||
-
|
||
- comp.CommonDecl(id2->getText());
|
||
-
|
||
- currentAST = __currentAST33;
|
||
- _t = __t33;
|
||
- _t = _t->getNextSibling();
|
||
- break;
|
||
- }
|
||
- default:
|
||
- {
|
||
- throw antlr::NoViableAltException(antlr::RefAST(_t));
|
||
- }
|
||
- }
|
||
- returnAST = common_block_AST;
|
||
- _retTree = _t;
|
||
-}
|
||
-
|
||
void GDLTreeParser::caseswitch_body(RefDNode _t) {
|
||
RefDNode caseswitch_body_AST_in = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t;
|
||
returnAST = RefDNode(antlr::nullAST);
|
||
@@ -1238,13 +1252,13 @@
|
||
switch ( _t->getType()) {
|
||
case BLOCK:
|
||
{
|
||
- RefDNode __t35 = _t;
|
||
+ RefDNode __t34 = _t;
|
||
RefDNode tmp14_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp14_AST_in = RefDNode(antlr::nullAST);
|
||
tmp14_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp14_AST_in = _t;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(tmp14_AST));
|
||
- antlr::ASTPair __currentAST35 = currentAST;
|
||
+ antlr::ASTPair __currentAST34 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),BLOCK);
|
||
@@ -1313,21 +1327,21 @@
|
||
}
|
||
}
|
||
}
|
||
- currentAST = __currentAST35;
|
||
- _t = __t35;
|
||
+ currentAST = __currentAST34;
|
||
+ _t = __t34;
|
||
_t = _t->getNextSibling();
|
||
caseswitch_body_AST = RefDNode(currentAST.root);
|
||
break;
|
||
}
|
||
case ELSEBLK:
|
||
{
|
||
- RefDNode __t37 = _t;
|
||
+ RefDNode __t36 = _t;
|
||
RefDNode tmp15_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp15_AST_in = RefDNode(antlr::nullAST);
|
||
tmp15_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp15_AST_in = _t;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(tmp15_AST));
|
||
- antlr::ASTPair __currentAST37 = currentAST;
|
||
+ antlr::ASTPair __currentAST36 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),ELSEBLK);
|
||
@@ -1393,8 +1407,8 @@
|
||
}
|
||
}
|
||
}
|
||
- currentAST = __currentAST37;
|
||
- _t = __t37;
|
||
+ currentAST = __currentAST36;
|
||
+ _t = __t36;
|
||
_t = _t->getNextSibling();
|
||
caseswitch_body_AST = RefDNode(currentAST.root);
|
||
break;
|
||
@@ -1430,13 +1444,13 @@
|
||
}
|
||
case DOT:
|
||
{
|
||
- RefDNode __t210 = _t;
|
||
+ RefDNode __t209 = _t;
|
||
RefDNode tmp16_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp16_AST_in = RefDNode(antlr::nullAST);
|
||
tmp16_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp16_AST_in = _t;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(tmp16_AST));
|
||
- antlr::ASTPair __currentAST210 = currentAST;
|
||
+ antlr::ASTPair __currentAST209 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),DOT);
|
||
@@ -1445,7 +1459,7 @@
|
||
_t = _retTree;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
{ // ( ... )+
|
||
- int _cnt212=0;
|
||
+ int _cnt211=0;
|
||
for (;;) {
|
||
if (_t == RefDNode(antlr::nullAST) )
|
||
_t = ASTNULL;
|
||
@@ -1455,28 +1469,28 @@
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
}
|
||
else {
|
||
- if ( _cnt212>=1 ) { goto _loop212; } else {throw antlr::NoViableAltException(antlr::RefAST(_t));}
|
||
+ if ( _cnt211>=1 ) { goto _loop211; } else {throw antlr::NoViableAltException(antlr::RefAST(_t));}
|
||
}
|
||
|
||
- _cnt212++;
|
||
+ _cnt211++;
|
||
}
|
||
- _loop212:;
|
||
+ _loop211:;
|
||
} // ( ... )+
|
||
- currentAST = __currentAST210;
|
||
- _t = __t210;
|
||
+ currentAST = __currentAST209;
|
||
+ _t = __t209;
|
||
_t = _t->getNextSibling();
|
||
expr_AST = RefDNode(currentAST.root);
|
||
break;
|
||
}
|
||
case DEREF:
|
||
{
|
||
- RefDNode __t213 = _t;
|
||
+ RefDNode __t212 = _t;
|
||
RefDNode tmp17_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp17_AST_in = RefDNode(antlr::nullAST);
|
||
tmp17_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp17_AST_in = _t;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(tmp17_AST));
|
||
- antlr::ASTPair __currentAST213 = currentAST;
|
||
+ antlr::ASTPair __currentAST212 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),DEREF);
|
||
@@ -1484,8 +1498,8 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
- currentAST = __currentAST213;
|
||
- _t = __t213;
|
||
+ currentAST = __currentAST212;
|
||
+ _t = __t212;
|
||
_t = _t->getNextSibling();
|
||
expr_AST = RefDNode(currentAST.root);
|
||
break;
|
||
@@ -1575,12 +1589,12 @@
|
||
int labelStart = comp.NDefLabel();
|
||
|
||
|
||
- RefDNode __t40 = _t;
|
||
+ RefDNode __t39 = _t;
|
||
s = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t;
|
||
RefDNode s_AST_in = RefDNode(antlr::nullAST);
|
||
s_AST = astFactory->create(antlr::RefAST(s));
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(s_AST));
|
||
- antlr::ASTPair __currentAST40 = currentAST;
|
||
+ antlr::ASTPair __currentAST39 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),SWITCH);
|
||
@@ -1598,14 +1612,14 @@
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
}
|
||
else {
|
||
- goto _loop42;
|
||
+ goto _loop41;
|
||
}
|
||
|
||
}
|
||
- _loop42:;
|
||
+ _loop41:;
|
||
} // ( ... )*
|
||
- currentAST = __currentAST40;
|
||
- _t = __t40;
|
||
+ currentAST = __currentAST39;
|
||
+ _t = __t39;
|
||
_t = _t->getNextSibling();
|
||
|
||
s_AST->SetLabelRange( labelStart, comp.NDefLabel());
|
||
@@ -1626,12 +1640,12 @@
|
||
int labelStart = comp.NDefLabel();
|
||
|
||
|
||
- RefDNode __t44 = _t;
|
||
+ RefDNode __t43 = _t;
|
||
c = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t;
|
||
RefDNode c_AST_in = RefDNode(antlr::nullAST);
|
||
c_AST = astFactory->create(antlr::RefAST(c));
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(c_AST));
|
||
- antlr::ASTPair __currentAST44 = currentAST;
|
||
+ antlr::ASTPair __currentAST43 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),CASE);
|
||
@@ -1649,14 +1663,14 @@
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
}
|
||
else {
|
||
- goto _loop46;
|
||
+ goto _loop45;
|
||
}
|
||
|
||
}
|
||
- _loop46:;
|
||
+ _loop45:;
|
||
} // ( ... )*
|
||
- currentAST = __currentAST44;
|
||
- _t = __t44;
|
||
+ currentAST = __currentAST43;
|
||
+ _t = __t43;
|
||
_t = _t->getNextSibling();
|
||
|
||
c_AST->SetLabelRange( labelStart, comp.NDefLabel());
|
||
@@ -1672,13 +1686,13 @@
|
||
antlr::ASTPair currentAST;
|
||
RefDNode block_AST = RefDNode(antlr::nullAST);
|
||
|
||
- RefDNode __t48 = _t;
|
||
+ RefDNode __t47 = _t;
|
||
RefDNode tmp18_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp18_AST_in = RefDNode(antlr::nullAST);
|
||
tmp18_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp18_AST_in = _t;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(tmp18_AST));
|
||
- antlr::ASTPair __currentAST48 = currentAST;
|
||
+ antlr::ASTPair __currentAST47 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),BLOCK);
|
||
@@ -1744,8 +1758,8 @@
|
||
}
|
||
}
|
||
}
|
||
- currentAST = __currentAST48;
|
||
- _t = __t48;
|
||
+ currentAST = __currentAST47;
|
||
+ _t = __t47;
|
||
_t = _t->getNextSibling();
|
||
block_AST = RefDNode(currentAST.root);
|
||
returnAST = block_AST;
|
||
@@ -1760,12 +1774,12 @@
|
||
RefDNode s_AST = RefDNode(antlr::nullAST);
|
||
RefDNode s = RefDNode(antlr::nullAST);
|
||
|
||
- RefDNode __t51 = _t;
|
||
+ RefDNode __t50 = _t;
|
||
RefDNode tmp19_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp19_AST_in = RefDNode(antlr::nullAST);
|
||
tmp19_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp19_AST_in = _t;
|
||
- antlr::ASTPair __currentAST51 = currentAST;
|
||
+ antlr::ASTPair __currentAST50 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),BLOCK);
|
||
@@ -1841,8 +1855,8 @@
|
||
}
|
||
}
|
||
}
|
||
- currentAST = __currentAST51;
|
||
- _t = __t51;
|
||
+ currentAST = __currentAST50;
|
||
+ _t = __t50;
|
||
_t = _t->getNextSibling();
|
||
returnAST = unblock_AST;
|
||
_retTree = _t;
|
||
@@ -1856,11 +1870,11 @@
|
||
RefDNode i = RefDNode(antlr::nullAST);
|
||
RefDNode i_AST = RefDNode(antlr::nullAST);
|
||
|
||
- RefDNode __t67 = _t;
|
||
+ RefDNode __t66 = _t;
|
||
i = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t;
|
||
RefDNode i_AST_in = RefDNode(antlr::nullAST);
|
||
i_AST = astFactory->create(antlr::RefAST(i));
|
||
- antlr::ASTPair __currentAST67 = currentAST;
|
||
+ antlr::ASTPair __currentAST66 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),IDENTIFIER);
|
||
@@ -1871,8 +1885,8 @@
|
||
tmp20_AST_in = _t;
|
||
match(antlr::RefAST(_t),COLON);
|
||
_t = _t->getNextSibling();
|
||
- currentAST = __currentAST67;
|
||
- _t = __t67;
|
||
+ currentAST = __currentAST66;
|
||
+ _t = __t66;
|
||
_t = _t->getNextSibling();
|
||
label_AST = RefDNode(currentAST.root);
|
||
|
||
@@ -1902,11 +1916,11 @@
|
||
RefDNode r_AST = RefDNode(antlr::nullAST);
|
||
RefDNode r = RefDNode(antlr::nullAST);
|
||
|
||
- RefDNode __t121 = _t;
|
||
+ RefDNode __t120 = _t;
|
||
a = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t;
|
||
RefDNode a_AST_in = RefDNode(antlr::nullAST);
|
||
a_AST = astFactory->create(antlr::RefAST(a));
|
||
- antlr::ASTPair __currentAST121 = currentAST;
|
||
+ antlr::ASTPair __currentAST120 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),ASSIGN);
|
||
@@ -1919,8 +1933,8 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
r_AST = returnAST;
|
||
- currentAST = __currentAST121;
|
||
- _t = __t121;
|
||
+ currentAST = __currentAST120;
|
||
+ _t = __t120;
|
||
_t = _t->getNextSibling();
|
||
assign_expr_statement_AST = RefDNode(currentAST.root);
|
||
|
||
@@ -2077,11 +2091,11 @@
|
||
switch ( _t->getType()) {
|
||
case AND_OP_EQ:
|
||
{
|
||
- RefDNode __t124 = _t;
|
||
+ RefDNode __t123 = _t;
|
||
a1 = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t;
|
||
RefDNode a1_AST_in = RefDNode(antlr::nullAST);
|
||
a1_AST = astFactory->create(antlr::RefAST(a1));
|
||
- antlr::ASTPair __currentAST124 = currentAST;
|
||
+ antlr::ASTPair __currentAST123 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),AND_OP_EQ);
|
||
@@ -2094,8 +2108,8 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
r1_AST = returnAST;
|
||
- currentAST = __currentAST124;
|
||
- _t = __t124;
|
||
+ currentAST = __currentAST123;
|
||
+ _t = __t123;
|
||
_t = _t->getNextSibling();
|
||
comp_assign_expr_AST = RefDNode(currentAST.root);
|
||
l=l1_AST; comp_assign_expr_AST=RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(ASSIGN,":=")))->add(antlr::RefAST(RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(AND_OP,"and")))->add(antlr::RefAST(l1_AST))->add(antlr::RefAST(r1_AST))))))->add(antlr::RefAST(RemoveNextSibling(l1_AST)))));
|
||
@@ -2110,11 +2124,11 @@
|
||
}
|
||
case ASTERIX_EQ:
|
||
{
|
||
- RefDNode __t125 = _t;
|
||
+ RefDNode __t124 = _t;
|
||
a2 = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t;
|
||
RefDNode a2_AST_in = RefDNode(antlr::nullAST);
|
||
a2_AST = astFactory->create(antlr::RefAST(a2));
|
||
- antlr::ASTPair __currentAST125 = currentAST;
|
||
+ antlr::ASTPair __currentAST124 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),ASTERIX_EQ);
|
||
@@ -2127,8 +2141,8 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
r2_AST = returnAST;
|
||
- currentAST = __currentAST125;
|
||
- _t = __t125;
|
||
+ currentAST = __currentAST124;
|
||
+ _t = __t124;
|
||
_t = _t->getNextSibling();
|
||
comp_assign_expr_AST = RefDNode(currentAST.root);
|
||
l=l2_AST; comp_assign_expr_AST=RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(ASSIGN,":=")))->add(antlr::RefAST(RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(ASTERIX,"*")))->add(antlr::RefAST(l2_AST))->add(antlr::RefAST(r2_AST))))))->add(antlr::RefAST(RemoveNextSibling(l2_AST)))));
|
||
@@ -2143,11 +2157,11 @@
|
||
}
|
||
case EQ_OP_EQ:
|
||
{
|
||
- RefDNode __t126 = _t;
|
||
+ RefDNode __t125 = _t;
|
||
a3 = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t;
|
||
RefDNode a3_AST_in = RefDNode(antlr::nullAST);
|
||
a3_AST = astFactory->create(antlr::RefAST(a3));
|
||
- antlr::ASTPair __currentAST126 = currentAST;
|
||
+ antlr::ASTPair __currentAST125 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),EQ_OP_EQ);
|
||
@@ -2160,8 +2174,8 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
r3_AST = returnAST;
|
||
- currentAST = __currentAST126;
|
||
- _t = __t126;
|
||
+ currentAST = __currentAST125;
|
||
+ _t = __t125;
|
||
_t = _t->getNextSibling();
|
||
comp_assign_expr_AST = RefDNode(currentAST.root);
|
||
l=l3_AST; comp_assign_expr_AST=RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(ASSIGN,":=")))->add(antlr::RefAST(RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(EQ_OP,"eq")))->add(antlr::RefAST(l3_AST))->add(antlr::RefAST(r3_AST))))))->add(antlr::RefAST(RemoveNextSibling(l3_AST)))));
|
||
@@ -2176,11 +2190,11 @@
|
||
}
|
||
case GE_OP_EQ:
|
||
{
|
||
- RefDNode __t127 = _t;
|
||
+ RefDNode __t126 = _t;
|
||
a4 = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t;
|
||
RefDNode a4_AST_in = RefDNode(antlr::nullAST);
|
||
a4_AST = astFactory->create(antlr::RefAST(a4));
|
||
- antlr::ASTPair __currentAST127 = currentAST;
|
||
+ antlr::ASTPair __currentAST126 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),GE_OP_EQ);
|
||
@@ -2193,8 +2207,8 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
r4_AST = returnAST;
|
||
- currentAST = __currentAST127;
|
||
- _t = __t127;
|
||
+ currentAST = __currentAST126;
|
||
+ _t = __t126;
|
||
_t = _t->getNextSibling();
|
||
comp_assign_expr_AST = RefDNode(currentAST.root);
|
||
l=l4_AST; comp_assign_expr_AST=RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(ASSIGN,":=")))->add(antlr::RefAST(RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(GE_OP,"ge")))->add(antlr::RefAST(l4_AST))->add(antlr::RefAST(r4_AST))))))->add(antlr::RefAST(RemoveNextSibling(l4_AST)))));
|
||
@@ -2209,11 +2223,11 @@
|
||
}
|
||
case GTMARK_EQ:
|
||
{
|
||
- RefDNode __t128 = _t;
|
||
+ RefDNode __t127 = _t;
|
||
a5 = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t;
|
||
RefDNode a5_AST_in = RefDNode(antlr::nullAST);
|
||
a5_AST = astFactory->create(antlr::RefAST(a5));
|
||
- antlr::ASTPair __currentAST128 = currentAST;
|
||
+ antlr::ASTPair __currentAST127 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),GTMARK_EQ);
|
||
@@ -2226,8 +2240,8 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
r5_AST = returnAST;
|
||
- currentAST = __currentAST128;
|
||
- _t = __t128;
|
||
+ currentAST = __currentAST127;
|
||
+ _t = __t127;
|
||
_t = _t->getNextSibling();
|
||
comp_assign_expr_AST = RefDNode(currentAST.root);
|
||
l=l5_AST; comp_assign_expr_AST=RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(ASSIGN,":=")))->add(antlr::RefAST(RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(GTMARK,">")))->add(antlr::RefAST(l5_AST))->add(antlr::RefAST(r5_AST))))))->add(antlr::RefAST(RemoveNextSibling(l5_AST)))));
|
||
@@ -2242,11 +2256,11 @@
|
||
}
|
||
case GT_OP_EQ:
|
||
{
|
||
- RefDNode __t129 = _t;
|
||
+ RefDNode __t128 = _t;
|
||
a6 = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t;
|
||
RefDNode a6_AST_in = RefDNode(antlr::nullAST);
|
||
a6_AST = astFactory->create(antlr::RefAST(a6));
|
||
- antlr::ASTPair __currentAST129 = currentAST;
|
||
+ antlr::ASTPair __currentAST128 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),GT_OP_EQ);
|
||
@@ -2259,8 +2273,8 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
r6_AST = returnAST;
|
||
- currentAST = __currentAST129;
|
||
- _t = __t129;
|
||
+ currentAST = __currentAST128;
|
||
+ _t = __t128;
|
||
_t = _t->getNextSibling();
|
||
comp_assign_expr_AST = RefDNode(currentAST.root);
|
||
l=l6_AST; comp_assign_expr_AST=RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(ASSIGN,":=")))->add(antlr::RefAST(RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(GT_OP,"gt")))->add(antlr::RefAST(l6_AST))->add(antlr::RefAST(r6_AST))))))->add(antlr::RefAST(RemoveNextSibling(l6_AST)))));
|
||
@@ -2275,11 +2289,11 @@
|
||
}
|
||
case LE_OP_EQ:
|
||
{
|
||
- RefDNode __t130 = _t;
|
||
+ RefDNode __t129 = _t;
|
||
a7 = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t;
|
||
RefDNode a7_AST_in = RefDNode(antlr::nullAST);
|
||
a7_AST = astFactory->create(antlr::RefAST(a7));
|
||
- antlr::ASTPair __currentAST130 = currentAST;
|
||
+ antlr::ASTPair __currentAST129 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),LE_OP_EQ);
|
||
@@ -2292,8 +2306,8 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
r7_AST = returnAST;
|
||
- currentAST = __currentAST130;
|
||
- _t = __t130;
|
||
+ currentAST = __currentAST129;
|
||
+ _t = __t129;
|
||
_t = _t->getNextSibling();
|
||
comp_assign_expr_AST = RefDNode(currentAST.root);
|
||
l=l7_AST; comp_assign_expr_AST=RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(ASSIGN,":=")))->add(antlr::RefAST(RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(LE_OP,"le")))->add(antlr::RefAST(l7_AST))->add(antlr::RefAST(r7_AST))))))->add(antlr::RefAST(RemoveNextSibling(l7_AST)))));
|
||
@@ -2308,11 +2322,11 @@
|
||
}
|
||
case LTMARK_EQ:
|
||
{
|
||
- RefDNode __t131 = _t;
|
||
+ RefDNode __t130 = _t;
|
||
a8 = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t;
|
||
RefDNode a8_AST_in = RefDNode(antlr::nullAST);
|
||
a8_AST = astFactory->create(antlr::RefAST(a8));
|
||
- antlr::ASTPair __currentAST131 = currentAST;
|
||
+ antlr::ASTPair __currentAST130 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),LTMARK_EQ);
|
||
@@ -2325,8 +2339,8 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
r8_AST = returnAST;
|
||
- currentAST = __currentAST131;
|
||
- _t = __t131;
|
||
+ currentAST = __currentAST130;
|
||
+ _t = __t130;
|
||
_t = _t->getNextSibling();
|
||
comp_assign_expr_AST = RefDNode(currentAST.root);
|
||
l=l8_AST; comp_assign_expr_AST=RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(ASSIGN,":=")))->add(antlr::RefAST(RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(LTMARK,"<")))->add(antlr::RefAST(l8_AST))->add(antlr::RefAST(r8_AST))))))->add(antlr::RefAST(RemoveNextSibling(l8_AST)))));
|
||
@@ -2341,11 +2355,11 @@
|
||
}
|
||
case LT_OP_EQ:
|
||
{
|
||
- RefDNode __t132 = _t;
|
||
+ RefDNode __t131 = _t;
|
||
a9 = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t;
|
||
RefDNode a9_AST_in = RefDNode(antlr::nullAST);
|
||
a9_AST = astFactory->create(antlr::RefAST(a9));
|
||
- antlr::ASTPair __currentAST132 = currentAST;
|
||
+ antlr::ASTPair __currentAST131 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),LT_OP_EQ);
|
||
@@ -2358,8 +2372,8 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
r9_AST = returnAST;
|
||
- currentAST = __currentAST132;
|
||
- _t = __t132;
|
||
+ currentAST = __currentAST131;
|
||
+ _t = __t131;
|
||
_t = _t->getNextSibling();
|
||
comp_assign_expr_AST = RefDNode(currentAST.root);
|
||
l=l9_AST; comp_assign_expr_AST=RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(ASSIGN,":=")))->add(antlr::RefAST(RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(LT_OP,"lt")))->add(antlr::RefAST(l9_AST))->add(antlr::RefAST(r9_AST))))))->add(antlr::RefAST(RemoveNextSibling(l9_AST)))));
|
||
@@ -2374,11 +2388,11 @@
|
||
}
|
||
case MATRIX_OP1_EQ:
|
||
{
|
||
- RefDNode __t133 = _t;
|
||
+ RefDNode __t132 = _t;
|
||
a10 = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t;
|
||
RefDNode a10_AST_in = RefDNode(antlr::nullAST);
|
||
a10_AST = astFactory->create(antlr::RefAST(a10));
|
||
- antlr::ASTPair __currentAST133 = currentAST;
|
||
+ antlr::ASTPair __currentAST132 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),MATRIX_OP1_EQ);
|
||
@@ -2391,8 +2405,8 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
r10_AST = returnAST;
|
||
- currentAST = __currentAST133;
|
||
- _t = __t133;
|
||
+ currentAST = __currentAST132;
|
||
+ _t = __t132;
|
||
_t = _t->getNextSibling();
|
||
comp_assign_expr_AST = RefDNode(currentAST.root);
|
||
l=l10_AST; comp_assign_expr_AST=RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(ASSIGN,":=")))->add(antlr::RefAST(RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(MATRIX_OP1,"#")))->add(antlr::RefAST(l10_AST))->add(antlr::RefAST(r10_AST))))))->add(antlr::RefAST(RemoveNextSibling(l10_AST)))));
|
||
@@ -2407,11 +2421,11 @@
|
||
}
|
||
case MATRIX_OP2_EQ:
|
||
{
|
||
- RefDNode __t134 = _t;
|
||
+ RefDNode __t133 = _t;
|
||
a11 = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t;
|
||
RefDNode a11_AST_in = RefDNode(antlr::nullAST);
|
||
a11_AST = astFactory->create(antlr::RefAST(a11));
|
||
- antlr::ASTPair __currentAST134 = currentAST;
|
||
+ antlr::ASTPair __currentAST133 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),MATRIX_OP2_EQ);
|
||
@@ -2424,8 +2438,8 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
r11_AST = returnAST;
|
||
- currentAST = __currentAST134;
|
||
- _t = __t134;
|
||
+ currentAST = __currentAST133;
|
||
+ _t = __t133;
|
||
_t = _t->getNextSibling();
|
||
comp_assign_expr_AST = RefDNode(currentAST.root);
|
||
l=l11_AST; comp_assign_expr_AST=RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(ASSIGN,":=")))->add(antlr::RefAST(RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(MATRIX_OP2,"##")))->add(antlr::RefAST(l11_AST))->add(antlr::RefAST(r11_AST))))))->add(antlr::RefAST(RemoveNextSibling(l11_AST)))));
|
||
@@ -2440,11 +2454,11 @@
|
||
}
|
||
case MINUS_EQ:
|
||
{
|
||
- RefDNode __t135 = _t;
|
||
+ RefDNode __t134 = _t;
|
||
a12 = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t;
|
||
RefDNode a12_AST_in = RefDNode(antlr::nullAST);
|
||
a12_AST = astFactory->create(antlr::RefAST(a12));
|
||
- antlr::ASTPair __currentAST135 = currentAST;
|
||
+ antlr::ASTPair __currentAST134 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),MINUS_EQ);
|
||
@@ -2457,8 +2471,8 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
r12_AST = returnAST;
|
||
- currentAST = __currentAST135;
|
||
- _t = __t135;
|
||
+ currentAST = __currentAST134;
|
||
+ _t = __t134;
|
||
_t = _t->getNextSibling();
|
||
comp_assign_expr_AST = RefDNode(currentAST.root);
|
||
l=l12_AST; comp_assign_expr_AST=RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(ASSIGN,":=")))->add(antlr::RefAST(RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(MINUS,"-")))->add(antlr::RefAST(l12_AST))->add(antlr::RefAST(r12_AST))))))->add(antlr::RefAST(RemoveNextSibling(l12_AST)))));
|
||
@@ -2473,11 +2487,11 @@
|
||
}
|
||
case MOD_OP_EQ:
|
||
{
|
||
- RefDNode __t136 = _t;
|
||
+ RefDNode __t135 = _t;
|
||
a13 = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t;
|
||
RefDNode a13_AST_in = RefDNode(antlr::nullAST);
|
||
a13_AST = astFactory->create(antlr::RefAST(a13));
|
||
- antlr::ASTPair __currentAST136 = currentAST;
|
||
+ antlr::ASTPair __currentAST135 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),MOD_OP_EQ);
|
||
@@ -2490,8 +2504,8 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
r13_AST = returnAST;
|
||
- currentAST = __currentAST136;
|
||
- _t = __t136;
|
||
+ currentAST = __currentAST135;
|
||
+ _t = __t135;
|
||
_t = _t->getNextSibling();
|
||
comp_assign_expr_AST = RefDNode(currentAST.root);
|
||
l=l13_AST; comp_assign_expr_AST=RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(ASSIGN,":=")))->add(antlr::RefAST(RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(MOD_OP,"mod")))->add(antlr::RefAST(l13_AST))->add(antlr::RefAST(r13_AST))))))->add(antlr::RefAST(RemoveNextSibling(l13_AST)))));
|
||
@@ -2506,11 +2520,11 @@
|
||
}
|
||
case NE_OP_EQ:
|
||
{
|
||
- RefDNode __t137 = _t;
|
||
+ RefDNode __t136 = _t;
|
||
a14 = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t;
|
||
RefDNode a14_AST_in = RefDNode(antlr::nullAST);
|
||
a14_AST = astFactory->create(antlr::RefAST(a14));
|
||
- antlr::ASTPair __currentAST137 = currentAST;
|
||
+ antlr::ASTPair __currentAST136 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),NE_OP_EQ);
|
||
@@ -2523,8 +2537,8 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
r14_AST = returnAST;
|
||
- currentAST = __currentAST137;
|
||
- _t = __t137;
|
||
+ currentAST = __currentAST136;
|
||
+ _t = __t136;
|
||
_t = _t->getNextSibling();
|
||
comp_assign_expr_AST = RefDNode(currentAST.root);
|
||
l=l14_AST; comp_assign_expr_AST=RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(ASSIGN,":=")))->add(antlr::RefAST(RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(NE_OP,"ne")))->add(antlr::RefAST(l14_AST))->add(antlr::RefAST(r14_AST))))))->add(antlr::RefAST(RemoveNextSibling(l14_AST)))));
|
||
@@ -2539,11 +2553,11 @@
|
||
}
|
||
case OR_OP_EQ:
|
||
{
|
||
- RefDNode __t138 = _t;
|
||
+ RefDNode __t137 = _t;
|
||
a15 = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t;
|
||
RefDNode a15_AST_in = RefDNode(antlr::nullAST);
|
||
a15_AST = astFactory->create(antlr::RefAST(a15));
|
||
- antlr::ASTPair __currentAST138 = currentAST;
|
||
+ antlr::ASTPair __currentAST137 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),OR_OP_EQ);
|
||
@@ -2556,8 +2570,8 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
r15_AST = returnAST;
|
||
- currentAST = __currentAST138;
|
||
- _t = __t138;
|
||
+ currentAST = __currentAST137;
|
||
+ _t = __t137;
|
||
_t = _t->getNextSibling();
|
||
comp_assign_expr_AST = RefDNode(currentAST.root);
|
||
l=l15_AST; comp_assign_expr_AST=RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(ASSIGN,":=")))->add(antlr::RefAST(RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(OR_OP,"or")))->add(antlr::RefAST(l15_AST))->add(antlr::RefAST(r15_AST))))))->add(antlr::RefAST(RemoveNextSibling(l15_AST)))));
|
||
@@ -2572,11 +2586,11 @@
|
||
}
|
||
case PLUS_EQ:
|
||
{
|
||
- RefDNode __t139 = _t;
|
||
+ RefDNode __t138 = _t;
|
||
a16 = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t;
|
||
RefDNode a16_AST_in = RefDNode(antlr::nullAST);
|
||
a16_AST = astFactory->create(antlr::RefAST(a16));
|
||
- antlr::ASTPair __currentAST139 = currentAST;
|
||
+ antlr::ASTPair __currentAST138 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),PLUS_EQ);
|
||
@@ -2589,8 +2603,8 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
r16_AST = returnAST;
|
||
- currentAST = __currentAST139;
|
||
- _t = __t139;
|
||
+ currentAST = __currentAST138;
|
||
+ _t = __t138;
|
||
_t = _t->getNextSibling();
|
||
comp_assign_expr_AST = RefDNode(currentAST.root);
|
||
l=l16_AST; comp_assign_expr_AST=RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(ASSIGN,":=")))->add(antlr::RefAST(RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(PLUS,"+")))->add(antlr::RefAST(l16_AST))->add(antlr::RefAST(r16_AST))))))->add(antlr::RefAST(RemoveNextSibling(l16_AST)))));
|
||
@@ -2605,11 +2619,11 @@
|
||
}
|
||
case POW_EQ:
|
||
{
|
||
- RefDNode __t140 = _t;
|
||
+ RefDNode __t139 = _t;
|
||
a17 = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t;
|
||
RefDNode a17_AST_in = RefDNode(antlr::nullAST);
|
||
a17_AST = astFactory->create(antlr::RefAST(a17));
|
||
- antlr::ASTPair __currentAST140 = currentAST;
|
||
+ antlr::ASTPair __currentAST139 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),POW_EQ);
|
||
@@ -2622,8 +2636,8 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
r17_AST = returnAST;
|
||
- currentAST = __currentAST140;
|
||
- _t = __t140;
|
||
+ currentAST = __currentAST139;
|
||
+ _t = __t139;
|
||
_t = _t->getNextSibling();
|
||
comp_assign_expr_AST = RefDNode(currentAST.root);
|
||
l=l17_AST; comp_assign_expr_AST=RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(ASSIGN,":=")))->add(antlr::RefAST(RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(POW,"^")))->add(antlr::RefAST(l17_AST))->add(antlr::RefAST(r17_AST))))))->add(antlr::RefAST(RemoveNextSibling(l17_AST)))));
|
||
@@ -2638,11 +2652,11 @@
|
||
}
|
||
case SLASH_EQ:
|
||
{
|
||
- RefDNode __t141 = _t;
|
||
+ RefDNode __t140 = _t;
|
||
a18 = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t;
|
||
RefDNode a18_AST_in = RefDNode(antlr::nullAST);
|
||
a18_AST = astFactory->create(antlr::RefAST(a18));
|
||
- antlr::ASTPair __currentAST141 = currentAST;
|
||
+ antlr::ASTPair __currentAST140 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),SLASH_EQ);
|
||
@@ -2655,8 +2669,8 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
r18_AST = returnAST;
|
||
- currentAST = __currentAST141;
|
||
- _t = __t141;
|
||
+ currentAST = __currentAST140;
|
||
+ _t = __t140;
|
||
_t = _t->getNextSibling();
|
||
comp_assign_expr_AST = RefDNode(currentAST.root);
|
||
l=l18_AST; comp_assign_expr_AST=RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(ASSIGN,":=")))->add(antlr::RefAST(RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(SLASH,"/")))->add(antlr::RefAST(l18_AST))->add(antlr::RefAST(r18_AST))))))->add(antlr::RefAST(RemoveNextSibling(l18_AST)))));
|
||
@@ -2671,11 +2685,11 @@
|
||
}
|
||
case XOR_OP_EQ:
|
||
{
|
||
- RefDNode __t142 = _t;
|
||
+ RefDNode __t141 = _t;
|
||
a19 = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t;
|
||
RefDNode a19_AST_in = RefDNode(antlr::nullAST);
|
||
a19_AST = astFactory->create(antlr::RefAST(a19));
|
||
- antlr::ASTPair __currentAST142 = currentAST;
|
||
+ antlr::ASTPair __currentAST141 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),XOR_OP_EQ);
|
||
@@ -2688,8 +2702,8 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
r19_AST = returnAST;
|
||
- currentAST = __currentAST142;
|
||
- _t = __t142;
|
||
+ currentAST = __currentAST141;
|
||
+ _t = __t141;
|
||
_t = _t->getNextSibling();
|
||
comp_assign_expr_AST = RefDNode(currentAST.root);
|
||
l=l19_AST; comp_assign_expr_AST=RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(ASSIGN,":=")))->add(antlr::RefAST(RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(XOR_OP,"xor")))->add(antlr::RefAST(l19_AST))->add(antlr::RefAST(r19_AST))))))->add(antlr::RefAST(RemoveNextSibling(l19_AST)))));
|
||
@@ -2731,13 +2745,13 @@
|
||
switch ( _t->getType()) {
|
||
case MPCALL:
|
||
{
|
||
- RefDNode __t77 = _t;
|
||
+ RefDNode __t76 = _t;
|
||
RefDNode tmp21_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp21_AST_in = RefDNode(antlr::nullAST);
|
||
tmp21_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp21_AST_in = _t;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(tmp21_AST));
|
||
- antlr::ASTPair __currentAST77 = currentAST;
|
||
+ antlr::ASTPair __currentAST76 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),MPCALL);
|
||
@@ -2762,27 +2776,27 @@
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
}
|
||
else {
|
||
- goto _loop79;
|
||
+ goto _loop78;
|
||
}
|
||
|
||
}
|
||
- _loop79:;
|
||
+ _loop78:;
|
||
} // ( ... )*
|
||
- currentAST = __currentAST77;
|
||
- _t = __t77;
|
||
+ currentAST = __currentAST76;
|
||
+ _t = __t76;
|
||
_t = _t->getNextSibling();
|
||
procedure_call_AST = RefDNode(currentAST.root);
|
||
break;
|
||
}
|
||
case MPCALL_PARENT:
|
||
{
|
||
- RefDNode __t80 = _t;
|
||
+ RefDNode __t79 = _t;
|
||
RefDNode tmp23_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp23_AST_in = RefDNode(antlr::nullAST);
|
||
tmp23_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp23_AST_in = _t;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(tmp23_AST));
|
||
- antlr::ASTPair __currentAST80 = currentAST;
|
||
+ antlr::ASTPair __currentAST79 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),MPCALL_PARENT);
|
||
@@ -2814,26 +2828,26 @@
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
}
|
||
else {
|
||
- goto _loop82;
|
||
+ goto _loop81;
|
||
}
|
||
|
||
}
|
||
- _loop82:;
|
||
+ _loop81:;
|
||
} // ( ... )*
|
||
- currentAST = __currentAST80;
|
||
- _t = __t80;
|
||
+ currentAST = __currentAST79;
|
||
+ _t = __t79;
|
||
_t = _t->getNextSibling();
|
||
procedure_call_AST = RefDNode(currentAST.root);
|
||
break;
|
||
}
|
||
case PCALL:
|
||
{
|
||
- RefDNode __t83 = _t;
|
||
+ RefDNode __t82 = _t;
|
||
p = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t;
|
||
RefDNode p_AST_in = RefDNode(antlr::nullAST);
|
||
p_AST = astFactory->create(antlr::RefAST(p));
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(p_AST));
|
||
- antlr::ASTPair __currentAST83 = currentAST;
|
||
+ antlr::ASTPair __currentAST82 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),PCALL);
|
||
@@ -2854,11 +2868,11 @@
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
}
|
||
else {
|
||
- goto _loop85;
|
||
+ goto _loop84;
|
||
}
|
||
|
||
}
|
||
- _loop85:;
|
||
+ _loop84:;
|
||
} // ( ... )*
|
||
|
||
// first search library procedures
|
||
@@ -2876,8 +2890,8 @@
|
||
id_AST->SetProIx(i);
|
||
}
|
||
|
||
- currentAST = __currentAST83;
|
||
- _t = __t83;
|
||
+ currentAST = __currentAST82;
|
||
+ _t = __t82;
|
||
_t = _t->getNextSibling();
|
||
procedure_call_AST = RefDNode(currentAST.root);
|
||
break;
|
||
@@ -2905,12 +2919,12 @@
|
||
int labelStart = comp.NDefLabel();
|
||
|
||
|
||
- RefDNode __t64 = _t;
|
||
+ RefDNode __t63 = _t;
|
||
f = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t;
|
||
RefDNode f_AST_in = RefDNode(antlr::nullAST);
|
||
f_AST = astFactory->create(antlr::RefAST(f));
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(f_AST));
|
||
- antlr::ASTPair __currentAST64 = currentAST;
|
||
+ antlr::ASTPair __currentAST63 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),FOR);
|
||
@@ -3024,8 +3038,8 @@
|
||
unblock(_t);
|
||
_t = _retTree;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
- currentAST = __currentAST64;
|
||
- _t = __t64;
|
||
+ currentAST = __currentAST63;
|
||
+ _t = __t63;
|
||
_t = _t->getNextSibling();
|
||
|
||
f_AST->SetLabelRange( labelStart, comp.NDefLabel());
|
||
@@ -3050,11 +3064,11 @@
|
||
int labelStart = comp.NDefLabel();
|
||
|
||
|
||
- RefDNode __t60 = _t;
|
||
+ RefDNode __t59 = _t;
|
||
r = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t;
|
||
RefDNode r_AST_in = RefDNode(antlr::nullAST);
|
||
r_AST = astFactory->create(antlr::RefAST(r));
|
||
- antlr::ASTPair __currentAST60 = currentAST;
|
||
+ antlr::ASTPair __currentAST59 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),REPEAT);
|
||
@@ -3067,8 +3081,8 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
e_AST = returnAST;
|
||
- currentAST = __currentAST60;
|
||
- _t = __t60;
|
||
+ currentAST = __currentAST59;
|
||
+ _t = __t59;
|
||
_t = _t->getNextSibling();
|
||
repeat_statement_AST = RefDNode(currentAST.root);
|
||
|
||
@@ -3103,11 +3117,11 @@
|
||
int labelStart = comp.NDefLabel();
|
||
|
||
|
||
- RefDNode __t62 = _t;
|
||
+ RefDNode __t61 = _t;
|
||
w = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t;
|
||
RefDNode w_AST_in = RefDNode(antlr::nullAST);
|
||
w_AST = astFactory->create(antlr::RefAST(w));
|
||
- antlr::ASTPair __currentAST62 = currentAST;
|
||
+ antlr::ASTPair __currentAST61 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),WHILE);
|
||
@@ -3120,8 +3134,8 @@
|
||
statement(_t);
|
||
_t = _retTree;
|
||
s_AST = returnAST;
|
||
- currentAST = __currentAST62;
|
||
- _t = __t62;
|
||
+ currentAST = __currentAST61;
|
||
+ _t = __t61;
|
||
_t = _t->getNextSibling();
|
||
while_statement_AST = RefDNode(currentAST.root);
|
||
|
||
@@ -3158,12 +3172,12 @@
|
||
switch ( _t->getType()) {
|
||
case GOTO:
|
||
{
|
||
- RefDNode __t69 = _t;
|
||
+ RefDNode __t68 = _t;
|
||
RefDNode tmp26_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp26_AST_in = RefDNode(antlr::nullAST);
|
||
tmp26_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp26_AST_in = _t;
|
||
- antlr::ASTPair __currentAST69 = currentAST;
|
||
+ antlr::ASTPair __currentAST68 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),GOTO);
|
||
@@ -3173,8 +3187,8 @@
|
||
i1_AST = astFactory->create(antlr::RefAST(i1));
|
||
match(antlr::RefAST(_t),IDENTIFIER);
|
||
_t = _t->getNextSibling();
|
||
- currentAST = __currentAST69;
|
||
- _t = __t69;
|
||
+ currentAST = __currentAST68;
|
||
+ _t = __t68;
|
||
_t = _t->getNextSibling();
|
||
jump_statement_AST = RefDNode(currentAST.root);
|
||
|
||
@@ -3193,12 +3207,12 @@
|
||
}
|
||
case RETURN:
|
||
{
|
||
- RefDNode __t70 = _t;
|
||
+ RefDNode __t69 = _t;
|
||
RefDNode tmp27_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp27_AST_in = RefDNode(antlr::nullAST);
|
||
tmp27_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp27_AST_in = _t;
|
||
- antlr::ASTPair __currentAST70 = currentAST;
|
||
+ antlr::ASTPair __currentAST69 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),RETURN);
|
||
@@ -3290,8 +3304,8 @@
|
||
}
|
||
}
|
||
}
|
||
- currentAST = __currentAST70;
|
||
- _t = __t70;
|
||
+ currentAST = __currentAST69;
|
||
+ _t = __t69;
|
||
_t = _t->getNextSibling();
|
||
jump_statement_AST = RefDNode(currentAST.root);
|
||
|
||
@@ -3321,12 +3335,12 @@
|
||
}
|
||
case ON_IOERROR:
|
||
{
|
||
- RefDNode __t72 = _t;
|
||
+ RefDNode __t71 = _t;
|
||
RefDNode tmp28_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp28_AST_in = RefDNode(antlr::nullAST);
|
||
tmp28_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp28_AST_in = _t;
|
||
- antlr::ASTPair __currentAST72 = currentAST;
|
||
+ antlr::ASTPair __currentAST71 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),ON_IOERROR);
|
||
@@ -3336,8 +3350,8 @@
|
||
i2_AST = astFactory->create(antlr::RefAST(i2));
|
||
match(antlr::RefAST(_t),IDENTIFIER);
|
||
_t = _t->getNextSibling();
|
||
- currentAST = __currentAST72;
|
||
- _t = __t72;
|
||
+ currentAST = __currentAST71;
|
||
+ _t = __t71;
|
||
_t = _t->getNextSibling();
|
||
jump_statement_AST = RefDNode(currentAST.root);
|
||
|
||
@@ -3388,11 +3402,11 @@
|
||
int labelStart = comp.NDefLabel();
|
||
|
||
|
||
- RefDNode __t74 = _t;
|
||
+ RefDNode __t73 = _t;
|
||
i = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t;
|
||
RefDNode i_AST_in = RefDNode(antlr::nullAST);
|
||
i_AST = astFactory->create(antlr::RefAST(i));
|
||
- antlr::ASTPair __currentAST74 = currentAST;
|
||
+ antlr::ASTPair __currentAST73 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),IF);
|
||
@@ -3490,8 +3504,8 @@
|
||
}
|
||
}
|
||
}
|
||
- currentAST = __currentAST74;
|
||
- _t = __t74;
|
||
+ currentAST = __currentAST73;
|
||
+ _t = __t73;
|
||
_t = _t->getNextSibling();
|
||
|
||
i_AST->SetLabelRange( labelStart, comp.NDefLabel());
|
||
@@ -3612,11 +3626,11 @@
|
||
RefDNode variable;
|
||
|
||
|
||
- RefDNode __t88 = _t;
|
||
+ RefDNode __t87 = _t;
|
||
d = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t;
|
||
RefDNode d_AST_in = RefDNode(antlr::nullAST);
|
||
d_AST = astFactory->create(antlr::RefAST(d));
|
||
- antlr::ASTPair __currentAST88 = currentAST;
|
||
+ antlr::ASTPair __currentAST87 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),KEYDEF);
|
||
@@ -3670,8 +3684,8 @@
|
||
else
|
||
currentAST.child = key_parameter_AST;
|
||
currentAST.advanceChildToEnd();
|
||
- currentAST = __currentAST88;
|
||
- _t = __t88;
|
||
+ currentAST = __currentAST87;
|
||
+ _t = __t87;
|
||
_t = _t->getNextSibling();
|
||
returnAST = key_parameter_AST;
|
||
_retTree = _t;
|
||
@@ -3753,12 +3767,12 @@
|
||
switch ( _t->getType()) {
|
||
case ARRAYDEF:
|
||
{
|
||
- RefDNode __t91 = _t;
|
||
+ RefDNode __t90 = _t;
|
||
a = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t;
|
||
RefDNode a_AST_in = RefDNode(antlr::nullAST);
|
||
a_AST = astFactory->create(antlr::RefAST(a));
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(a_AST));
|
||
- antlr::ASTPair __currentAST91 = currentAST;
|
||
+ antlr::ASTPair __currentAST90 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),ARRAYDEF);
|
||
@@ -3775,14 +3789,14 @@
|
||
/*check for constant expression*/
|
||
}
|
||
else {
|
||
- goto _loop93;
|
||
+ goto _loop92;
|
||
}
|
||
|
||
}
|
||
- _loop93:;
|
||
+ _loop92:;
|
||
} // ( ... )*
|
||
- currentAST = __currentAST91;
|
||
- _t = __t91;
|
||
+ currentAST = __currentAST90;
|
||
+ _t = __t90;
|
||
_t = _t->getNextSibling();
|
||
|
||
// better check here as then CONSTANT is propagated
|
||
@@ -3823,12 +3837,12 @@
|
||
}
|
||
case ARRAYDEF_CONST:
|
||
{
|
||
- RefDNode __t94 = _t;
|
||
+ RefDNode __t93 = _t;
|
||
aa = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t;
|
||
RefDNode aa_AST_in = RefDNode(antlr::nullAST);
|
||
aa_AST = astFactory->create(antlr::RefAST(aa));
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(aa_AST));
|
||
- antlr::ASTPair __currentAST94 = currentAST;
|
||
+ antlr::ASTPair __currentAST93 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),ARRAYDEF_CONST);
|
||
@@ -3844,14 +3858,14 @@
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
}
|
||
else {
|
||
- goto _loop96;
|
||
+ goto _loop95;
|
||
}
|
||
|
||
}
|
||
- _loop96:;
|
||
+ _loop95:;
|
||
} // ( ... )*
|
||
- currentAST = __currentAST94;
|
||
- _t = __t94;
|
||
+ currentAST = __currentAST93;
|
||
+ _t = __t93;
|
||
_t = _t->getNextSibling();
|
||
|
||
depth=0;
|
||
@@ -3909,12 +3923,12 @@
|
||
switch ( _t->getType()) {
|
||
case NSTRUC_REF:
|
||
{
|
||
- RefDNode __t98 = _t;
|
||
+ RefDNode __t97 = _t;
|
||
n = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t;
|
||
RefDNode n_AST_in = RefDNode(antlr::nullAST);
|
||
n_AST = astFactory->create(antlr::RefAST(n));
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(n_AST));
|
||
- antlr::ASTPair __currentAST98 = currentAST;
|
||
+ antlr::ASTPair __currentAST97 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),NSTRUC_REF);
|
||
@@ -3998,7 +4012,7 @@
|
||
case QUESTION:
|
||
{
|
||
{ // ( ... )+
|
||
- int _cnt101=0;
|
||
+ int _cnt100=0;
|
||
for (;;) {
|
||
if (_t == RefDNode(antlr::nullAST) )
|
||
_t = ASTNULL;
|
||
@@ -4108,12 +4122,12 @@
|
||
}
|
||
default:
|
||
{
|
||
- if ( _cnt101>=1 ) { goto _loop101; } else {throw antlr::NoViableAltException(antlr::RefAST(_t));}
|
||
+ if ( _cnt100>=1 ) { goto _loop100; } else {throw antlr::NoViableAltException(antlr::RefAST(_t));}
|
||
}
|
||
}
|
||
- _cnt101++;
|
||
+ _cnt100++;
|
||
}
|
||
- _loop101:;
|
||
+ _loop100:;
|
||
} // ( ... )+
|
||
|
||
// set to nstruct if defined here
|
||
@@ -4133,27 +4147,27 @@
|
||
}
|
||
}
|
||
}
|
||
- currentAST = __currentAST98;
|
||
- _t = __t98;
|
||
+ currentAST = __currentAST97;
|
||
+ _t = __t97;
|
||
_t = _t->getNextSibling();
|
||
struct_def_AST = RefDNode(currentAST.root);
|
||
break;
|
||
}
|
||
case STRUC:
|
||
{
|
||
- RefDNode __t102 = _t;
|
||
+ RefDNode __t101 = _t;
|
||
RefDNode tmp33_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp33_AST_in = RefDNode(antlr::nullAST);
|
||
tmp33_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp33_AST_in = _t;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(tmp33_AST));
|
||
- antlr::ASTPair __currentAST102 = currentAST;
|
||
+ antlr::ASTPair __currentAST101 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),STRUC);
|
||
_t = _t->getFirstChild();
|
||
{ // ( ... )+
|
||
- int _cnt104=0;
|
||
+ int _cnt103=0;
|
||
for (;;) {
|
||
if (_t == RefDNode(antlr::nullAST) )
|
||
_t = ASTNULL;
|
||
@@ -4163,15 +4177,15 @@
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
}
|
||
else {
|
||
- if ( _cnt104>=1 ) { goto _loop104; } else {throw antlr::NoViableAltException(antlr::RefAST(_t));}
|
||
+ if ( _cnt103>=1 ) { goto _loop103; } else {throw antlr::NoViableAltException(antlr::RefAST(_t));}
|
||
}
|
||
|
||
- _cnt104++;
|
||
+ _cnt103++;
|
||
}
|
||
- _loop104:;
|
||
+ _loop103:;
|
||
} // ( ... )+
|
||
- currentAST = __currentAST102;
|
||
- _t = __t102;
|
||
+ currentAST = __currentAST101;
|
||
+ _t = __t101;
|
||
_t = _t->getNextSibling();
|
||
struct_def_AST = RefDNode(currentAST.root);
|
||
break;
|
||
@@ -4226,12 +4240,12 @@
|
||
|
||
|
||
{
|
||
- RefDNode __t108 = _t;
|
||
+ RefDNode __t107 = _t;
|
||
RefDNode tmp35_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp35_AST_in = RefDNode(antlr::nullAST);
|
||
tmp35_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp35_AST_in = _t;
|
||
- antlr::ASTPair __currentAST108 = currentAST;
|
||
+ antlr::ASTPair __currentAST107 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),ARRAYIX);
|
||
@@ -4723,8 +4737,8 @@
|
||
}
|
||
}
|
||
}
|
||
- currentAST = __currentAST108;
|
||
- _t = __t108;
|
||
+ currentAST = __currentAST107;
|
||
+ _t = __t107;
|
||
_t = _t->getNextSibling();
|
||
}
|
||
returnAST = arrayindex_AST;
|
||
@@ -4743,7 +4757,7 @@
|
||
|
||
|
||
{ // ( ... )+
|
||
- int _cnt116=0;
|
||
+ int _cnt115=0;
|
||
for (;;) {
|
||
if (_t == RefDNode(antlr::nullAST) )
|
||
_t = ASTNULL;
|
||
@@ -4753,12 +4767,12 @@
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
}
|
||
else {
|
||
- if ( _cnt116>=1 ) { goto _loop116; } else {throw antlr::NoViableAltException(antlr::RefAST(_t));}
|
||
+ if ( _cnt115>=1 ) { goto _loop115; } else {throw antlr::NoViableAltException(antlr::RefAST(_t));}
|
||
}
|
||
|
||
- _cnt116++;
|
||
+ _cnt115++;
|
||
}
|
||
- _loop116:;
|
||
+ _loop115:;
|
||
} // ( ... )+
|
||
arrayindex_list_AST = RefDNode(currentAST.root);
|
||
|
||
@@ -4846,11 +4860,11 @@
|
||
RefDNode r_AST = RefDNode(antlr::nullAST);
|
||
RefDNode r = RefDNode(antlr::nullAST);
|
||
|
||
- RefDNode __t119 = _t;
|
||
+ RefDNode __t118 = _t;
|
||
a = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t;
|
||
RefDNode a_AST_in = RefDNode(antlr::nullAST);
|
||
a_AST = astFactory->create(antlr::RefAST(a));
|
||
- antlr::ASTPair __currentAST119 = currentAST;
|
||
+ antlr::ASTPair __currentAST118 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),ASSIGN);
|
||
@@ -4863,8 +4877,8 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
r_AST = returnAST;
|
||
- currentAST = __currentAST119;
|
||
- _t = __t119;
|
||
+ currentAST = __currentAST118;
|
||
+ _t = __t118;
|
||
_t = _t->getNextSibling();
|
||
assign_expr_AST = RefDNode(currentAST.root);
|
||
|
||
@@ -4904,12 +4918,12 @@
|
||
RefDNode i = RefDNode(antlr::nullAST);
|
||
RefDNode i_AST = RefDNode(antlr::nullAST);
|
||
|
||
- RefDNode __t144 = _t;
|
||
+ RefDNode __t143 = _t;
|
||
RefDNode tmp38_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp38_AST_in = RefDNode(antlr::nullAST);
|
||
tmp38_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp38_AST_in = _t;
|
||
- antlr::ASTPair __currentAST144 = currentAST;
|
||
+ antlr::ASTPair __currentAST143 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),SYSVAR);
|
||
@@ -4919,8 +4933,8 @@
|
||
i_AST = astFactory->create(antlr::RefAST(i));
|
||
match(antlr::RefAST(_t),SYSVARNAME);
|
||
_t = _t->getNextSibling();
|
||
- currentAST = __currentAST144;
|
||
- _t = __t144;
|
||
+ currentAST = __currentAST143;
|
||
+ _t = __t143;
|
||
_t = _t->getNextSibling();
|
||
sysvar_AST = RefDNode(currentAST.root);
|
||
|
||
@@ -4949,12 +4963,12 @@
|
||
RefDNode i = RefDNode(antlr::nullAST);
|
||
RefDNode i_AST = RefDNode(antlr::nullAST);
|
||
|
||
- RefDNode __t146 = _t;
|
||
+ RefDNode __t145 = _t;
|
||
RefDNode tmp39_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp39_AST_in = RefDNode(antlr::nullAST);
|
||
tmp39_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp39_AST_in = _t;
|
||
- antlr::ASTPair __currentAST146 = currentAST;
|
||
+ antlr::ASTPair __currentAST145 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),VAR);
|
||
@@ -4964,8 +4978,8 @@
|
||
i_AST = astFactory->create(antlr::RefAST(i));
|
||
match(antlr::RefAST(_t),IDENTIFIER);
|
||
_t = _t->getNextSibling();
|
||
- currentAST = __currentAST146;
|
||
- _t = __t146;
|
||
+ currentAST = __currentAST145;
|
||
+ _t = __t145;
|
||
_t = _t->getNextSibling();
|
||
var_AST = RefDNode(currentAST.root);
|
||
|
||
@@ -4993,17 +5007,17 @@
|
||
RefDNode e = RefDNode(antlr::nullAST);
|
||
|
||
{ // ( ... )+
|
||
- int _cnt150=0;
|
||
+ int _cnt149=0;
|
||
for (;;) {
|
||
if (_t == RefDNode(antlr::nullAST) )
|
||
_t = ASTNULL;
|
||
if ((_t->getType() == ARRAYIX)) {
|
||
- RefDNode __t149 = _t;
|
||
+ RefDNode __t148 = _t;
|
||
RefDNode tmp40_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp40_AST_in = RefDNode(antlr::nullAST);
|
||
tmp40_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp40_AST_in = _t;
|
||
- antlr::ASTPair __currentAST149 = currentAST;
|
||
+ antlr::ASTPair __currentAST148 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),ARRAYIX);
|
||
@@ -5012,8 +5026,8 @@
|
||
pos_parameter(_t);
|
||
_t = _retTree;
|
||
e_AST = returnAST;
|
||
- currentAST = __currentAST149;
|
||
- _t = __t149;
|
||
+ currentAST = __currentAST148;
|
||
+ _t = __t148;
|
||
_t = _t->getNextSibling();
|
||
arrayindex_list_to_expression_list_AST = RefDNode(currentAST.root);
|
||
|
||
@@ -5029,12 +5043,12 @@
|
||
currentAST.advanceChildToEnd();
|
||
}
|
||
else {
|
||
- if ( _cnt150>=1 ) { goto _loop150; } else {throw antlr::NoViableAltException(antlr::RefAST(_t));}
|
||
+ if ( _cnt149>=1 ) { goto _loop149; } else {throw antlr::NoViableAltException(antlr::RefAST(_t));}
|
||
}
|
||
|
||
- _cnt150++;
|
||
+ _cnt149++;
|
||
}
|
||
- _loop150:;
|
||
+ _loop149:;
|
||
} // ( ... )+
|
||
returnAST = arrayindex_list_to_expression_list_AST;
|
||
_retTree = _t;
|
||
@@ -5058,21 +5072,21 @@
|
||
bool isVar;
|
||
|
||
|
||
- RefDNode __t152 = _t;
|
||
+ RefDNode __t151 = _t;
|
||
RefDNode tmp41_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp41_AST_in = RefDNode(antlr::nullAST);
|
||
tmp41_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp41_AST_in = _t;
|
||
- antlr::ASTPair __currentAST152 = currentAST;
|
||
+ antlr::ASTPair __currentAST151 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),ARRAYEXPR_FN);
|
||
_t = _t->getFirstChild();
|
||
- RefDNode __t153 = _t;
|
||
+ RefDNode __t152 = _t;
|
||
va = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t;
|
||
RefDNode va_AST_in = RefDNode(antlr::nullAST);
|
||
va_AST = astFactory->create(antlr::RefAST(va));
|
||
- antlr::ASTPair __currentAST153 = currentAST;
|
||
+ antlr::ASTPair __currentAST152 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),VAR);
|
||
@@ -5082,8 +5096,8 @@
|
||
id_AST = astFactory->create(antlr::RefAST(id));
|
||
match(antlr::RefAST(_t),IDENTIFIER);
|
||
_t = _t->getNextSibling();
|
||
- currentAST = __currentAST153;
|
||
- _t = __t153;
|
||
+ currentAST = __currentAST152;
|
||
+ _t = __t152;
|
||
_t = _t->getNextSibling();
|
||
|
||
id_text=id_AST->getText();
|
||
@@ -5167,8 +5181,8 @@
|
||
else
|
||
currentAST.child = arrayexpr_fn_AST;
|
||
currentAST.advanceChildToEnd();
|
||
- currentAST = __currentAST152;
|
||
- _t = __t152;
|
||
+ currentAST = __currentAST151;
|
||
+ _t = __t151;
|
||
_t = _t->getNextSibling();
|
||
returnAST = arrayexpr_fn_AST;
|
||
_retTree = _t;
|
||
@@ -5226,13 +5240,13 @@
|
||
}
|
||
case MFCALL:
|
||
{
|
||
- RefDNode __t156 = _t;
|
||
+ RefDNode __t155 = _t;
|
||
RefDNode tmp42_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp42_AST_in = RefDNode(antlr::nullAST);
|
||
tmp42_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp42_AST_in = _t;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(tmp42_AST));
|
||
- antlr::ASTPair __currentAST156 = currentAST;
|
||
+ antlr::ASTPair __currentAST155 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),MFCALL);
|
||
@@ -5257,27 +5271,27 @@
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
}
|
||
else {
|
||
- goto _loop158;
|
||
+ goto _loop157;
|
||
}
|
||
|
||
}
|
||
- _loop158:;
|
||
+ _loop157:;
|
||
} // ( ... )*
|
||
- currentAST = __currentAST156;
|
||
- _t = __t156;
|
||
+ currentAST = __currentAST155;
|
||
+ _t = __t155;
|
||
_t = _t->getNextSibling();
|
||
primary_expr_AST = RefDNode(currentAST.root);
|
||
break;
|
||
}
|
||
case MFCALL_PARENT:
|
||
{
|
||
- RefDNode __t159 = _t;
|
||
+ RefDNode __t158 = _t;
|
||
RefDNode tmp44_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp44_AST_in = RefDNode(antlr::nullAST);
|
||
tmp44_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp44_AST_in = _t;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(tmp44_AST));
|
||
- antlr::ASTPair __currentAST159 = currentAST;
|
||
+ antlr::ASTPair __currentAST158 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),MFCALL_PARENT);
|
||
@@ -5309,26 +5323,26 @@
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
}
|
||
else {
|
||
- goto _loop161;
|
||
+ goto _loop160;
|
||
}
|
||
|
||
}
|
||
- _loop161:;
|
||
+ _loop160:;
|
||
} // ( ... )*
|
||
- currentAST = __currentAST159;
|
||
- _t = __t159;
|
||
+ currentAST = __currentAST158;
|
||
+ _t = __t158;
|
||
_t = _t->getNextSibling();
|
||
primary_expr_AST = RefDNode(currentAST.root);
|
||
break;
|
||
}
|
||
case FCALL:
|
||
{
|
||
- RefDNode __t162 = _t;
|
||
+ RefDNode __t161 = _t;
|
||
f = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t;
|
||
RefDNode f_AST_in = RefDNode(antlr::nullAST);
|
||
f_AST = astFactory->create(antlr::RefAST(f));
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(f_AST));
|
||
- antlr::ASTPair __currentAST162 = currentAST;
|
||
+ antlr::ASTPair __currentAST161 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),FCALL);
|
||
@@ -5348,11 +5362,11 @@
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
}
|
||
else {
|
||
- goto _loop164;
|
||
+ goto _loop163;
|
||
}
|
||
|
||
}
|
||
- _loop164:;
|
||
+ _loop163:;
|
||
} // ( ... )*
|
||
|
||
// first search library functions
|
||
@@ -5383,8 +5397,8 @@
|
||
f_AST->SetFunIx(i);
|
||
}
|
||
|
||
- currentAST = __currentAST162;
|
||
- _t = __t162;
|
||
+ currentAST = __currentAST161;
|
||
+ _t = __t161;
|
||
_t = _t->getNextSibling();
|
||
primary_expr_AST = RefDNode(currentAST.root);
|
||
break;
|
||
@@ -5447,13 +5461,13 @@
|
||
switch ( _t->getType()) {
|
||
case QUESTION:
|
||
{
|
||
- RefDNode __t166 = _t;
|
||
+ RefDNode __t165 = _t;
|
||
RefDNode tmp48_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp48_AST_in = RefDNode(antlr::nullAST);
|
||
tmp48_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp48_AST_in = _t;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(tmp48_AST));
|
||
- antlr::ASTPair __currentAST166 = currentAST;
|
||
+ antlr::ASTPair __currentAST165 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),QUESTION);
|
||
@@ -5467,21 +5481,21 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
- currentAST = __currentAST166;
|
||
- _t = __t166;
|
||
+ currentAST = __currentAST165;
|
||
+ _t = __t165;
|
||
_t = _t->getNextSibling();
|
||
op_expr_AST = RefDNode(currentAST.root);
|
||
break;
|
||
}
|
||
case AND_OP:
|
||
{
|
||
- RefDNode __t167 = _t;
|
||
+ RefDNode __t166 = _t;
|
||
RefDNode tmp49_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp49_AST_in = RefDNode(antlr::nullAST);
|
||
tmp49_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp49_AST_in = _t;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(tmp49_AST));
|
||
- antlr::ASTPair __currentAST167 = currentAST;
|
||
+ antlr::ASTPair __currentAST166 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),AND_OP);
|
||
@@ -5492,21 +5506,21 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
- currentAST = __currentAST167;
|
||
- _t = __t167;
|
||
+ currentAST = __currentAST166;
|
||
+ _t = __t166;
|
||
_t = _t->getNextSibling();
|
||
op_expr_AST = RefDNode(currentAST.root);
|
||
break;
|
||
}
|
||
case OR_OP:
|
||
{
|
||
- RefDNode __t168 = _t;
|
||
+ RefDNode __t167 = _t;
|
||
RefDNode tmp50_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp50_AST_in = RefDNode(antlr::nullAST);
|
||
tmp50_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp50_AST_in = _t;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(tmp50_AST));
|
||
- antlr::ASTPair __currentAST168 = currentAST;
|
||
+ antlr::ASTPair __currentAST167 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),OR_OP);
|
||
@@ -5517,21 +5531,21 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
- currentAST = __currentAST168;
|
||
- _t = __t168;
|
||
+ currentAST = __currentAST167;
|
||
+ _t = __t167;
|
||
_t = _t->getNextSibling();
|
||
op_expr_AST = RefDNode(currentAST.root);
|
||
break;
|
||
}
|
||
case XOR_OP:
|
||
{
|
||
- RefDNode __t169 = _t;
|
||
+ RefDNode __t168 = _t;
|
||
RefDNode tmp51_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp51_AST_in = RefDNode(antlr::nullAST);
|
||
tmp51_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp51_AST_in = _t;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(tmp51_AST));
|
||
- antlr::ASTPair __currentAST169 = currentAST;
|
||
+ antlr::ASTPair __currentAST168 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),XOR_OP);
|
||
@@ -5542,21 +5556,21 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
- currentAST = __currentAST169;
|
||
- _t = __t169;
|
||
+ currentAST = __currentAST168;
|
||
+ _t = __t168;
|
||
_t = _t->getNextSibling();
|
||
op_expr_AST = RefDNode(currentAST.root);
|
||
break;
|
||
}
|
||
case LOG_AND:
|
||
{
|
||
- RefDNode __t170 = _t;
|
||
+ RefDNode __t169 = _t;
|
||
RefDNode tmp52_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp52_AST_in = RefDNode(antlr::nullAST);
|
||
tmp52_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp52_AST_in = _t;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(tmp52_AST));
|
||
- antlr::ASTPair __currentAST170 = currentAST;
|
||
+ antlr::ASTPair __currentAST169 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),LOG_AND);
|
||
@@ -5567,21 +5581,21 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
- currentAST = __currentAST170;
|
||
- _t = __t170;
|
||
+ currentAST = __currentAST169;
|
||
+ _t = __t169;
|
||
_t = _t->getNextSibling();
|
||
op_expr_AST = RefDNode(currentAST.root);
|
||
break;
|
||
}
|
||
case LOG_OR:
|
||
{
|
||
- RefDNode __t171 = _t;
|
||
+ RefDNode __t170 = _t;
|
||
RefDNode tmp53_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp53_AST_in = RefDNode(antlr::nullAST);
|
||
tmp53_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp53_AST_in = _t;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(tmp53_AST));
|
||
- antlr::ASTPair __currentAST171 = currentAST;
|
||
+ antlr::ASTPair __currentAST170 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),LOG_OR);
|
||
@@ -5592,21 +5606,21 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
- currentAST = __currentAST171;
|
||
- _t = __t171;
|
||
+ currentAST = __currentAST170;
|
||
+ _t = __t170;
|
||
_t = _t->getNextSibling();
|
||
op_expr_AST = RefDNode(currentAST.root);
|
||
break;
|
||
}
|
||
case EQ_OP:
|
||
{
|
||
- RefDNode __t172 = _t;
|
||
+ RefDNode __t171 = _t;
|
||
RefDNode tmp54_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp54_AST_in = RefDNode(antlr::nullAST);
|
||
tmp54_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp54_AST_in = _t;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(tmp54_AST));
|
||
- antlr::ASTPair __currentAST172 = currentAST;
|
||
+ antlr::ASTPair __currentAST171 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),EQ_OP);
|
||
@@ -5617,21 +5631,21 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
- currentAST = __currentAST172;
|
||
- _t = __t172;
|
||
+ currentAST = __currentAST171;
|
||
+ _t = __t171;
|
||
_t = _t->getNextSibling();
|
||
op_expr_AST = RefDNode(currentAST.root);
|
||
break;
|
||
}
|
||
case NE_OP:
|
||
{
|
||
- RefDNode __t173 = _t;
|
||
+ RefDNode __t172 = _t;
|
||
RefDNode tmp55_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp55_AST_in = RefDNode(antlr::nullAST);
|
||
tmp55_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp55_AST_in = _t;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(tmp55_AST));
|
||
- antlr::ASTPair __currentAST173 = currentAST;
|
||
+ antlr::ASTPair __currentAST172 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),NE_OP);
|
||
@@ -5642,21 +5656,21 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
- currentAST = __currentAST173;
|
||
- _t = __t173;
|
||
+ currentAST = __currentAST172;
|
||
+ _t = __t172;
|
||
_t = _t->getNextSibling();
|
||
op_expr_AST = RefDNode(currentAST.root);
|
||
break;
|
||
}
|
||
case LE_OP:
|
||
{
|
||
- RefDNode __t174 = _t;
|
||
+ RefDNode __t173 = _t;
|
||
RefDNode tmp56_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp56_AST_in = RefDNode(antlr::nullAST);
|
||
tmp56_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp56_AST_in = _t;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(tmp56_AST));
|
||
- antlr::ASTPair __currentAST174 = currentAST;
|
||
+ antlr::ASTPair __currentAST173 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),LE_OP);
|
||
@@ -5667,21 +5681,21 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
- currentAST = __currentAST174;
|
||
- _t = __t174;
|
||
+ currentAST = __currentAST173;
|
||
+ _t = __t173;
|
||
_t = _t->getNextSibling();
|
||
op_expr_AST = RefDNode(currentAST.root);
|
||
break;
|
||
}
|
||
case LT_OP:
|
||
{
|
||
- RefDNode __t175 = _t;
|
||
+ RefDNode __t174 = _t;
|
||
RefDNode tmp57_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp57_AST_in = RefDNode(antlr::nullAST);
|
||
tmp57_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp57_AST_in = _t;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(tmp57_AST));
|
||
- antlr::ASTPair __currentAST175 = currentAST;
|
||
+ antlr::ASTPair __currentAST174 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),LT_OP);
|
||
@@ -5692,21 +5706,21 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
- currentAST = __currentAST175;
|
||
- _t = __t175;
|
||
+ currentAST = __currentAST174;
|
||
+ _t = __t174;
|
||
_t = _t->getNextSibling();
|
||
op_expr_AST = RefDNode(currentAST.root);
|
||
break;
|
||
}
|
||
case GE_OP:
|
||
{
|
||
- RefDNode __t176 = _t;
|
||
+ RefDNode __t175 = _t;
|
||
RefDNode tmp58_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp58_AST_in = RefDNode(antlr::nullAST);
|
||
tmp58_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp58_AST_in = _t;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(tmp58_AST));
|
||
- antlr::ASTPair __currentAST176 = currentAST;
|
||
+ antlr::ASTPair __currentAST175 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),GE_OP);
|
||
@@ -5717,21 +5731,21 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
- currentAST = __currentAST176;
|
||
- _t = __t176;
|
||
+ currentAST = __currentAST175;
|
||
+ _t = __t175;
|
||
_t = _t->getNextSibling();
|
||
op_expr_AST = RefDNode(currentAST.root);
|
||
break;
|
||
}
|
||
case GT_OP:
|
||
{
|
||
- RefDNode __t177 = _t;
|
||
+ RefDNode __t176 = _t;
|
||
RefDNode tmp59_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp59_AST_in = RefDNode(antlr::nullAST);
|
||
tmp59_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp59_AST_in = _t;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(tmp59_AST));
|
||
- antlr::ASTPair __currentAST177 = currentAST;
|
||
+ antlr::ASTPair __currentAST176 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),GT_OP);
|
||
@@ -5742,21 +5756,21 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
- currentAST = __currentAST177;
|
||
- _t = __t177;
|
||
+ currentAST = __currentAST176;
|
||
+ _t = __t176;
|
||
_t = _t->getNextSibling();
|
||
op_expr_AST = RefDNode(currentAST.root);
|
||
break;
|
||
}
|
||
case NOT_OP:
|
||
{
|
||
- RefDNode __t178 = _t;
|
||
+ RefDNode __t177 = _t;
|
||
RefDNode tmp60_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp60_AST_in = RefDNode(antlr::nullAST);
|
||
tmp60_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp60_AST_in = _t;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(tmp60_AST));
|
||
- antlr::ASTPair __currentAST178 = currentAST;
|
||
+ antlr::ASTPair __currentAST177 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),NOT_OP);
|
||
@@ -5764,21 +5778,21 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
- currentAST = __currentAST178;
|
||
- _t = __t178;
|
||
+ currentAST = __currentAST177;
|
||
+ _t = __t177;
|
||
_t = _t->getNextSibling();
|
||
op_expr_AST = RefDNode(currentAST.root);
|
||
break;
|
||
}
|
||
case PLUS:
|
||
{
|
||
- RefDNode __t179 = _t;
|
||
+ RefDNode __t178 = _t;
|
||
RefDNode tmp61_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp61_AST_in = RefDNode(antlr::nullAST);
|
||
tmp61_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp61_AST_in = _t;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(tmp61_AST));
|
||
- antlr::ASTPair __currentAST179 = currentAST;
|
||
+ antlr::ASTPair __currentAST178 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),PLUS);
|
||
@@ -5789,21 +5803,21 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
- currentAST = __currentAST179;
|
||
- _t = __t179;
|
||
+ currentAST = __currentAST178;
|
||
+ _t = __t178;
|
||
_t = _t->getNextSibling();
|
||
op_expr_AST = RefDNode(currentAST.root);
|
||
break;
|
||
}
|
||
case MINUS:
|
||
{
|
||
- RefDNode __t180 = _t;
|
||
+ RefDNode __t179 = _t;
|
||
RefDNode tmp62_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp62_AST_in = RefDNode(antlr::nullAST);
|
||
tmp62_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp62_AST_in = _t;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(tmp62_AST));
|
||
- antlr::ASTPair __currentAST180 = currentAST;
|
||
+ antlr::ASTPair __currentAST179 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),MINUS);
|
||
@@ -5814,21 +5828,21 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
- currentAST = __currentAST180;
|
||
- _t = __t180;
|
||
+ currentAST = __currentAST179;
|
||
+ _t = __t179;
|
||
_t = _t->getNextSibling();
|
||
op_expr_AST = RefDNode(currentAST.root);
|
||
break;
|
||
}
|
||
case LTMARK:
|
||
{
|
||
- RefDNode __t181 = _t;
|
||
+ RefDNode __t180 = _t;
|
||
RefDNode tmp63_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp63_AST_in = RefDNode(antlr::nullAST);
|
||
tmp63_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp63_AST_in = _t;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(tmp63_AST));
|
||
- antlr::ASTPair __currentAST181 = currentAST;
|
||
+ antlr::ASTPair __currentAST180 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),LTMARK);
|
||
@@ -5839,21 +5853,21 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
- currentAST = __currentAST181;
|
||
- _t = __t181;
|
||
+ currentAST = __currentAST180;
|
||
+ _t = __t180;
|
||
_t = _t->getNextSibling();
|
||
op_expr_AST = RefDNode(currentAST.root);
|
||
break;
|
||
}
|
||
case GTMARK:
|
||
{
|
||
- RefDNode __t182 = _t;
|
||
+ RefDNode __t181 = _t;
|
||
RefDNode tmp64_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp64_AST_in = RefDNode(antlr::nullAST);
|
||
tmp64_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp64_AST_in = _t;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(tmp64_AST));
|
||
- antlr::ASTPair __currentAST182 = currentAST;
|
||
+ antlr::ASTPair __currentAST181 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),GTMARK);
|
||
@@ -5864,8 +5878,8 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
- currentAST = __currentAST182;
|
||
- _t = __t182;
|
||
+ currentAST = __currentAST181;
|
||
+ _t = __t181;
|
||
_t = _t->getNextSibling();
|
||
op_expr_AST = RefDNode(currentAST.root);
|
||
break;
|
||
@@ -5880,13 +5894,13 @@
|
||
}
|
||
case LOG_NEG:
|
||
{
|
||
- RefDNode __t183 = _t;
|
||
+ RefDNode __t182 = _t;
|
||
RefDNode tmp65_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp65_AST_in = RefDNode(antlr::nullAST);
|
||
tmp65_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp65_AST_in = _t;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(tmp65_AST));
|
||
- antlr::ASTPair __currentAST183 = currentAST;
|
||
+ antlr::ASTPair __currentAST182 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),LOG_NEG);
|
||
@@ -5894,21 +5908,21 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
- currentAST = __currentAST183;
|
||
- _t = __t183;
|
||
+ currentAST = __currentAST182;
|
||
+ _t = __t182;
|
||
_t = _t->getNextSibling();
|
||
op_expr_AST = RefDNode(currentAST.root);
|
||
break;
|
||
}
|
||
case ASTERIX:
|
||
{
|
||
- RefDNode __t184 = _t;
|
||
+ RefDNode __t183 = _t;
|
||
RefDNode tmp66_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp66_AST_in = RefDNode(antlr::nullAST);
|
||
tmp66_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp66_AST_in = _t;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(tmp66_AST));
|
||
- antlr::ASTPair __currentAST184 = currentAST;
|
||
+ antlr::ASTPair __currentAST183 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),ASTERIX);
|
||
@@ -5919,21 +5933,21 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
- currentAST = __currentAST184;
|
||
- _t = __t184;
|
||
+ currentAST = __currentAST183;
|
||
+ _t = __t183;
|
||
_t = _t->getNextSibling();
|
||
op_expr_AST = RefDNode(currentAST.root);
|
||
break;
|
||
}
|
||
case MATRIX_OP1:
|
||
{
|
||
- RefDNode __t185 = _t;
|
||
+ RefDNode __t184 = _t;
|
||
RefDNode tmp67_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp67_AST_in = RefDNode(antlr::nullAST);
|
||
tmp67_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp67_AST_in = _t;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(tmp67_AST));
|
||
- antlr::ASTPair __currentAST185 = currentAST;
|
||
+ antlr::ASTPair __currentAST184 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),MATRIX_OP1);
|
||
@@ -5944,21 +5958,21 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
- currentAST = __currentAST185;
|
||
- _t = __t185;
|
||
+ currentAST = __currentAST184;
|
||
+ _t = __t184;
|
||
_t = _t->getNextSibling();
|
||
op_expr_AST = RefDNode(currentAST.root);
|
||
break;
|
||
}
|
||
case MATRIX_OP2:
|
||
{
|
||
- RefDNode __t186 = _t;
|
||
+ RefDNode __t185 = _t;
|
||
RefDNode tmp68_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp68_AST_in = RefDNode(antlr::nullAST);
|
||
tmp68_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp68_AST_in = _t;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(tmp68_AST));
|
||
- antlr::ASTPair __currentAST186 = currentAST;
|
||
+ antlr::ASTPair __currentAST185 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),MATRIX_OP2);
|
||
@@ -5969,21 +5983,21 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
- currentAST = __currentAST186;
|
||
- _t = __t186;
|
||
+ currentAST = __currentAST185;
|
||
+ _t = __t185;
|
||
_t = _t->getNextSibling();
|
||
op_expr_AST = RefDNode(currentAST.root);
|
||
break;
|
||
}
|
||
case SLASH:
|
||
{
|
||
- RefDNode __t187 = _t;
|
||
+ RefDNode __t186 = _t;
|
||
RefDNode tmp69_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp69_AST_in = RefDNode(antlr::nullAST);
|
||
tmp69_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp69_AST_in = _t;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(tmp69_AST));
|
||
- antlr::ASTPair __currentAST187 = currentAST;
|
||
+ antlr::ASTPair __currentAST186 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),SLASH);
|
||
@@ -5994,21 +6008,21 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
- currentAST = __currentAST187;
|
||
- _t = __t187;
|
||
+ currentAST = __currentAST186;
|
||
+ _t = __t186;
|
||
_t = _t->getNextSibling();
|
||
op_expr_AST = RefDNode(currentAST.root);
|
||
break;
|
||
}
|
||
case MOD_OP:
|
||
{
|
||
- RefDNode __t188 = _t;
|
||
+ RefDNode __t187 = _t;
|
||
RefDNode tmp70_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp70_AST_in = RefDNode(antlr::nullAST);
|
||
tmp70_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp70_AST_in = _t;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(tmp70_AST));
|
||
- antlr::ASTPair __currentAST188 = currentAST;
|
||
+ antlr::ASTPair __currentAST187 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),MOD_OP);
|
||
@@ -6019,21 +6033,21 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
- currentAST = __currentAST188;
|
||
- _t = __t188;
|
||
+ currentAST = __currentAST187;
|
||
+ _t = __t187;
|
||
_t = _t->getNextSibling();
|
||
op_expr_AST = RefDNode(currentAST.root);
|
||
break;
|
||
}
|
||
case POW:
|
||
{
|
||
- RefDNode __t189 = _t;
|
||
+ RefDNode __t188 = _t;
|
||
RefDNode tmp71_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp71_AST_in = RefDNode(antlr::nullAST);
|
||
tmp71_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp71_AST_in = _t;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(tmp71_AST));
|
||
- antlr::ASTPair __currentAST189 = currentAST;
|
||
+ antlr::ASTPair __currentAST188 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),POW);
|
||
@@ -6044,21 +6058,21 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
- currentAST = __currentAST189;
|
||
- _t = __t189;
|
||
+ currentAST = __currentAST188;
|
||
+ _t = __t188;
|
||
_t = _t->getNextSibling();
|
||
op_expr_AST = RefDNode(currentAST.root);
|
||
break;
|
||
}
|
||
case DEC:
|
||
{
|
||
- RefDNode __t190 = _t;
|
||
+ RefDNode __t189 = _t;
|
||
RefDNode tmp72_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp72_AST_in = RefDNode(antlr::nullAST);
|
||
tmp72_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp72_AST_in = _t;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(tmp72_AST));
|
||
- antlr::ASTPair __currentAST190 = currentAST;
|
||
+ antlr::ASTPair __currentAST189 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),DEC);
|
||
@@ -6066,21 +6080,21 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
- currentAST = __currentAST190;
|
||
- _t = __t190;
|
||
+ currentAST = __currentAST189;
|
||
+ _t = __t189;
|
||
_t = _t->getNextSibling();
|
||
op_expr_AST = RefDNode(currentAST.root);
|
||
break;
|
||
}
|
||
case INC:
|
||
{
|
||
- RefDNode __t191 = _t;
|
||
+ RefDNode __t190 = _t;
|
||
RefDNode tmp73_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp73_AST_in = RefDNode(antlr::nullAST);
|
||
tmp73_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp73_AST_in = _t;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(tmp73_AST));
|
||
- antlr::ASTPair __currentAST191 = currentAST;
|
||
+ antlr::ASTPair __currentAST190 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),INC);
|
||
@@ -6088,21 +6102,21 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
- currentAST = __currentAST191;
|
||
- _t = __t191;
|
||
+ currentAST = __currentAST190;
|
||
+ _t = __t190;
|
||
_t = _t->getNextSibling();
|
||
op_expr_AST = RefDNode(currentAST.root);
|
||
break;
|
||
}
|
||
case POSTDEC:
|
||
{
|
||
- RefDNode __t192 = _t;
|
||
+ RefDNode __t191 = _t;
|
||
RefDNode tmp74_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp74_AST_in = RefDNode(antlr::nullAST);
|
||
tmp74_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp74_AST_in = _t;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(tmp74_AST));
|
||
- antlr::ASTPair __currentAST192 = currentAST;
|
||
+ antlr::ASTPair __currentAST191 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),POSTDEC);
|
||
@@ -6110,21 +6124,21 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
- currentAST = __currentAST192;
|
||
- _t = __t192;
|
||
+ currentAST = __currentAST191;
|
||
+ _t = __t191;
|
||
_t = _t->getNextSibling();
|
||
op_expr_AST = RefDNode(currentAST.root);
|
||
break;
|
||
}
|
||
case POSTINC:
|
||
{
|
||
- RefDNode __t193 = _t;
|
||
+ RefDNode __t192 = _t;
|
||
RefDNode tmp75_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp75_AST_in = RefDNode(antlr::nullAST);
|
||
tmp75_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp75_AST_in = _t;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(tmp75_AST));
|
||
- antlr::ASTPair __currentAST193 = currentAST;
|
||
+ antlr::ASTPair __currentAST192 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),POSTINC);
|
||
@@ -6132,8 +6146,8 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
- currentAST = __currentAST193;
|
||
- _t = __t193;
|
||
+ currentAST = __currentAST192;
|
||
+ _t = __t192;
|
||
_t = _t->getNextSibling();
|
||
op_expr_AST = RefDNode(currentAST.root);
|
||
break;
|
||
@@ -6193,12 +6207,12 @@
|
||
RefDNode e_AST = RefDNode(antlr::nullAST);
|
||
RefDNode e = RefDNode(antlr::nullAST);
|
||
|
||
- RefDNode __t195 = _t;
|
||
+ RefDNode __t194 = _t;
|
||
u = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t;
|
||
RefDNode u_AST_in = RefDNode(antlr::nullAST);
|
||
u_AST = astFactory->create(antlr::RefAST(u));
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(u_AST));
|
||
- antlr::ASTPair __currentAST195 = currentAST;
|
||
+ antlr::ASTPair __currentAST194 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),UMINUS);
|
||
@@ -6208,8 +6222,8 @@
|
||
_t = _retTree;
|
||
e_AST = returnAST;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
- currentAST = __currentAST195;
|
||
- _t = __t195;
|
||
+ currentAST = __currentAST194;
|
||
+ _t = __t194;
|
||
_t = _t->getNextSibling();
|
||
uminus_AST = RefDNode(currentAST.root);
|
||
|
||
@@ -6247,11 +6261,11 @@
|
||
RefDNode ex_AST = RefDNode(antlr::nullAST);
|
||
RefDNode ex = RefDNode(antlr::nullAST);
|
||
|
||
- RefDNode __t197 = _t;
|
||
+ RefDNode __t196 = _t;
|
||
e = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t;
|
||
RefDNode e_AST_in = RefDNode(antlr::nullAST);
|
||
e_AST = astFactory->create(antlr::RefAST(e));
|
||
- antlr::ASTPair __currentAST197 = currentAST;
|
||
+ antlr::ASTPair __currentAST196 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),EXPR);
|
||
@@ -6260,8 +6274,8 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
ex_AST = returnAST;
|
||
- currentAST = __currentAST197;
|
||
- _t = __t197;
|
||
+ currentAST = __currentAST196;
|
||
+ _t = __t196;
|
||
_t = _t->getNextSibling();
|
||
brace_expr_AST = RefDNode(currentAST.root);
|
||
|
||
@@ -6288,12 +6302,12 @@
|
||
RefDNode ex_AST = RefDNode(antlr::nullAST);
|
||
RefDNode ex = RefDNode(antlr::nullAST);
|
||
|
||
- RefDNode __t199 = _t;
|
||
+ RefDNode __t198 = _t;
|
||
RefDNode tmp76_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp76_AST_in = RefDNode(antlr::nullAST);
|
||
tmp76_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp76_AST_in = _t;
|
||
- antlr::ASTPair __currentAST199 = currentAST;
|
||
+ antlr::ASTPair __currentAST198 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),EXPR);
|
||
@@ -6302,8 +6316,8 @@
|
||
expr(_t);
|
||
_t = _retTree;
|
||
ex_AST = returnAST;
|
||
- currentAST = __currentAST199;
|
||
- _t = __t199;
|
||
+ currentAST = __currentAST198;
|
||
+ _t = __t198;
|
||
_t = _t->getNextSibling();
|
||
unbrace_expr_AST = RefDNode(currentAST.root);
|
||
|
||
@@ -6375,13 +6389,13 @@
|
||
switch ( _t->getType()) {
|
||
case ARRAYEXPR:
|
||
{
|
||
- RefDNode __t202 = _t;
|
||
+ RefDNode __t201 = _t;
|
||
RefDNode tmp77_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp77_AST_in = RefDNode(antlr::nullAST);
|
||
tmp77_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp77_AST_in = _t;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(tmp77_AST));
|
||
- antlr::ASTPair __currentAST202 = currentAST;
|
||
+ antlr::ASTPair __currentAST201 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),ARRAYEXPR);
|
||
@@ -6392,8 +6406,8 @@
|
||
arrayindex_list(_t);
|
||
_t = _retTree;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
- currentAST = __currentAST202;
|
||
- _t = __t202;
|
||
+ currentAST = __currentAST201;
|
||
+ _t = __t201;
|
||
_t = _t->getNextSibling();
|
||
array_expr_AST = RefDNode(currentAST.root);
|
||
break;
|
||
@@ -6470,13 +6484,13 @@
|
||
switch ( _t->getType()) {
|
||
case ARRAYEXPR:
|
||
{
|
||
- RefDNode __t205 = _t;
|
||
+ RefDNode __t204 = _t;
|
||
RefDNode tmp78_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp78_AST_in = RefDNode(antlr::nullAST);
|
||
tmp78_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp78_AST_in = _t;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(tmp78_AST));
|
||
- antlr::ASTPair __currentAST205 = currentAST;
|
||
+ antlr::ASTPair __currentAST204 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),ARRAYEXPR);
|
||
@@ -6487,8 +6501,8 @@
|
||
arrayindex_list(_t);
|
||
_t = _retTree;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
- currentAST = __currentAST205;
|
||
- _t = __t205;
|
||
+ currentAST = __currentAST204;
|
||
+ _t = __t204;
|
||
_t = _t->getNextSibling();
|
||
tag_array_expr_1st_AST = RefDNode(currentAST.root);
|
||
break;
|
||
@@ -6561,13 +6575,13 @@
|
||
switch ( _t->getType()) {
|
||
case ARRAYEXPR:
|
||
{
|
||
- RefDNode __t208 = _t;
|
||
+ RefDNode __t207 = _t;
|
||
RefDNode tmp80_AST = RefDNode(antlr::nullAST);
|
||
RefDNode tmp80_AST_in = RefDNode(antlr::nullAST);
|
||
tmp80_AST = astFactory->create(antlr::RefAST(_t));
|
||
tmp80_AST_in = _t;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(tmp80_AST));
|
||
- antlr::ASTPair __currentAST208 = currentAST;
|
||
+ antlr::ASTPair __currentAST207 = currentAST;
|
||
currentAST.root = currentAST.child;
|
||
currentAST.child = RefDNode(antlr::nullAST);
|
||
match(antlr::RefAST(_t),ARRAYEXPR);
|
||
@@ -6578,8 +6592,8 @@
|
||
arrayindex_list(_t);
|
||
_t = _retTree;
|
||
astFactory->addASTChild(currentAST, antlr::RefAST(returnAST));
|
||
- currentAST = __currentAST208;
|
||
- _t = __t208;
|
||
+ currentAST = __currentAST207;
|
||
+ _t = __t207;
|
||
_t = _t->getNextSibling();
|
||
tag_array_expr_AST = RefDNode(currentAST.root);
|
||
break;
|
||
diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc2/src/GDLTreeParser.hpp cvs/gdl/src/GDLTreeParser.hpp
|
||
--- gdl-0.9rc2/src/GDLTreeParser.hpp 2009-01-20 12:33:52.000000000 -0700
|
||
+++ cvs/gdl/src/GDLTreeParser.hpp 2009-01-26 09:43:54.000000000 -0700
|
||
@@ -145,13 +145,12 @@
|
||
public: void procedure_def(RefDNode _t);
|
||
public: void function_def(RefDNode _t);
|
||
public: void forward_function(RefDNode _t);
|
||
- public: void main_program(RefDNode _t);
|
||
+ public: void common_block(RefDNode _t);
|
||
+ public: void statement_list(RefDNode _t);
|
||
public: void interactive(RefDNode _t);
|
||
public: void statement(RefDNode _t);
|
||
- public: void statement_list(RefDNode _t);
|
||
public: void parameter_declaration(RefDNode _t);
|
||
public: void keyword_declaration(RefDNode _t);
|
||
- public: void common_block(RefDNode _t);
|
||
public: void caseswitch_body(RefDNode _t);
|
||
public: void expr(RefDNode _t);
|
||
public: void switch_statement(RefDNode _t);
|
||
Only in gdl-0.9rc2/src: KEYWORDS
|
||
diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc2/src/prognode.cpp cvs/gdl/src/prognode.cpp
|
||
--- gdl-0.9rc2/src/prognode.cpp 2009-01-20 12:33:52.000000000 -0700
|
||
+++ cvs/gdl/src/prognode.cpp 2009-01-26 09:43:54.000000000 -0700
|
||
@@ -23,8 +23,25 @@
|
||
|
||
#include "dinterpreter.hpp"
|
||
|
||
+#include "objects.hpp"
|
||
+
|
||
using namespace std;
|
||
|
||
+bool ProgNode::ConstantNode()
|
||
+ {
|
||
+ if( this->getType() == GDLTokenTypes::SYSVAR)
|
||
+ {
|
||
+ // note: this works, because system variables are never
|
||
+ // passed by reference
|
||
+ SizeT rdOnlySize = sysVarRdOnlyList.size();
|
||
+ for( SizeT i=0; i<rdOnlySize; ++i)
|
||
+ if( sysVarRdOnlyList[ i] == this->var)
|
||
+ return true;
|
||
+ }
|
||
+
|
||
+ return this->getType() == GDLTokenTypes::CONSTANT;
|
||
+ }
|
||
+
|
||
BaseGDL* ARRAYDEFNode::Eval()
|
||
{
|
||
// GDLInterpreter::
|
||
diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc2/src/prognode.hpp cvs/gdl/src/prognode.hpp
|
||
--- gdl-0.9rc2/src/prognode.hpp 2009-01-20 12:33:54.000000000 -0700
|
||
+++ cvs/gdl/src/prognode.hpp 2009-01-26 09:43:54.000000000 -0700
|
||
@@ -91,10 +91,7 @@
|
||
virtual BaseGDL* EvalNC(); // non-copy
|
||
virtual void Run();
|
||
|
||
- bool ConstantNode()
|
||
- {
|
||
- return this->getType() == GDLTokenTypes::CONSTANT;
|
||
- }
|
||
+ bool ConstantNode();
|
||
|
||
ProgNodeP getFirstChild() const
|
||
{
|