Files
ZapLang/zaplangParser.g4
2026-05-07 18:01:06 -06:00

309 lines
7.0 KiB
ANTLR

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
;