Open niklierik opened 4 months ago
Ez teljesen saját munka, vagy valahonnan inspirálódtál megvalósítás tekintetében?
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
Köszi az infót, ez egy baromi jó sorozatnak néz ki.
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.
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! : )
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
4!
), fok radiánná alakítása (pl.90°
)x = 2 + 3
y = x + 3
"pl ez"
) és logikai értéki8
,i16
,i32
,i64
,f32
,f64
függvényekkeland
,or
,not
pi
,e
,null
,true
,false
import * __decapitalize__ from System.Math
behúzza az összes függvényt a Math library-ből és kicseréli a kezdőbetűit kicsire (szóval aSin
-bőlsin
lesz)Math.Sin
Sin
System.Math.Sin
Működés
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
ésEvaluator
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áljaA 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:
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.