====== 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