Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Machr na Algoritmy - parser matematických výrazů

Aktivity
Avatar
coells
Tvůrce
Avatar
Odpovídá na vitamin
coells:7.10.2014 19:08

Přes delegáta. Stejným způsobem, jako tvůj Lexer získává vstupní data.

Podívej se na Lexer. Jako vstupní parametr v kontruktoru přijímá stream (string, iterátor, stream, reader, na tom nezáleží). Proč Lexer nedědí od stringu, streamu nebo iterátoru? Protože to nedává smysl. Stejným způsobem nedává smysl, aby Parser dědil od Lexeru.

Obě třídy jsou oddělené komponenty a stejně tak by měly fungovat. Dědičnost ti má ušetřit práci, jenže když se snažíš podědit bez zjevného důvodu, práci si pouze přiděláš, protože až budeš v budoucnu upravovat třídy, rozšiřovat je nebo měnit, zjistíš, že musíš brát neustále ohledy na všechny potomky.

Tady je velký rozdíl mezi poděděním kompletní funkcionality a delegátem s jasně definovaným rozhraním. Důvod k dědičnosti tu není, výstupem z lexeru jsou tokeny, které jsou vstupem do syntaktické analýzy. Reusabilita kódu je nulová, zatímco začínáš narušovat modularitu komponent. Pokud se v budoucnu rozhodneš změnit lexikální analýzu na regulární automat pomocí nejakého nástroje, který vygeneruje analyzér, máš velký problém, protože všechny úpravy se budou automaticky promítat do syntaktické analýzy. Tohle dává smysl? Argument sám za sebe pak je definice konstruktoru, která naprosto omezuje návrh potomků, kteří také budou muset vyžadovat stream ve svém konstruktoru, ale pro vyšší stupně analýzy to není žádoucí stav.

A ještě jeden pohled z trochu vyšší úrovně. Pokud bys měl vymezit funkcionalitu pro jednotlivé třídy, u Parseru bys napsal "provádí syntaktickou a sémantickou analýzu, generuje derivační strom". Jaký by byl popis Lexeru? "neumí nic, ale potomci získají možnost lexikální analýzy" Takže je každý potomek lexikální analyzér? Není, pouze získá takovou schopnost.

 
Odpovědět
7.10.2014 19:08
Avatar
1Pupik1989
Člen
Avatar
1Pupik1989:15.10.2014 23:10

Tak jak koukám, tak bych stejně nevyhrál, protože to mám psané jako překladač. Čili lexikálbí, semanticka a syntaxní analýza. Pak performance analýza a výstup do výstupního kódu podle pravidel. Taky to ani nejde hodnotit, protože kód je hodně dliuhý a je to navíc v JS.

 
Nahoru Odpovědět
15.10.2014 23:10
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 52.