Beállítások
Projekt:
Importálás
Exportálás
Projekt
Nézet
Profil
Kiértékelés
Editor
Dokumentáció
Eszközök
Ide kerülnek a kiértékelt formulák...
Folyamat terminál
Eszközök
Folyamat terminál

FormulaEval – használati útmutató

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.

Kiértékelő Nézet

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!

Kifejezés feldolgozási folyamata
  • Tokenizálás

    A kifejezés tokenekre (karakterekre) bontása, alapvető típusok meghatározása érdekében.

  • Szint építés

    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.

  • Szintek kiértékelése

    Egy rekurzív algoritmus kiértékeli a szinteket, a formula szabályoknak megfelelően.

Tokenizálás
A fenti képlet tokenekben ábrázolva
SUM FUNCTION ( PAREN 4 NUMBER , SEP 5 NUMBER , SEP 5 NUMBER * OP 5 NUMBER ) PAREN
A tokenizálás “darabokra szedi” a kifejezést, így később könnyebb lesz szabályokat (formulákat) illeszteni rá.
Szint építés

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
]
                
Szintek (hierarchia + tagok)
ROOT BASIC külső “konténer”
LEVEL SUM aktivált formula
Member 4
Member 5
Expression 5 * 5
A az eljárás tokenekből összeállítja, hogy mi tartozik egy formulához (members), és mi számít aritmetikai kifejezésnek.
Kiértékelés

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.

Kiértékelhető kifejezések
Alap aritmetikai kifejezések
2+5*5
A 2+5*5 aritmetikai művelet ebben az esetben csak kiértékelésre kerül, a kiértékelő az ilyen kifejezéseket a lengyel formára hozás algoritmusával értékeli ki.
Zárójeles tagok
2+(5*5)
Az 5*5 aritmetikai művelet ebben az esetben nem értelmezhető numerikus értéknek, így a kiértékelő egy formulává alakítja, ami a BASIC névre hallgat. Ez felelős azért, hogy feldolgozható maradjon a kifejezés.
Numerikus értékek
2.05*2
A kiértékelő képes lebegőpontos értékekkel is számolni, de a kiértékelés után minden szám legyen az egész vagy lebegőpontos egy közös Numerikus típusként kezelendő. A Numerikus típus tulajdonsága megegyezik a lebegőpontoséval.
Logikai értékek
1=1 = Igaz
A kiértékelő képes logikai kifejezések értelmezésére is, de kifejezés nélkül is minden Numerikus értéknek van logikai reprezentációja. Pl. 0 = Hamis, 1 = Igaz.
Szöveg típus
"szöveg..."
A kiértékelő jelenleg nem alkalmas szöveg típusok feldolgozására.

Editor Nézet

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.

Példa formula

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
            
Formula létrehozása

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.

Kiérétkelési eljárás

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.

Kiértékelési folyamatábra
SUM( 4, 5, 5*5 )
self.members
Member value = 4
Member value = 5
Member value = 25
self.members
Member value = 4
Member value = 5
Member value = 25
Process()
    result = 0
    result += 4
    result += 5
    result += 25
    return result * 2
                            
Formula eredmény
34

A fenti példa formula kiértékelése

Kiértékelhető formulák

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.

Beépített formulák
  • OR
  • AND
  • COUNT
  • MAX
  • MIN
  • AVERAGE
  • SUM
Kiválasztott formula

class MyOR(BaseFormula):
	def __init__(self):
		super().__init__("OR")

	def Process(self):
		for member in self.members:
			if member.value:
				return 1
		return 0