Vyhodnocování výrazů z pohledu číselných typů
Odvozovací pravidla jsou pravidla, které pomáhají určit konkrétní verzi přetížené funkce (s generickými parametry) ve výrazu.
Vzhledem k tomu, že standardní ST nepodporuje přetížené funkce definované uživatelem, nejsou k dispozici žádné ST vzory k jejich popisu. Proto budeme používat C-notaci.
Příklad
ADD(ANY_MAGNITUDE, ANY_MAGNITUDE, ... ) => ANY_MAGNITUDE
Přetížené funkce mohou být určeny výrazem, to znamená že existují pravidla, jak určit, které negenerické typy budou použity pro parametry funkce.
Příklad
ADD_INT(INT, INT, ... ) => INT
Cílem pravidel je určit vhodnou funkci pro výraz určený hodnotou partikulárních hodnot argumentů.
Příklad
VAR ix, iy : INT; dix, diy : DINT; rx, ry : REAL; rlx, rly : LREAL; END_VAR ADD (1, 2, 3) => the expression is the same as ADD_DINT. (note: if not specified otherwise then the 1, 2, 3 constants are interpreted as DINT types) ADD (ix, iy) => ADD_INT ADD (rx, ix) => ADD_REAL ADD (ix, diy, rlx) => ADD_LREAL
Odvozovací proces jde zhruba tímto způsobem:
- Argumenty na přetížené funkce musí patřit do obecných kategorií typu odpovídajících parametrům přetížené funkce.
- Parametry funkce jsou seskupeny podle svých obecných kategorií typu (označme je p-skupina)
- Pro každou p-skupinu určíme nejvíce přesný typ (označme je c-skupina), která může pojmout hodnoty všech argumentů současně, a že bude typem použitým ke generickým parametrům typu p-skupiny.
- Pro všechny argumenty z p-skupiny se očekává, že budou implicitně převedeny na typy c-skupina a jsou převedeny do tohoto typu dříve, než se zavolá vlastní funkce.
Příklad
ve výrazu
ADD (ix, diy, rlx)
je jedna p-skupina s generickým typem ANY_MAGNITUDE ve funkci ADD, a parametry IN1, IN2, IN3 patří do něj i odpovídající argumenty IX, DIY a RLX. Proto c-skupina je určena jako typ LREAL. V důsledku výše uvedeného výraz je ekvivalentní výrazu:
ADD_LREAL(ix, diy, rlx) and result is LREAL
Příklad
MUX(K := dix, IN0 := rx, IN1 := dix)
Jsou tu dvě p-skupiny, ANY_INT a ANY. Parametr K patří do první skupiny a IN0, IN1 do druhé jmenované. Proto c-typ ANY_INT skupiny je DINT a ANY je c-typ REAL. V důsledku výše uvedeného je výše uvedený výraz ekvivalentní výrazu:
MUX_DINT_REAL (K := dix, IN0 := rx, IN1 := dix) a výsledek je REAL