Temas:
Bibliografía:
$G=(V,T,P,S)$
if
, int
, {
... )
IfStmt
, VarDecl
,
BlockExpr
)BlockExpr -> { CompoundStmt }
)<simbolo_no_terminal>
simbolo_terminal
<un_no_terminal> ::= <simbolos> generados
Derivación: aplicar producciones sucesivamente
<r> ::= <r> hijo_de <r>
<r> ::= <r> hermano_de <r>
<r> ::= nombre
Bart hijo_de Homero hermano_de Lisa
Estado | Producción | ¿Cuál? |
---|---|---|
<r> |
<r> ::= <r> hijo_de <r> |
1 |
<r> hijo_de <r> |
<r> ::= <r> hermano_de <r> |
2 |
<r> hijo_de <r> hermano_de <r> |
<r> ::= nombre |
1 |
nombre hijo_de <r> hermano_de <r> |
<r> ::= nombre |
1 |
nombre hijo_de nombre hermano_de <r> |
<r> ::= nombre |
1 |
nombre hijo_de nombre hermano_de nombre |
Bart hijo_de Homero hermano_de Lisa
Estado | Producción | ¿Cuál? |
---|---|---|
<r> |
<r> ::= <r> hermano_de <r> |
1 |
<r> hermano_de <r> |
<r> ::= <r> hijo_de <r> |
1 |
<r> hijo_de <r> hermano_de <r> |
<r> ::= nombre |
1 |
nombre hijo_de <r> hermano_de <r> |
<r> ::= nombre |
1 |
nombre hijo_de nombre hermano_de <r> |
<r> ::= nombre |
1 |
nombre hijo_de nombre hermano_de nombre |
familang original
<r> ::= <r> hijo_de <r> <r> ::= <r> hermano_de <r> <r> ::= nombre
No ambígua:
<r> ::= nombre hijo_de <r> <r> ::= <r> hermano_de nombre <r> ::= nombre
LL1 (no recursiva por izquierda):
<r> ::= nombre <r0> <r0> ::= <r0> ::= hijo_de <r> <r0> ::= hermano_de <r>
<r> ::= nombre <r0>
<r0> ::=
<r0> ::= hijo_de <r>
<r0> ::= hermano_de <r>
Maggie hermano_de : Lisa hijo_de : Homero y_de Marge y_de Bart hermano_de Maggie
Maggie hermano_de Lisa hermano_de Bart hijo_de: Homero hijo_de Abraham y_de Marge hermano_de Patty
Maggie hijo_de : Homero hijo de Abraham y_de Marge hermano_de : Patty y_de Selma
Luke hermano_de : Alex y_de Haley hijo_de : Phil hijo_de Frank y_de Claire hermano_de Mitchell hijo_de : Dede y_de Jay
Parser descendiente recursivo con stack explícito.
Desc rec | LL1 |
---|---|
Funciones | Derivaciones |
cola de tokens | cola de tokens |
callstack | Stack de estado |
if ó switch |
Tabla M $M \in V \times T \rightarrow P$ |
stack_estado=[símbolo_inicial]
cola=listado_de_tokens
while len(cola) > 0:
if cola[0]==stack_estado[0]:
cola.pop()
stack_estado.pop()
else:
produccion = M[
stack_estado[0],
cola[0]
]
stack_estado.push(
*produccion.lado_derecho
)
stack_estado=[símbolo_inicial]
cola=listado_de_tokens
def match():
cola.pop()
stack_estado.pop()
def apply(produccion):
stack_estado.push(
*produccion.lado_derecho
)
while len(cola) > 0:
if cola[0]==stack_estado[0]:
cola.pop()
stack_estado.pop()
else:
produccion = M[
stack_estado[0],
cola[0]
]
stack_estado.push(
*produccion.lado_derecho
)
stack_estado=[símbolo_inicial]
cola=listado_de_tokens
def match():
cola.pop()
stack_estado.pop()
def apply(produccion):
stack_estado.push(
*produccion.lado_derecho
)
while len(cola) > 0:
if cola[0]==stack_estado[0]:
match()
else:
apply(M[
stack_estado[0],
cola[0]
])
<r> ::= nombre <r0>
<r0> ::=
<r0> ::= hijo_de <r>
<r0> ::= hermano_de <r>
Maggie hermano_de : Lisa hijo_de : Homero y_de Marge y_de Bart hermano_de Maggie
Maggie hermano_de Lisa hermano_de Bart hijo_de: Homero hijo_de Abraham y_de Marge hermano_de Patty
Maggie hijo_de : Homero hijo de Abraham y_de Marge hermano_de : Patty y_de Selma
Luke hermano_de : Alex y_de Haley hijo_de : Phil hijo_de Frank y_de Claire hermano_de Mitchell hijo_de : Dede y_de Jay
A continuación, intervalo y laboratorio.