CsharptutorialHungary / egyetemikurzus-2024-tavasz

SZTE Alkalmazásfejlesztés c# alapokon a modern fejlesztési irányelvek bemutatásával 2024 tavaszi házi feladatok & órai anyag
MIT License
0 stars 20 forks source link

Nikli Erik - Q7VQV4 #2

Open niklierik opened 4 months ago

niklierik commented 4 months ago

Számológép

A projekt egy számológép, mely képes különböző matematikai képleteket megvalósítani.

Funkciók

Működés


---
title: Működés
---
flowchart
    subgraph "Interpreter"
        lexer["Lexer"]-->parser["Parser"]-->evaluator["Evaluator"]
    end

Interpreter

A program egyben tartója az Interpreter. Ő azért felel, hogy a különböző modulokat összetartsa, és bemenetül kapott stringből visszaadjon egy értelmezett és kiszámolt értéket. Három fázisból áll: Lexer, Parser és Evaluator

Lexer

A Lexer felel azért, hogy a beérkező stringből tokeneket gyártson, hogy azokat a későbbi fázisokban könnyebb legyen kezelni.

Pl. a x = 2 + 3 * 4 kifejezésből a következő listát generálja

A whitespace-ket általában kiszűri és ignorálja, de megkérhetjük, hogy azokat is tartsa meg

Parser

A Parser felel azért, hogy a listányi tokeneket Abstract Syntax Tree-be rendezze

A fenti kifejezésből ezt generálja:

flowchart TB
    assignmentBinaryExpr["BinaryExpr (=)"]
    xId("x")
    eq("=")
    addBinaryExpr["BinaryExpr (+)"]
    numLiteral2("2")
    add("+")
    multiplyBinaryExpr["BinaryExpr (*)"]
    numLiteral3("3")
    numLiteral4("4")
    mul("*")

    assignmentBinaryExpr --- xId
    assignmentBinaryExpr --- eq
    assignmentBinaryExpr --- addBinaryExpr

    addBinaryExpr --- numLiteral2
    addBinaryExpr --- add
    addBinaryExpr --- multiplyBinaryExpr

    multiplyBinaryExpr --- numLiteral3
    multiplyBinaryExpr --- mul
    multiplyBinaryExpr --- numLiteral4

Evaluator

Az Evaluator dolga bejárni a fát, beazonosítani az elvégzendő művelet típusát, és azt végrehajtani. Ezeket SubEvaluator-okkal végzi, amelyeket Reflection-nel csatol a fában található node-okhoz.

Szóval a fenti fában először az assignment-hez tartozó Bináris kifejezést kezdi el kiértékelni. Ez beidézi az AssignmentOperator-t, amely a baloldalon található identifiert, az x-hez a jobboldalon található kifejezést csatolja.

A jobboldali kifejezés kiértékelésével a Bináris kifejezés betölti az AddOperator-t, amelynek a bal oldalán egy 2-es található, a jobb oldalán egy kifejezés.

Ennek a Bináris kifejezésnek a kiértékelése betölti a MultiplyOperator-t, amely kiértékeli a 3 * 4 kifejezést.

Ez visszaadja az 12-t az összeadás operátornak, amely kiértékeli a 2 + 12 kifejezést.

Ez visszaadja az értékadás operátornak, amely eltárolja a 14-t az x változóba.

Bugok

A fát jobb oldal fele bontja, amelynek következtében pl. a 2 / 3 * 4 kifejezés 2 / (3 * 4) zárojelezéssel lesz értékelve.

webmaster442 commented 4 months ago

Ez teljesen saját munka, vagy valahonnan inspirálódtál megvalósítás tekintetében?

niklierik commented 4 months ago

Még annó neki fogtam egy saját nyelv készítésébe, és akkor neki kezdtem egy ilyen tutorial sorozatnak, onnan jöttek koncepciók, illetve voltak már dolgok kikisérletezve.

Itt van annak a projektnek a repoja: https://github.com/niklierik/Theta

Illetve a Youtube sorozat: https://www.youtube.com/watch?v=wgHIkdUQbp0&list=PLRAdsfhKI4OWNOSfS7EUu5GRAVmze1t2y

webmaster442 commented 4 months ago

Köszi az infót, ez egy baromi jó sorozatnak néz ki.

webmaster442 commented 4 months ago

Az import expression evaluator picit overkill szerintem, hogy ennyi opciót támogat, illetve security risk is lehet bármilyen tetszőleges függvényhez hozzáférést engedélyezni, szóval ha ezt éles projektben használnám, akkor kikapcsolnám a funkciót inkább biztonságra hivatkozva. Szép munka, bőven túl mutat a házi scope-on. Hobbi projekt szinten azonban lehet több unit tesztet tennék hozzá. Pl -2 - -2, illetve a tudományos (1e-6) formátum parsingot, meg még pár edge case-et lehet érdemes lenne megnézni tesztekkel.

niklierik commented 4 months ago

Rendben, még megpróbálom ezeket megcsinálni, de többi beadandó + szakdoga miatt nem biztos, hogy bele fog férni. Köszi szépen! : )