parser grammar zaplangParser; options { tokenVocab = zaplangLexer; language = Python3; } // ============================================================================ // PUNTO DE ENTRADA DEL PROGRAMA // ============================================================================ unidadTraduccion : declaracionExterna* ; declaracionExterna : declaracionFuncion | declaracionVariable | declaracionEstruct | declaracionEnum ; // ============================================================================ // DECLARACIONES DE FUNCIONES // ============================================================================ declaracionFuncion : tipoRetorno identificadorFuncion ParenIzq listaParametros? ParenDer bloque ; tipoRetorno : especificadorTipo | Vacio ; identificadorFuncion : Identificador ; listaParametros : declaracionParametro (Coma declaracionParametro)* ; declaracionParametro : especificadorTipo Identificador | especificadorTipo Identificador CorcheteIzq ConstanteEntera CorcheteDer ; // ============================================================================ // ESPECIFICADORES DE TIPO // ============================================================================ especificadorTipo : tipoBasico (CorcheteIzq ConstanteEntera? CorcheteDer)* | tipoEstructurado (CorcheteIzq ConstanteEntera? CorcheteDer)* ; tipoBasico : Ent | Doble | Flot | Carac | ConFirma | SinFirma | puntero ; puntero : Estrella | Estrella Estrella | Estrella Estrella Estrella ; tipoEstructurado : Estruct Identificador | Enum Identificador ; // ============================================================================ // DECLARACIONES DE ESTRUCTURAS // ============================================================================ declaracionEstruct : Estruct Identificador LlaveIzq miembroEstruct* LlaveDer PuntoYComa ; miembroEstruct : especificadorTipo Identificador PuntoYComa | especificadorTipo Identificador CorcheteIzq ConstanteEntera CorcheteDer PuntoYComa ; // ============================================================================ // DECLARACIONES DE ENUMERACIONES // ============================================================================ declaracionEnum : Enum Identificador LlaveIzq listaEnumeradores LlaveDer PuntoYComa ; listaEnumeradores : enumerador (Coma enumerador)* ; enumerador : Identificador | Identificador Asignar ConstanteEntera ; // ============================================================================ // DECLARACIONES DE VARIABLES Y ASIGNACIONES // ============================================================================ declaracionVariable : especificadorTipo inicializadorVariable (Coma inicializadorVariable)* PuntoYComa ; inicializadorVariable : Identificador | Identificador Asignar inicializador | Identificador CorcheteIzq ConstanteEntera CorcheteDer | Identificador CorcheteIzq ConstanteEntera CorcheteDer Asignar inicializadorArreglo ; inicializador : asignacionExpresion ; inicializadorArreglo : LlaveIzq listaInitializers? LlaveDer ; listaInitializers : asignacionExpresion (Coma asignacionExpresion)* ; // ============================================================================ // SENTENCIAS // ============================================================================ sentencia : sentenciaCompuesta | sentenciaDeclaracion | sentenciaExpresion | sentenciaSeleccion | sentenciaIteracion | sentenciaSalto ; sentenciaCompuesta : LlaveIzq sentencia* LlaveDer ; sentenciaDeclaracion : declaracionVariable ; sentenciaExpresion : expresion PuntoYComa | PuntoYComa ; sentenciaSeleccion : Si ParenIzq expresion ParenDer sentencia | Si ParenIzq expresion ParenDer sentencia Sino sentencia | Caso Bul LlaveIzq casoEtiqueta* etiquetaPorDef? LlaveDer ; casoEtiqueta : Caso constanteExpresion DosPuntos sentencia* ; etiquetaPorDef : Pordef DosPuntos sentencia* ; sentenciaIteracion : Mientras ParenIzq expresion ParenDer sentencia | Por ParenIzq sentenciaExpresion? PuntoYComa expresion? PuntoYComa expresion? ParenDer sentencia ; sentenciaSalto : Retornar expresion? PuntoYComa | Fin PuntoYComa | Interrup PuntoYComa ; bloque : LlaveIzq declaracionVariable* sentencia* LlaveDer | sentencia ; // ============================================================================ // EXPRESIONES // ============================================================================ expresion : asignacionExpresion | expresion Coma asignacionExpresion ; asignacionExpresion : expresionCondicional | expresionUnaria operadorAsignacion asignacionExpresion ; operadorAsignacion : Asignar | MasAsignacion | MenosAsignacion | EstrellaAsignacion | DivAsignacion | ModAsignacion | DesplazIzqAsignacion | DesplazDerAsignacion | YAsignacion | XorAsignacion | OAsignacion ; expresionCondicional : expresionLogicaO | expresionLogicaO Pregunta expresion DosPuntos expresionCondicional ; expresionLogicaO : expresionLogicaY (OO expresionLogicaY)* ; expresionLogicaY : expresionIgualacion (YY expresionIgualacion)* ; expresionIgualacion : expresionRelacional ((Igual | Diferente) expresionRelacional)* ; expresionRelacional : expresionDesplazamiento ((MenorQue | MayorQue | MenorOIgualQue | MayorOIgualQue) expresionDesplazamiento)* ; expresionDesplazamiento : expresionAditiva ((DesplazIzq | DesplazDer) expresionAditiva)* ; expresionAditiva : expresionMultiplicativa ((Mas | Menos) expresionMultiplicativa)* ; expresionMultiplicativa : expresionUnaria ((Estrella | Div | Mod) expresionUnaria)* ; expresionUnaria : operadorUnario expresionUnaria | expresionPostfija ; operadorUnario : Y | Estrella | Mas | Menos | Complemento | Not | MasMas | MenosMenos ; expresionPostfija : expresionPrimaria | expresionPostfija CorcheteIzq expresion CorcheteDer | expresionPostfija ParenIzq listaArgumentos? ParenDer | expresionPostfija Punto Identificador | expresionPostfija Flecha Identificador | expresionPostfija MasMas | expresionPostfija MenosMenos ; expresionPrimaria : Identificador | constanteExpresion | CadenaLiteral | ParenIzq expresion ParenDer | ParenIzq especificadorTipo ParenDer expresionUnaria ; constanteExpresion : ConstanteEntera | ConstanteFlotante | ConstanteCaracteres | Verdadero | Falso ; listaArgumentos : asignacionExpresion (Coma asignacionExpresion)* ; // ============================================================================ // REGLAS AUXILIARES // ============================================================================ // Palabra clave utilizada para marcar puntos de entrada opcionales marcaPunto : Bul ;