Skip to content
Snippets Groups Projects
Commit 9b0473b5 authored by Wuttke, Joachim's avatar Wuttke, Joachim
Browse files

forbid c[k,j,i]

clearly distinguish index k,j,i from reference x,y,ni,r0,z1,...
parent ee705be2
No related branches found
No related tags found
No related merge requests found
......@@ -521,23 +521,23 @@ string CNodeVal::tree_info() const { return "val[" + strg(val) + "]"; }
void CNodeIva::npar_exec( uint *np ) const
{
if ( var.typ == CVar::_CP )
*np = max( *np, var.num+1 );
if ( var->typ == CVar::_CP )
*np = max( *np, var->num+1 );
}
//! Evaluate reference in given context. Result returned in ret.
void CNodeIva::tree_val( CResult& ret, const CContext& ctx ) const
{
if ( (var.typ == CVar::_I || var.typ == CVar::_J ||
var.typ == CVar::_K) && ( ref->ti || ref->tj || ref->tk ) )
if ( (var->typ == CVar::_I || var->typ == CVar::_J ||
var->typ == CVar::_K) && ( ref->ti || ref->tj || ref->tk ) )
throw "invalid cross reference: index cannot be indexed";
// Get k from context:
uint k = ref->get_k( ctx );
// Return k-dependent reference (unless already done above):
if ( var.typ == CVar::_K ) {
if ( var->typ == CVar::_K ) {
ret.set_r( k );
return;
}
......@@ -545,13 +545,13 @@ void CNodeIva::tree_val( CResult& ret, const CContext& ctx ) const
// Proceed with file reference f[k]:
POlo f = NOlm::MOM[k];
if ( var.typ == CVar::_NJ ) {
if ( var->typ == CVar::_NJ ) {
ret.set_r( f->nJ() );
return;
} else if ( var.typ == CVar::_R ) {
if ( var.num>= f->RPar.size() )
throw "invalid reference " + var.var_info();
ret.set_r( f->RPar[var.num].val );
} else if ( var->typ == CVar::_R ) {
if ( var->num>= f->RPar.size() )
throw "invalid reference " + var->var_info();
ret.set_r( f->RPar[var->num].val );
return;
}
......@@ -559,13 +559,13 @@ void CNodeIva::tree_val( CResult& ret, const CContext& ctx ) const
uint j = ref->get_j( ctx, f->nJ() );
// Return k-j-dependent reference (unless done above):
if ( var.typ == CVar::_J ) {
if ( var->typ == CVar::_J ) {
ret.set_r( ctx.j );
return;
} else if ( var.typ == CVar::_Z ) {
if ( var.num>= f->nZ() )
throw "invalid reference " + var.var_info();
ret.set_r( f->V[j]->z[var.num] );
} else if ( var->typ == CVar::_Z ) {
if ( var->num>= f->nZ() )
throw "invalid reference " + var->var_info();
ret.set_r( f->V[j]->z[var->num] );
return;
}
......@@ -573,8 +573,8 @@ void CNodeIva::tree_val( CResult& ret, const CContext& ctx ) const
POld fd = P2D( f );
if ( fd ) {
PSpec sj = fd->VS(j);
if ( var.pointwise() ) {
if ( var.typ == CVar::_DY && !sj->dy.size() )
if ( var->pointwise() ) {
if ( var->typ == CVar::_DY && !sj->dy.size() )
throw string( "dy not set" );
if ( ctx.dim==CContext::_1 ) {
uint i;
......@@ -588,15 +588,15 @@ void CNodeIva::tree_val( CResult& ret, const CContext& ctx ) const
if( i>= sj->size() )
throw "i=" + strg(i) + " exceeds scan size" +
strg(sj->size());
if ( var.typ == CVar::_I ) {
if ( var->typ == CVar::_I ) {
ret.set_r( i );
} else if ( var.typ == CVar::_X ) {
} else if ( var->typ == CVar::_X ) {
ret.set_r( sj->x[i] );
} else if ( var.typ == CVar::_Y ) {
} else if ( var->typ == CVar::_Y ) {
ret.set_r( sj->y[i] );
if ( ctx.want_error && sj->dy.size() )
ret.dr = sj->dy[i];
} else if ( var.typ == CVar::_DY ) {
} else if ( var->typ == CVar::_DY ) {
ret.set_r( sj->dy[i] );
}
} else if ( ctx.dim==CContext::_VI ) {
......@@ -604,7 +604,7 @@ void CNodeIva::tree_val( CResult& ret, const CContext& ctx ) const
CContext myctx = ctx;
myctx.dim = CContext::_1;
ret.preset_v( ctx.nv );
if ( var.typ == CVar::_Y && ctx.want_error &&
if ( var->typ == CVar::_Y && ctx.want_error &&
sj->dy.size() )
ret.dv.resize( ctx.nv );
for( uint ii=0; ii<ctx.nv; ++ii ){
......@@ -614,43 +614,43 @@ void CNodeIva::tree_val( CResult& ret, const CContext& ctx ) const
if( i >= sj->size() )
throw "i=" + strg(i) + " exceeds scan size" +
strg(sj->size());
if ( var.typ == CVar::_I ) {
if ( var->typ == CVar::_I ) {
ret.v[ii] = i;
} else if ( var.typ == CVar::_X ) {
} else if ( var->typ == CVar::_X ) {
ret.v[ii] = sj->x[i];
} else if ( var.typ == CVar::_Y ) {
} else if ( var->typ == CVar::_Y ) {
ret.v[ii] = sj->y[i];
if ( ret.dv.size() )
ret.dv[ii] = sj->dy[i];
} else if ( var.typ == CVar::_DY ) {
} else if ( var->typ == CVar::_DY ) {
ret.v[ii] = sj->dy[i];
}
}
} else {
if ( ctx.nv != sj->size() )
throw "ref_val " + var.var_info() + ": requested vec(" +
throw "ref_val " + var->var_info() + ": requested vec(" +
strg(ctx.nv) + "), found vec(" +
strg( sj->size() );
if ( var.typ == CVar::_I ) {
if ( var->typ == CVar::_I ) {
ret.preset_v( ctx.nv );
for( uint i=0; i<ctx.nv; ++i )
ret.v[i] = i;
} else if ( var.typ == CVar::_X ) {
} else if ( var->typ == CVar::_X ) {
ret.set_v( sj->x );
} else if ( var.typ == CVar::_Y ) {
} else if ( var->typ == CVar::_Y ) {
ret.set_v( sj->y );
if ( ctx.want_error )
ret.dv = sj->dy;
} else if ( var.typ == CVar::_DY ) {
} else if ( var->typ == CVar::_DY ) {
ret.set_v( sj->dy );
}
}
} else
throw string( "BUG: invalid context::dim" );
} else if ( var.typ == CVar::_NI ) {
} else if ( var->typ == CVar::_NI ) {
ret.set_r( sj->size() );
} else
throw "invalid ref(" + var.var_info() + ") in data file";
throw "invalid ref(" + var->var_info() + ") in data file";
return;
}
......@@ -658,16 +658,16 @@ void CNodeIva::tree_val( CResult& ret, const CContext& ctx ) const
POlc fc = P2C( f );
if ( fc ) {
PCurve cj = fc->VC(j);
if ( var.typ == CVar::_CP ) {
if ( var.num>= fc->nPar() )
throw "invalid p ref(" + var.var_info() + ") in curve file";
ret.set_r( cj->P[var.num] );
} else if ( var.typ == CVar::_CQ ) {
if ( var.num >= CCurve::mQuality )
throw "invalid fm ref(" + var.var_info() + ") in curve file";
ret.set_r( cj->Quality[var.num] );
if ( var->typ == CVar::_CP ) {
if ( var->num>= fc->nPar() )
throw "invalid p ref(" + var->var_info() + ") in curve file";
ret.set_r( cj->P[var->num] );
} else if ( var->typ == CVar::_CQ ) {
if ( var->num >= CCurve::mQuality )
throw "invalid fm ref(" + var->var_info() + ") in curve file";
ret.set_r( cj->Quality[var->num] );
} else
throw "invalid ref(" + var.var_info() + ") in curve file";
throw "invalid ref(" + var->var_info() + ") in curve file";
return;
}
}
......@@ -676,13 +676,13 @@ void CNodeIva::tree_val( CResult& ret, const CContext& ctx ) const
void CNodeIva::set_coord( CCoord& ret, uint k_in ) const
{
if ( var.typ == CVar::_K ) {
if ( var->typ == CVar::_K ) {
ret = CCoord("k","");
return;
} else if ( var.typ == CVar::_J ) {
} else if ( var->typ == CVar::_J ) {
ret = CCoord("j","");
return;
} else if ( var.typ == CVar::_I ) {
} else if ( var->typ == CVar::_I ) {
ret = CCoord("i","");
return;
}
......@@ -703,42 +703,42 @@ void CNodeIva::set_coord( CCoord& ret, uint k_in ) const
if (!f)
throw "set_coord: ref where not refering to a file";
if ( var.typ == CVar::_Z ) {
if (var.num>=f->ZCo.size())
throw "set_coord: z" + strg(var.num) + " undefined";
ret = f->ZCo[var.num];
} else if ( var.typ == CVar::_R ) {
if (var.num>=f->RPar.size())
throw "set_coord: r" + strg(var.num) + " undefined";
ret = f->RPar[var.num].Co;
} else if ( var.typ == CVar::_NJ ) {
if ( var->typ == CVar::_Z ) {
if (var->num>=f->ZCo.size())
throw "set_coord: z" + strg(var->num) + " undefined";
ret = f->ZCo[var->num];
} else if ( var->typ == CVar::_R ) {
if (var->num>=f->RPar.size())
throw "set_coord: r" + strg(var->num) + " undefined";
ret = f->RPar[var->num].Co;
} else if ( var->typ == CVar::_NJ ) {
ret = CCoord("#spectra", "");
} else {
POld fd = P2D( f );
POlc fc = P2C( f );
if ( fd ) {
if ( var.typ == CVar::_X )
if ( var->typ == CVar::_X )
ret = fd->xco;
else if ( var.typ == CVar::_Y )
else if ( var->typ == CVar::_Y )
ret = fd->yco;
else if ( var.typ == CVar::_DY )
else if ( var->typ == CVar::_DY )
ret = CCoord( "d"+fd->yco.name, fd->yco.unit );
else if ( var.typ == CVar::_NI )
else if ( var->typ == CVar::_NI )
ret = CCoord("#points", "");
else
throw "reference " + var.var_info() +
throw "reference " + var->var_info() +
" not allowed in data file";
} else if ( fc ) {
if ( var.typ == CVar::_CP ) {
if( var.num>=fc->nPar() )
throw "invalid reference p" + strg(var.num);
ret = fc->PCo[var.num];
} else if ( var.typ == CVar::_CQ )
ret = CCoord("cq"+strg(var.num), ""); // fit quality indicator
else if ( var.typ == CVar::_C )
if ( var->typ == CVar::_CP ) {
if( var->num>=fc->nPar() )
throw "invalid reference p" + strg(var->num);
ret = fc->PCo[var->num];
} else if ( var->typ == CVar::_CQ )
ret = CCoord("cq"+strg(var->num), ""); // fit quality indicator
else if ( var->typ == CVar::_C )
ret = CCoord(fc->expr,"");
else
throw "reference " + var.var_info() +
throw "reference " + var->var_info() +
" not allowed in curve file";
} else
throw "BUG: ref->set_coord unexpected else";
......@@ -766,7 +766,11 @@ void CNodeRgr::set_coord( CCoord& ret, uint k ) const {
//***************************************************************************//
CNodeCev::CNodeCev( PRef& _ref, PTree _arg )
: ref( _ref ), arg( _arg ) {}
: ref( _ref ), arg( _arg )
{
if( ref->ti )
throw "curve reference must not depend on index i";
}
//! A curve evaluation: fc[k,j](arg).
......
......@@ -46,18 +46,18 @@ class CNodeVal: public CTree {
//! Indexed variable node.
class CNodeIva: public CTree {
public: // TEMPORARILY
private:
CVar var;
PVar var;
PRef ref;
void npar_exec( uint *np ) const;
public:
CNodeIva( PVar _var, PRef _ref ) :var(*_var), ref(_ref) {};
CNodeIva( PVar _var, PRef _ref=PRef( new CRef() ) )
: var(_var), ref(_ref) {};
void tree_val( CResult& ret, const CContext& ctx ) const;
bool has_dummy() const { return false; }
void kdep_exec( bool *kd ) const { *kd = true; }
void set_coord( CCoord& ret, uint k ) const;
string tree_info() const { return "ref[" + var.var_info() + "]"; }
string tree_info() const { return "ref[" + var->var_info() + "]"; }
};
......
......@@ -50,7 +50,12 @@ EXP [eE]"-"?[0-9]+
xaxlval->d = atof(xaxtext);
return NUM; }
[xykji]|dy|n[ij]|([zpr]|cq){DIG}+ {
[kji] {
// printf( "lex: The index %s\n", xaxtext );
xaxlval->v = PVar( new CVar(xaxtext) );
return IDX; }
[xy]|dy|n[ij]|([zpr]|cq){DIG}+ {
// printf( "lex: The variable %s\n", xaxtext );
xaxlval->v = PVar( new CVar(xaxtext) );
return REF; }
......
......@@ -67,7 +67,7 @@ int xaxlex(YYSTYPE *xaxlval); /* created by lex.l */
%left BOP_PM /* error */
/* other tokens created by lex.l: */
%token NUM REF DUMMY CEV FNCT END CONV DIRAC REG
%token NUM IDX REF DUMMY CEV FNCT END CONV DIRAC REG
/* Grammar follows */
......@@ -79,6 +79,7 @@ input:
exp: /* double-valued expression */
NUM { $$.t = PTree( new CNodeVal( $1.d ) ); }
| IDX { $$.t = PTree( new CNodeIva( $1.v ) ); }
| REF bra { $$.t = PTree( new CNodeIva( $1.v, $2.r ) ); }
| REG { $$.t = PTree( new CNodeRgr( $1.rgr ) ); }
| DUMMY { $$.t = PTree( new CNodeDummy() ); }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment