Az FormulaEval egy olyan webalkalmazás, amely lehetővé teszi Excel-szerű, de alapvetően univerzálisan értendő formulák kiértékelését, vizualizálását és egyedi kiértékelési szabályok létrehozását. A felület úgy lett kialakítva, hogy kezdő és haladó felhasználók számára is egyszerűen használható legyen.
Ez a rész felelős a formulák kiértékeléséért, illetve vizualizálásáért. Egyszerűen csak add meg a kifejezést és a kiértékelés azonnal végbemegy!
A kifejezés tokenekre (karakterekre) bontása, alapvető típusok meghatározása érdekében.
A tokenekből szintek építése, itt történik a formulák azonosítása és a szabályok hozzárendelése a szintekhez.
Egy rekurzív algoritmus kiértékeli a szinteket, a formula szabályoknak megfelelően.
Ez az eljárás a tokeneket hierarchikus bejárható struktúrába rendezi. Itt történik a formula típusának meghatározása, illetve a tagok összekapcsolása. Pl.:
Formula: SUM
Arguments: [
4,
5,
Expression: 5 * 5
]
Itt dől el hogy a formula beépített vagy sem, illetve itt is fut le az alapvető aritmetikai kifejezések kiértékelése is, tehát pl 5*5=25, így a formula kiértékelési szabály sosem kaphat aritmetikai kifejezést, ezáltal a rekurzivitással érhető el a kiértékelés zökkenőmentessége.
Ezt követően ha az ősosztály inicializálásakor a konstruktor tartalmaz első argumentumként string értéket, akkor az osztályt a rendszer regisztrálja formulaként.
Ebben a nézetben a felhasználó saját formula-szabályokat hozhat létre,
vagy meglévőket módosíthat. Alább látható hogyan történik az egyedi szabály létrehozása és annak használata.
Felülírjuk a beépített SUM formulát, úgy hogy az összegzés végeredményét csupán csak szorozza meg kettővel.
class MySum(BaseFormula):
def __init__(self):
super().__init__("SUM")
def Process(self):
result = 0
for member in self.members:
result += member.value
return result * 2
Az Editor nézetet egy AST (Abstract Syntax Tree) elemző algoritmus kezeli. Beolvassa a python osztályokat és kiszűri azokat amelyek a BaseFormula ősosztályból származtottak.
Ezt követően ha az ősosztály inicializálásakor a konstruktor tartalmaz első argumentumként string értéket, akkor az osztályt a rendszer regisztrálja formulaként.
A BaseFormula ősosztály rendelkezik egy Process metódussal amely a formula feldolgozásáért felel. Ez az ún. main metódusa, belépőpontja minden formulának.
Amikor kiértékelés történik a Kiértékelő nézetben és van aktiválva formula, akkor a webszervertől kapott formula tagokat elküldi a kiértékelő az adott formulának és self.members tagként elmenti. Ezáltal a Process metódusban manipulált self.members tag már a formula tagokkal feltöltött lista lesz.
A kapott lista Member típusú példányokat tartalmazhat, aminek az adattípusa reprezenentálásra kerül a value tulajdonság alapján. Ilyen adattípus lehet egész szám (int), lebegőpontos szám (float, double) vagy logikai érték (bool).
A Process metódus visszatérési érték adattípusa sem különbözhet a fenti típusoktól, mert a kiértékelő algoritmus a webszerveren egyenlőre ezt a három típust tudja kezelni.
result = 0
result += 4
result += 5
result += 25
return result * 2
A fenti példa formula kiértékelése
A rendszer tartalmaz beépített formulákat amiknek a kiértékelési eljárása teljesen webszerveren történik, azonban ezek a formulák is felülírhatóak, ha a felhasználó létrehoz egy új formulát és a beépített formula nevekkel azonos névvel látja el.
Ezáltal a webszerveres kiértékelés megszűnik és frontend oldalra kerül át, és a kiértékelés a Kiértékelési eljárás fejezetben taglaltak szerint fog végbemenni.
class MyOR(BaseFormula):
def __init__(self):
super().__init__("OR")
def Process(self):
for member in self.members:
if member.value:
return 1
return 0