31 Jan 04:30 PM
CSCI 5100
\[ \begin{align*} G_1& \\ &\left. \begin{aligned} &S \rightarrow 0S1 \\ &S \rightarrow R \\ &R \rightarrow \varepsilon \end{aligned} \right\} \quad \text{(Substitution) Rules} \end{align*} \]
\[ \begin{aligned} &S \rightarrow 0S1 \\ &S \rightarrow R \\ &R \rightarrow \varepsilon \end{aligned} \]
\[ \begin{aligned} &S \rightarrow 0S1 \\ &S \rightarrow R \\ &R \rightarrow \varepsilon \end{aligned} \]
\[ \begin{aligned} &S \rightarrow 0S1 \\ &S \rightarrow R \\ &R \rightarrow \varepsilon \end{aligned} \]
\[ \begin{aligned} &S \rightarrow 0S1\quad|\quad R\\ &R \rightarrow \varepsilon \end{aligned} \]
\[ \begin{align*} C_1& \\ &\left. \begin{aligned} &B \rightarrow 0B1 \\ &B1 \rightarrow 1B \\ &0B \rightarrow 0B \end{aligned} \right. \end{align*} \]
\[ \begin{align*} C_2& \\ &\left. \begin{aligned} &S \rightarrow 0S \quad | \quad S1 \\ &R \rightarrow RR \end{aligned} \right. \end{align*} \]
\[ \begin{align*} G_2& \\ &\left. \begin{aligned} &E \rightarrow E+T \quad | \quad T\\ &T \rightarrow T\times F \quad | \quad F \\ &F \rightarrow ( E ) \quad | \quad a \end{aligned} \right. \end{align*} \]
\[ \begin{aligned} &V = \{ E, T, F \}\\ &\Sigma = \{+, \times, (, ), a \}\\ &R = \text{As shown}\\ &S = E \end{aligned} \]
\[ \begin{align*} G_2& \\ &\left. \begin{aligned} &E \rightarrow E+T \quad | \quad T\\ &T \rightarrow T\times F \quad | \quad F \\ &F \rightarrow ( E ) \quad | \quad a \end{aligned} \right. \end{align*} \]
\[ \begin{align*} G_3& \\ &\left. \begin{aligned} &E \rightarrow E+E \quad | \quad E \times E \quad | \quad ( E ) \quad | \quad a\\ \end{aligned} \right. \end{align*} \]
\[ \begin{align*} G_3& \\ &\left. \begin{aligned} &E \rightarrow E+E \quad | \quad E \times E \quad | \quad ( E ) \quad | \quad a\\ \end{aligned} \right. \end{align*} \]
from itertools import count # infinite iterator
from itertools import combinations_with_replacement as cwr
# define variables, so we can use them
rules = (
lambda s : s.replace("E", "E+E"),
lambda s : s.replace("E", "ExE"),
lambda s : s.replace("E", "(E)"),
lambda s : s.replace("E", "a")
)
trans = lambda fs, s: fs[0](trans(fs[1:], s)) if len(fs) else s
G_2 = (trans(fs,'E') for n in count() for fs in cwr(rules, n))
next(G_2), next(G_2), next(G_2)
('E', 'E+E', 'ExE')