From Wikipedia, the free encyclopedia
Shunting yard algoritmus je metoda pro syntaktickou analýzu matematických výrazů zapsaných v infixové notaci. Algoritmus může být použit k převodu výrazů do reverzní polské notace (RPN), nebo do abstraktního syntaktického stromu (AST).
Algoritmus byl vyvinut Edsgerem Dijkstrou a pojmenován Shunting yard (česky seřaďovací nádraží), protože jeho princip se podobá seřaďovacímu nádraží.
Podobně jako interpret reverzní polské notace je shunting yard založený na používání zásobníku. Infixovou formu zápisu používá většina lidí (například 3+4 nebo 3+4*(2−1)). Ke konverzi do RPN je zapotřebí dvou textových proměnných (jednu pro vstup a druhou pro výstup) a jednoho zásobníku pro uchovávání operátorů které zatím nebyly vloženy do výstupu.
Z této ukázky je možno vypozorovat několik pravidel:
Časová náročnost tohoto algoritmu je lineární v závislosti na velikosti programu, protože každý token je načten pouze jednou, každá funkce a každý operátor je na zásobník vložený a vyjmutý pouze jednou a každý prvek je vložen do výstupu pouze jednou.
Token | Akce | Výstup (v RPN) | Zásobník operátorů | Poznámky |
---|---|---|---|---|
3 | Přidej token do výstupu | 3 | ||
+ | Přidej token na zásobník | 3 | + | |
4 | Přidej token do výstupu | 3 4 | + | |
* | Přidej token na zásobník | 3 4 | + * | * má větší prioritu než + |
2 | Přidej token do výstupu | 3 4 2 | + * | |
/ | Vyjmi ze zásobníku a vypiš | 3 4 2 * | + | / a * mají stejnou prioritu |
Přidej token na zásobník | 3 4 2 * | + / | / má větší prioritu než + | |
( | Přidej token na zásobník | 3 4 2 * | + / ( | |
1 | Přidej token do výstupu | 3 4 2 * 1 | + / ( | |
- | Přidej token na zásobník | 3 4 2 * 1 | + / ( - | |
5 | Přidej token do výstupu | 3 4 2 * 1 5 | + / ( - | |
) | Vyjmi ze zásobníku a vypiš | 3 4 2 * 1 5 − | + / ( | Opakuj dokud nenajdeš "(" |
Vyjmi ze zásobníku | 3 4 2 * 1 5 − | + / | Zahoď nalezenou závorku | |
^ | Přidej token na zásobník | 3 4 2 * 1 5 − | + / ^ | ^ má větší prioritu než / |
2 | Přidej token do výstupu | 3 4 2 * 1 5 − 2 | + / ^ | |
^ | Přidej token na zásobník | 3 4 2 * 1 5 − 2 | + / ^ ^ | ^ je vyhodnoceno zprava doleva |
3 | Přidej token do výstupu | 3 4 2 * 1 5 − 2 3 | + / ^ ^ | |
konec | Vypiš zbytek zásobníku | 3 4 2 * 1 5 − 2 3 ^ ^ / + |
Pokud píšete interpret, výstup můžete tokenizovat a zapsat do zkompilovaného souboru k pozdější interpretaci. Konverzí z infixové notace do RPN můžete také zjednodušit vyhodnocování matematických výrazů. To provedete tak, jako kdybyste vyhodnocovali RPN výraz, nicméně pokud narazíte na proměnnou, jejíž hodnota je nulová a vždy když operátor má nulovou hodnotu, tak jeho hodnotu a parametry vypište na výstup (tohle je zjednodušení – problémy nastanou, pokud jsou jako parametry operátory). Pokud operátor nemá nulový parametr, jeho hodnota může být vypsána na výstup. Tato metoda očividně neobsahuje všechna možná zjednodušení – je to většinou jako optimalizace pomocí constant folding.
V tomto článku byl použit překlad textu z článku Shunting-yard algorithm na anglické Wikipedii.
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.