Patch level : 10.0

Files correlati     : ba8 lv0
Ricompilazione Demo : [ ]
Commento            :
Corretta gestione espressioni annidate.
Ora e' possibile scrivere STR(BETWEEN(PREZZO, 338, 883))


git-svn-id: svn://10.65.10.50/trunk@17964 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2008-12-22 10:26:36 +00:00
parent a8c5a1bed6
commit 60e44f8381
2 changed files with 23 additions and 17 deletions

View File

@ -1078,8 +1078,6 @@ TCodesym TExpression::__gettoken()
return _invalid; return _invalid;
} }
HIDDEN int __parms_found = -1;
TCodesym TExpression::__factor(TCodesym startsym) TCodesym TExpression::__factor(TCodesym startsym)
{ {
TCodesym sym = _invalid; TCodesym sym = _invalid;
@ -1129,19 +1127,20 @@ TCodesym TExpression::__factor(TCodesym startsym)
case _userfunc: case _userfunc:
{ {
TValue val (_tok); TValue val (_tok);
sym = __function(); int parms_found = 0;
sym = __function(-1, &parms_found);
if (sym != _invalid) if (sym != _invalid)
{ {
const int index = parse_user_func((const char *) val.string(), __parms_found);
const int index = parse_user_func(val.string(), parms_found);
if (index < 0) if (index < 0)
{ {
strcpy(_tok, (const char *) val.string()); strncpy(_tok, val.string(), sizeof(_tok));
sym = _invalid; sym = _invalid;
} }
else else
{ {
_code.add(_number, real(__parms_found)); _code.add(_number, real(parms_found));
val = real(index); val = real(index);
_code.add(startsym, val); _code.add(startsym, val);
_user_func_defined = TRUE; _user_func_defined = TRUE;
@ -1219,7 +1218,7 @@ TCodesym TExpression::__term(TCodesym startsym)
TCodesym TExpression::__expression(TCodesym startsym) TCodesym TExpression::__expression(TCodesym startsym)
{ {
TCodesym sym; TCodesym sym;
if ((startsym == _minus) || (startsym == _not) || (startsym == _plus)) if ((startsym == _minus) || (startsym == _not) || (startsym == _plus))
sym =__gettoken(); sym =__gettoken();
else else
@ -1241,27 +1240,34 @@ TCodesym TExpression::__expression(TCodesym startsym)
return(sym); return(sym);
} }
TCodesym TExpression::__function(int nparms, bool fixed_num) TCodesym TExpression::__function(int nparms, int* actual_nparams)
{ {
TCodesym sym = __gettoken(); TCodesym sym = __gettoken();
if (sym != _lpar) if (sym != _lpar)
return _invalid; return _invalid;
__parms_found = 0; int found = 0;
sym = __gettoken(); sym = __gettoken();
if (sym == _rpar) if (sym == _rpar)
return nparms <= 0 || !fixed_num ? __gettoken() : _invalid; {
__parms_found++; if (actual_nparams)
*actual_nparams = found;
return nparms <= 0 ? __gettoken() : _invalid;
}
found++;
sym = __expression(sym); sym = __expression(sym);
while (sym == _comma || sym == _semicolon) while (sym == _comma || sym == _semicolon)
{ {
sym = __gettoken(); sym = __gettoken();
__parms_found++; found++;
sym = __expression(sym); sym = __expression(sym);
} }
if (sym == _rpar) if (sym == _rpar)
return nparms < 0 || __parms_found == nparms || (__parms_found < nparms && !fixed_num) ? {
__gettoken() : if (actual_nparams)
_invalid; *actual_nparams = found;
return nparms < 0 || found == nparms ? __gettoken() : _invalid;
}
return _invalid; return _invalid;
} }

View File

@ -433,7 +433,7 @@ protected:
// @cmember Esegue la compilazione di un'espressione // @cmember Esegue la compilazione di un'espressione
TCodesym __expression(TCodesym startsym); TCodesym __expression(TCodesym startsym);
// @cmember Esegue la compilazione di un una funzione // @cmember Esegue la compilazione di un una funzione
TCodesym __function(int nparms = -1, bool fixed_num = TRUE); TCodesym __function(int nparms = -1, int* actual_params = NULL);
// @cmember Compila l'espressione // @cmember Compila l'espressione
bool compile(const TString& expression, TTypeexp type); bool compile(const TString& expression, TTypeexp type);