Syntaktická analýza.

Ciele

  1. Precvičiť základné vlastnosti gramatík.
  2. Precvičiť určovanie množín FIRST a FOLLOW
  3. 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:

  1. Vymenujte terminály a neterminály.
  2. Vymenujte aspoň štyri príklady reťazcov jazyka definovaného danou gramatikou.
  3. Nakreslite odvodzovací strom pre čiastočnú deriváciu $$S \Rightarrow xyyA$$
  4. Je táto čiastočná derivácia ľavá alebo pravá?
  5. 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(-) a FOLLOW(-) pre neterminály A, 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.