Análisis Sintáctico LL(1)

Fase 2
Análisis Sintáctico

Escribe código en el editor y pulsa Analizar o Ejecutar para ver la simulación aquí.

¿Qué es el análisis sintáctico?

El análisis sintáctico verifica que la secuencia de tokens producida por el lexer forme construcciones gramaticalmente válidas según la gramática del lenguaje. El resultado es un Árbol de Sintaxis Abstracta (AST) que representa la estructura jerárquica del programa.

¿Qué es LL(1)?

LL(1) significa que el parser lee la entrada de izquierda a derecha (Left to right), produce una derivación por la izquierda (Leftmost) y usa 1 token de anticipación para decidir qué producción aplicar.

Gramática de Slang

Los símbolos No-terminales representan construcciones sintácticas y los terminales son tokens concretos del lenguaje.

No-TerminalProducciones
Programa
ProgramaListaElementosEOF
ListaElementos
ListaElementosElementoListaElementosListaElementosε
Elemento
ElementoDeclaracionVariableElementoDeclaracionFuncionElementoSentenciaNoVar
Sentencia
SentenciaDeclaracionVariableSentenciaSentenciaNoVar
SentenciaNoVar
SentenciaNoVarSentenciaIfSentenciaNoVarSentenciaWhileSentenciaNoVarSentenciaForSentenciaNoVarSentenciaReturnSentenciaNoVarSentenciaIDENT
DeclaracionVariable
DeclaracionVariableLETIDENTIFICADORDOS_PUNTOSTipoIGUALExpresionPUNTO_COMA
DeclaracionFuncion
DeclaracionFuncionFUNCIDENTIFICADORPAREN_IZQListaParametrosPAREN_DERDOS_PUNTOSTipoBloque
Bloque
BloqueLLAVE_IZQListaSentenciasLLAVE_DER
ListaSentencias
ListaSentenciasSentenciaListaSentenciasListaSentenciasε
ListaParametros
ListaParametrosParametroRestoParametrosListaParametrosε
RestoParametros
RestoParametrosCOMAParametroRestoParametrosRestoParametrosε
Parametro
ParametroIDENTIFICADORDOS_PUNTOSTipo
Tipo
TipoTIPO_NUMBERTipoTIPO_STRINGTipoTIPO_BOOLEANTipoTIPO_VOID
SentenciaIf
SentenciaIfIFPAREN_IZQExpresionPAREN_DERBloqueParteElse
ParteElse
ParteElseELSEBloqueParteElseε
SentenciaWhile
SentenciaWhileWHILEPAREN_IZQExpresionPAREN_DERBloque
SentenciaFor
SentenciaForFORPAREN_IZQDeclaracionVariableExpresionPUNTO_COMAIDENTIFICADORIGUALExpresionPAREN_DERBloque
SentenciaReturn
SentenciaReturnRETURNExpresionOpcionalPUNTO_COMA
ExpresionOpcional
ExpresionOpcionalExpresionExpresionOpcionalε
SentenciaIDENT
SentenciaIDENTIDENTIFICADORPostIDENTPUNTO_COMA
PostIDENT
PostIDENTIGUALExpresionPostIDENTPAREN_IZQListaArgumentosPAREN_DER
ListaArgumentos
ListaArgumentosExpresionRestoArgumentosListaArgumentosε
RestoArgumentos
RestoArgumentosCOMAExpresionRestoArgumentosRestoArgumentosε
Expresion
ExpresionExpOr
ExpOr
ExpOrExpAndContinuacionOr
ContinuacionOr
ContinuacionOrORExpAndContinuacionOrContinuacionOrε
ExpAnd
ExpAndExpIgualdadContinuacionAnd
ContinuacionAnd
ContinuacionAndANDExpIgualdadContinuacionAndContinuacionAndε
ExpIgualdad
ExpIgualdadExpRelacionalContinuacionIgualdad
ContinuacionIgualdad
ContinuacionIgualdadOpIgualdadExpRelacionalContinuacionIgualdadContinuacionIgualdadε
OpIgualdad
OpIgualdadIGUAL_IGUALOpIgualdadDIFERENTE
ExpRelacional
ExpRelacionalExpAditivaContinuacionRelacional
ContinuacionRelacional
ContinuacionRelacionalOpRelacionalExpAditivaContinuacionRelacionalContinuacionRelacionalε
OpRelacional
OpRelacionalMENOROpRelacionalMAYOROpRelacionalMENOR_IGUALOpRelacionalMAYOR_IGUAL
ExpAditiva
ExpAditivaExpMultContinuacionAditiva
ContinuacionAditiva
ContinuacionAditivaOpAditivoExpMultContinuacionAditivaContinuacionAditivaε
OpAditivo
OpAditivoMASOpAditivoMENOS
ExpMult
ExpMultExpUnariaContinuacionMult
ContinuacionMult
ContinuacionMultOpMultExpUnariaContinuacionMultContinuacionMultε
OpMult
OpMultASTERISCOOpMultDIAGONAL
ExpUnaria
ExpUnariaMENOSExpUnariaExpUnariaNOExpUnariaExpUnariaPrimario
Primario
PrimarioNUMEROPrimarioCADENAPrimarioVERDADEROPrimarioFALSOPrimarioIDENTIFICADORPostfijoPrimarioPAREN_IZQExpresionPAREN_DER
Postfijo
PostfijoPAREN_IZQListaArgumentosPAREN_DERPostfijoε

Conjuntos FIRST

FIRST(A) es el conjunto de terminales que pueden aparecer al inicio de cualquier cadena derivable de A.

No-TerminalFIRST
Programa{ EOF, LET, FUNC, IF, WHILE, FOR, RETURN, IDENTIFICADOR }
ListaElementos{ LET, FUNC, IF, WHILE, FOR, RETURN, IDENTIFICADOR, ε }
Elemento{ LET, FUNC, IF, WHILE, FOR, RETURN, IDENTIFICADOR }
Sentencia{ LET, IF, WHILE, FOR, RETURN, IDENTIFICADOR }
SentenciaNoVar{ IF, WHILE, FOR, RETURN, IDENTIFICADOR }
DeclaracionVariable{ LET }
DeclaracionFuncion{ FUNC }
Bloque{ LLAVE_IZQ }
ListaSentencias{ LET, IF, WHILE, FOR, RETURN, IDENTIFICADOR, ε }
ListaParametros{ IDENTIFICADOR, ε }
RestoParametros{ COMA, ε }
Parametro{ IDENTIFICADOR }
Tipo{ TIPO_NUMBER, TIPO_STRING, TIPO_BOOLEAN, TIPO_VOID }
SentenciaIf{ IF }
ParteElse{ ELSE, ε }
SentenciaWhile{ WHILE }
SentenciaFor{ FOR }
SentenciaReturn{ RETURN }
ExpresionOpcional{ MENOS, NO, NUMERO, CADENA, VERDADERO, FALSO, IDENTIFICADOR, PAREN_IZQ, ε }
SentenciaIDENT{ IDENTIFICADOR }
PostIDENT{ IGUAL, PAREN_IZQ }
ListaArgumentos{ MENOS, NO, NUMERO, CADENA, VERDADERO, FALSO, IDENTIFICADOR, PAREN_IZQ, ε }
RestoArgumentos{ COMA, ε }
Expresion{ MENOS, NO, NUMERO, CADENA, VERDADERO, FALSO, IDENTIFICADOR, PAREN_IZQ }
ExpOr{ MENOS, NO, NUMERO, CADENA, VERDADERO, FALSO, IDENTIFICADOR, PAREN_IZQ }
ContinuacionOr{ OR, ε }
ExpAnd{ MENOS, NO, NUMERO, CADENA, VERDADERO, FALSO, IDENTIFICADOR, PAREN_IZQ }
ContinuacionAnd{ AND, ε }
ExpIgualdad{ MENOS, NO, NUMERO, CADENA, VERDADERO, FALSO, IDENTIFICADOR, PAREN_IZQ }
ContinuacionIgualdad{ IGUAL_IGUAL, DIFERENTE, ε }
OpIgualdad{ IGUAL_IGUAL, DIFERENTE }
ExpRelacional{ MENOS, NO, NUMERO, CADENA, VERDADERO, FALSO, IDENTIFICADOR, PAREN_IZQ }
ContinuacionRelacional{ MENOR, MAYOR, MENOR_IGUAL, MAYOR_IGUAL, ε }
OpRelacional{ MENOR, MAYOR, MENOR_IGUAL, MAYOR_IGUAL }
ExpAditiva{ MENOS, NO, NUMERO, CADENA, VERDADERO, FALSO, IDENTIFICADOR, PAREN_IZQ }
ContinuacionAditiva{ MAS, MENOS, ε }
OpAditivo{ MAS, MENOS }
ExpMult{ MENOS, NO, NUMERO, CADENA, VERDADERO, FALSO, IDENTIFICADOR, PAREN_IZQ }
ContinuacionMult{ ASTERISCO, DIAGONAL, ε }
OpMult{ ASTERISCO, DIAGONAL }
ExpUnaria{ MENOS, NO, NUMERO, CADENA, VERDADERO, FALSO, IDENTIFICADOR, PAREN_IZQ }
Primario{ NUMERO, CADENA, VERDADERO, FALSO, IDENTIFICADOR, PAREN_IZQ }
Postfijo{ PAREN_IZQ, ε }

Conjuntos FOLLOW

FOLLOW(A) es el conjunto de terminales que pueden aparecer inmediatamente después de A.

No-TerminalFOLLOW
Programa{ EOF }
ListaElementos{ EOF }
Elemento{ LET, FUNC, IF, WHILE, FOR, RETURN, IDENTIFICADOR, EOF }
Sentencia{ LET, IF, WHILE, FOR, RETURN, IDENTIFICADOR, LLAVE_DER }
SentenciaNoVar{ LET, FUNC, IF, WHILE, FOR, RETURN, IDENTIFICADOR, EOF, LLAVE_DER }
DeclaracionVariable{ LET, FUNC, IF, WHILE, FOR, RETURN, IDENTIFICADOR, EOF, MENOS, NO, NUMERO, CADENA, VERDADERO, FALSO, PAREN_IZQ, LLAVE_DER }
DeclaracionFuncion{ LET, FUNC, IF, WHILE, FOR, RETURN, IDENTIFICADOR, EOF }
Bloque{ LET, FUNC, IF, WHILE, FOR, RETURN, IDENTIFICADOR, EOF, ELSE, LLAVE_DER }
ListaSentencias{ LLAVE_DER }
ListaParametros{ PAREN_DER }
RestoParametros{ PAREN_DER }
Parametro{ COMA, PAREN_DER }
Tipo{ IGUAL, LLAVE_IZQ, COMA, PAREN_DER }
SentenciaIf{ LET, FUNC, IF, WHILE, FOR, RETURN, IDENTIFICADOR, EOF, LLAVE_DER }
ParteElse{ LET, FUNC, IF, WHILE, FOR, RETURN, IDENTIFICADOR, EOF, LLAVE_DER }
SentenciaWhile{ LET, FUNC, IF, WHILE, FOR, RETURN, IDENTIFICADOR, EOF, LLAVE_DER }
SentenciaFor{ LET, FUNC, IF, WHILE, FOR, RETURN, IDENTIFICADOR, EOF, LLAVE_DER }
SentenciaReturn{ LET, FUNC, IF, WHILE, FOR, RETURN, IDENTIFICADOR, EOF, LLAVE_DER }
ExpresionOpcional{ PUNTO_COMA }
SentenciaIDENT{ LET, FUNC, IF, WHILE, FOR, RETURN, IDENTIFICADOR, EOF, LLAVE_DER }
PostIDENT{ PUNTO_COMA }
ListaArgumentos{ PAREN_DER }
RestoArgumentos{ PAREN_DER }
Expresion{ PUNTO_COMA, PAREN_DER, COMA }
ExpOr{ PUNTO_COMA, PAREN_DER, COMA }
ContinuacionOr{ PUNTO_COMA, PAREN_DER, COMA }
ExpAnd{ OR, PUNTO_COMA, PAREN_DER, COMA }
ContinuacionAnd{ OR, PUNTO_COMA, PAREN_DER, COMA }
ExpIgualdad{ AND, OR, PUNTO_COMA, PAREN_DER, COMA }
ContinuacionIgualdad{ AND, OR, PUNTO_COMA, PAREN_DER, COMA }
OpIgualdad{ MENOS, NO, NUMERO, CADENA, VERDADERO, FALSO, IDENTIFICADOR, PAREN_IZQ }
ExpRelacional{ IGUAL_IGUAL, DIFERENTE, AND, OR, PUNTO_COMA, PAREN_DER, COMA }
ContinuacionRelacional{ IGUAL_IGUAL, DIFERENTE, AND, OR, PUNTO_COMA, PAREN_DER, COMA }
OpRelacional{ MENOS, NO, NUMERO, CADENA, VERDADERO, FALSO, IDENTIFICADOR, PAREN_IZQ }
ExpAditiva{ MENOR, MAYOR, MENOR_IGUAL, MAYOR_IGUAL, IGUAL_IGUAL, DIFERENTE, AND, OR, PUNTO_COMA, PAREN_DER, COMA }
ContinuacionAditiva{ MENOR, MAYOR, MENOR_IGUAL, MAYOR_IGUAL, IGUAL_IGUAL, DIFERENTE, AND, OR, PUNTO_COMA, PAREN_DER, COMA }
OpAditivo{ MENOS, NO, NUMERO, CADENA, VERDADERO, FALSO, IDENTIFICADOR, PAREN_IZQ }
ExpMult{ MAS, MENOS, MENOR, MAYOR, MENOR_IGUAL, MAYOR_IGUAL, IGUAL_IGUAL, DIFERENTE, AND, OR, PUNTO_COMA, PAREN_DER, COMA }
ContinuacionMult{ MAS, MENOS, MENOR, MAYOR, MENOR_IGUAL, MAYOR_IGUAL, IGUAL_IGUAL, DIFERENTE, AND, OR, PUNTO_COMA, PAREN_DER, COMA }
OpMult{ MENOS, NO, NUMERO, CADENA, VERDADERO, FALSO, IDENTIFICADOR, PAREN_IZQ }
ExpUnaria{ ASTERISCO, DIAGONAL, MAS, MENOS, MENOR, MAYOR, MENOR_IGUAL, MAYOR_IGUAL, IGUAL_IGUAL, DIFERENTE, AND, OR, PUNTO_COMA, PAREN_DER, COMA }
Primario{ ASTERISCO, DIAGONAL, MAS, MENOS, MENOR, MAYOR, MENOR_IGUAL, MAYOR_IGUAL, IGUAL_IGUAL, DIFERENTE, AND, OR, PUNTO_COMA, PAREN_DER, COMA }
Postfijo{ ASTERISCO, DIAGONAL, MAS, MENOS, MENOR, MAYOR, MENOR_IGUAL, MAYOR_IGUAL, IGUAL_IGUAL, DIFERENTE, AND, OR, PUNTO_COMA, PAREN_DER, COMA }

Recuperación de errores por modo pánico

Cuando el parser encuentra un token inesperado, reporta el error y aplica modo pánico: descarta tokens hasta encontrar un token ancla.

;ifwhileforfuncreturnlet}EOF