Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
Frida
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container Registry
Model registry
Operate
Environments
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Coenen, Joachim
Frida
Commits
9b0473b5
Commit
9b0473b5
authored
12 years ago
by
Wuttke, Joachim
Browse files
Options
Downloads
Patches
Plain Diff
forbid c[k,j,i]
clearly distinguish index k,j,i from reference x,y,ni,r0,z1,...
parent
ee705be2
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
pub/src/expr.cpp
+72
-68
72 additions, 68 deletions
pub/src/expr.cpp
pub/src/node.h
+4
-4
4 additions, 4 deletions
pub/src/node.h
pub/src/xax_lex.lpp
+6
-1
6 additions, 1 deletion
pub/src/xax_lex.lpp
pub/src/xax_yacc.ypp
+2
-1
2 additions, 1 deletion
pub/src/xax_yacc.ypp
with
84 additions
and
74 deletions
pub/src/expr.cpp
+
72
−
68
View file @
9b0473b5
...
...
@@ -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).
...
...
This diff is collapsed.
Click to expand it.
pub/src/node.h
+
4
−
4
View file @
9b0473b5
...
...
@@ -46,18 +46,18 @@ class CNodeVal: public CTree {
//! Indexed variable node.
class
CNodeIva
:
public
CTree
{
public:
// TEMPORARILY
private:
C
Var
var
;
P
Var
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
()
+
"]"
;
}
};
...
...
This diff is collapsed.
Click to expand it.
pub/src/xax_lex.lpp
+
6
−
1
View file @
9b0473b5
...
...
@@ -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; }
...
...
This diff is collapsed.
Click to expand it.
pub/src/xax_yacc.ypp
+
2
−
1
View file @
9b0473b5
...
...
@@ -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() ); }
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment