Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Problem z parserm

Ostatnio zmodyfikowano 2011-08-20 16:52
Autor Wiadomość
malan
» 2011-08-07 22:28:50
C/C++
while( op_pos < op.size() )
?
P-38370
MrOsamaful
Temat założony przez niniejszego użytkownika
» 2011-08-16 15:48:25
@Up
Nie
P-39255
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ź ;)
P-39483
SeaMonster131
» 2011-08-19 23:25:57
@up: tak sie linki tworzy :)

[a href="link do strony"]
;)

//Nie ma za co ;p :)
P-39484
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
P-39554
1 « 2 »
Poprzednia strona Strona 2 z 2