Ciele
- Precvičiť základné vlastnosti gramatík.
- Precvičiť určovanie množín
FIRST
aFOLLOW
- Precvičiť typy odvodení a odvodzovacie stromy.
Úvod
Tematický zámer cvičenia je rozdelený do dvoch logických celkov. V prvej (teoretickej) časti cvičenia sa venuje čas precvičeniu a upevneniu vedomostí nadobudnutých na prednáške: určenie základných vlastností gramatík a vlastností z nej vyplývajúcich, určenie množín FIRST
a FOLLOW
potrebných vo fáze syntaktickej analýzy.
Postup
Krok 1
Úloha 1.1
Daná je nasledujúca gramatika:
$$\begin{array}{l} S \rightarrow AB \\ A \rightarrow xB ~|~ \varepsilon \\ B \rightarrow yA ~|~ zB \end{array}$$
Odpovedzde na nasledujúce otázky týkajúce sa uvedenej gramatiky:
- Vymenujte terminály a neterminály.
- Vymenujte aspoň štyri príklady reťazcov jazyka definovaného danou gramatikou.
- Nakreslite odvodzovací strom pre čiastočnú deriváciu $$S \Rightarrow xyyA$$
- Je táto čiastočná derivácia ľavá alebo pravá?
- Uveďte príklad čiastočnej derivácie z
S
v dvoch krokoch pomocou pravej derivácie.
Krok 2
Úloha 2.1
Daná je nasledujúca gramatika:
$$\begin{array}{l} A \rightarrow BC \\ B \rightarrow Ax ~|~ x ~|~ \varepsilon \\ C \rightarrow yC ~|~ y ~|~ \varepsilon \end{array}$$
Nájdite množiny
FIRST(-)
aFOLLOW(-)
pre neterminályA, B, C
.
Úloha 2.2
Daná je nasledujúca gramatika:
$$\begin{array}{l} Prog \rightarrow Stmt \\ Stmt \rightarrow \mathbf{if}~ Expr~ \mathbf{then}~ Block \\ Stmt \rightarrow \mathbf{while}~ Expr~ \mathbf{do}~ Block \\ Stmt \rightarrow Expr \mathbf{;} \\ Expr \rightarrow Term \Rightarrow \mathbf{id}\\ Expr \rightarrow \mathbf{isZero}~Term\\ Expr \rightarrow \mathbf{not}~Expr\\ Expr \rightarrow \mathbf{++}~\mathbf{id}\\ Expr \rightarrow \mathbf{--}~\mathbf{id}\\ Term \rightarrow \mathbf{id}\\ Term \rightarrow \mathbf{const}\\ Block \rightarrow Stmt\\ Block \rightarrow \left\{ Stmts \right\} \\ Stmts \rightarrow Stmt~Stmts\\ Stmts \rightarrow \varepsilon\\ \end{array}$$
Nájdite množiny FIRST(-)
a FOLLOW(-)
pre jednotlivé neterminály.
Krok 3
V tomto kroku navrhneme gramatiku pre implementáciu vreckovej kalkulačky aritmetických výrazov. Tento typ kalkulačky obvykle nezohľadňuje štandardné matematické priority operátorov, avšak môže obsahovať zátvorky.
Úloha 3.1
Zostrojte gramatiku pre vreckovú kalkulačku, v ktorej operátory sčítania, odčítania, násobenia (príp. celočíselného delenia) majú štandardnú asociatívnosť a rovnakú prioritu. Jazyk nech obsahuje aj zátvorky.
Nájdite dve rôzne najľavejšie odvodenia vety $$\mathbf{id}+\mathbf{id}*\mathbf{id}$$ a zostrojte príslušné odvodzovacie stromy.