next up previous contents index PLPL moodlepserratamodulosperlmonksperldocapuntes LHPgoogleetsiiullpcgull
Sig: Construcción de las Tablas Sup: Construcción de las Tablas Ant: Construcción de las Tablas Err: Si hallas una errata ...


Los conjuntos de Primeros y Siguientes

Repasemos las nociones de conjuntos de Primeros y siguientes:

Definición 8.24.1   Dada una gramática $ G =(\Sigma,V,P,S)$ y un símbolo $ \alpha \in (V \cup \Sigma)^*$ se define el conjunto $ FIRST(\alpha)$ como:

$ FIRST(\alpha) = \left \{ b \in \Sigma : \alpha \stackrel{*}{\Longrightarrow} b \beta \right \}
\cup N(\alpha)$

donde:

$ N(\alpha) = \left \{ \begin{array}{ll}
\left \{ \epsilon \right \}& \mbox{si $...
...rightarrow} \epsilon$} \\
\emptyset & \mbox{en otro caso}
\end{array}\right. $

Definición 8.24.2   Dada una gramática $ G =(\Sigma,V,P,S)$ y una variable $ A \in V$ se define el conjunto $ FOLLOW(A)$ como:

$ FOLLOW(A) = \left \{ b \in \Sigma : \exists\ S \stackrel{*}{\Longrightarrow} \alpha A b \beta \right \} \cup E(A)$

donde

$ E(A) = \left \{ \begin{array}{ll}
\{ \$ \}& \mbox{si $S \stackrel{*}{\Longrightarrow} \alpha A$} \\
\emptyset & \mbox{en otro caso}
\end{array}\right. $

Algoritmo 8.24.1   Construcción de los conjuntos $ FIRST(X)$
  1. $ Si\ X \in \Sigma\ entonces\ FIRST(X) = {X}$
  2. $ Si\ X \rightarrow \epsilon\ entonces\ FIRST(X) = FIRST(X) \cup \{ \epsilon \}$
  3. $ Si X \in V \ y\ X \rightarrow Y_1 Y_2 \cdots Y_k \in P\ entonces$
        $\displaystyle i = 1;$  
        $\displaystyle do$  
        $\displaystyle \ \ FIRST(X) = FIRST(X) \cup FIRST(Y_i) - \{ \epsilon \};$  
        $\displaystyle \ \ i++;$  
        $\displaystyle mientras\ (\epsilon \in FIRST(Y_i)\ and\ (i \leq k))$  
        $\displaystyle si\ (\epsilon \in FIRST(Y_k)\ and\ i > k)\ FIRST(X) = FIRST(X) \cup \{ \epsilon \}$  

Este algoritmo puede ser extendido para calcular $ FIRST(\alpha)$ para $ \alpha = X_1 X_2 \cdots X_n \in (V \cup \Sigma)^*$ .

Algoritmo 8.24.2   Construcción del conjunto $ FIRST(\alpha)$
    $\displaystyle i = 1;$  
    $\displaystyle FIRST(\alpha) = \emptyset;$  
    $\displaystyle do$  
    $\displaystyle \ \ FIRST(\alpha) = FIRST(\alpha) \cup FIRST(X_i) - \{ \epsilon \};$  
    $\displaystyle \ \ i++;$  
    $\displaystyle mientras\ (\epsilon \in FIRST(X_i)\ and\ (i \leq n))$  
    $\displaystyle si\ (\epsilon \in FIRST(X_n)\ and\ i > n)\ FIRST(\alpha) = FIRST(X) \cup \{ \epsilon \}$  

Algoritmo 8.24.3   Construcción de los conjuntos $ FOLLOW(A)$ para las variables sintácticas $ A \in V$ :

Repetir los siguientes pasos hasta que ninguno de los conjuntos $ FOLLOW$ cambie:

  1. $ FOLLOW(S) = \{\$\} $ ($ \$$ representa el final de la entrada)
  2. $ Si\ A \rightarrow \alpha B \beta\ entonces$

    $\displaystyle FOLLOW(B) = FOLLOW(B) \cup (FIRST(\beta) - \{\epsilon\})$

  3. $ Si\ A \rightarrow \alpha B$ o bien $ A \rightarrow \alpha B \beta$ y $ \epsilon \in FIRST(\beta)$ entonces

    $\displaystyle FOLLOW(B) = FOLLOW(B) \cup FOLLOW(A)$


next up previous contents index PLPL moodlepserratamodulosperlmonksperldocapuntes LHPgoogleetsiiullpcgull
Sig: Construcción de las Tablas Sup: Construcción de las Tablas Ant: Construcción de las Tablas Err: Si hallas una errata ...
Casiano Rodríguez León
2012-05-22