c) fragmento de código modificado:
def _advance(self):
self.tok = self.nexttok1 # El token actual ahora es el siguiente anticipado.
self.nexttok1 = self.nexttok2 # Actualizamos el primer token anticipado.
self.nexttok2 = next(self.tokens, None) # Leemos el segundo token anticipado.
Agregamos el campo nexttok2 que se usa cuando necesitamos mirar dos tokens
hacia adelante, esto permite que el analizador trabaje con una mirada de dos
tokens sin romper la lógica básica del diseño.
Fragmento de código modificado:
def factor(self):
'''
factor : IDENT | NUMBER | ( expression )
'''
if self._accept('IDENT'):
return Identifier(self.tok.value)
elif self._accept('NUMBER'):
return Number(float(self.tok.value))
elif self.nexttok1 and self.nexttok2 and self.nexttok1.type == '(' and
self.nexttok2.type == 'NUMBER':
# Ejemplo: Determinamos que viene una expresión basada en los dos
siguientes tokens
self._advance() # Consumimos '('
expr = self.expression()
self._expect(')') # Esperamos ')'
return expr
else:
raise SyntaxError('Esperando IDENT, NUMBER o (')
Se realizo y agrego los siguientes cambios
_advance mantiene siempre actualizados los tokens tok, nexttok1 y nexttok2.
_accept y _expect siguen funcionando con el próximo token inmediato (nexttok1).
d) Podemos apreciar que en la jerarquías de las gramáticas, las gramáticas LL(k)
están dentro de las gramáticas LR(k), con esto dicho y agregando de que ya
confirmamos que la gramática factorizada a la izquierda era una gramática LL(2)
significa que la gramática también se puede es una gramática LR(2)
e) primero verificamos que la gramática no es ambigua, lo cual podemos decir que
no tiene ambigüedades debido a que es una LL(2) que tienen como característica
que no son ambiguas por construcción ya que como utiliza dos símbolos de
anticipación toma decisiones únicas y deterministas, agregando que la
recursividad no se encuentra a la izquierda lo que ayuda a que no haya
ambigüedad en las decisiones, con todo esto dicho aseguramos de que ninguna
cadena tenga dos árboles de análisis diferentes.