Problem z parserm
Ostatnio zmodyfikowano 2011-08-20 16:52
malan |
» 2011-08-07 22:28:50 while( op_pos < op.size() )
? |
|
MrOsamaful Temat założony przez niniejszego użytkownika |
» 2011-08-16 15:48:25 @Up Nie |
|
Ziemowit |
» 2011-08-19 23:13:15 Nie jest to tak łatwe jak Ci się wydaje. Koledzy dobrze Ci radzą. Załóżmy bowiem banalny przykład: 2 + 3 * 6. Jeśli będziesz wykonywał działania po kolei (od lewej do prawej) to co dostaniesz? Ano 30! Ale zaraz? To chyba nie taki miał wyjść wynik prawda? Poprawny wynik to 20... Pójdźmy dalej. Jak będziesz to chciał rozbudować i dołączyć używanie nawiasów. Np. 2+3*(32-1)/7... Powiem w skrócie -> masakra. Temat nie jest wcale taki banalny jak się wydaje i napisanie poprawnego parsera działań arytmetycznych nie jest zadaniem na 5 minut. Odwrotna notacja polska to dobry wybór. Stosuje się ją choćby w kalkulatorach które możesz kupić w sklepie (są też inne sposoby, ale aż tak głęboko się tym nigdy nie interesowałem). Jeśli temat Cię interesuje i chcesz to zrobić jak należy to link z bardzo dobrym tutorialem krok po kroku i to w języku polskim jak się za to zabrać + kod :) @edit Za szybko wklejałem i podałem zły link. Oto poprawny link z tutorialem oraz wieloma innymi: http://warsztat.gd/tutorials.php@edit2 Dzięki za podpowiedź ;) |
|
SeaMonster131 |
» 2011-08-19 23:25:57 @up: tak sie linki tworzy :)
[a href="link do strony"] ;)
//Nie ma za co ;p :) |
|
Elaine |
» 2011-08-20 16:52:28 Temat nie jest wcale taki banalny jak się wydaje |
Nie jest też taki trudny jak się może wydawać.
Odwrotna notacja polska to dobry wybór. |
Napisanie ręcznie rekurencyjnego parsera schodzącego dla odpowiedniej gramatyki jest równie dobrym, jak nie lepszym wyborem, OP dobrze tu zaczął.
Ja zmieniłbym tu tylko gramatykę (i przystosowałbym do niej odpowiednio parser), na taką, która zawiera rekurencję :P
Chodzi o coś w stylu: expression:
multExpr
multExpr '+' expression
multExpr '-' expression
multExpr:
primaryExpr
primaryExpr '*' multExpr
primaryExpr '/' multExpr
primaryExpr:
INTEGER
'(' expression ')' // jeśli potrzebna jest obsługa nawiasów |
|
1 « 2 » |