Gramática de AymaraLang (AruQillqa)¶
Este documento describe la gramática actual del lenguaje AymaraLang utilizando
notación EBNF y resume los tokens reconocidos por el compilador. Las reglas de
tokenización están implementadas en compiler/lexer/lexer.cpp.
Tokens léxicos¶
flowchart LR
A[Texto .aym] --> B[Lexer]
B --> C[Tokens]
C --> D[Parser]
D --> E[AST]
Palabras clave¶
| Token | Lexema(s) aceptado(s) | Uso sintáctico |
|---|---|---|
KeywordStart |
qallta |
Inicio del programa |
KeywordEnd |
tukuya |
Fin del programa |
KeywordDeclare |
yatiya |
Declaración de variables |
KeywordPrint |
qillqa |
Sentencia de impresión |
KeywordIf |
suti, jisa |
Condicional |
KeywordElse |
jani, maysatxa |
Rama alternativa |
KeywordWhile |
kunawsati, ukhakamaxa |
Bucle while |
KeywordFor |
sapüru, taki |
Bucle for |
KeywordBreak |
p'akhiña |
Salir de un bucle |
KeywordContinue |
sarantaña |
Continuar bucle |
KeywordFunc |
lurawi |
Definición de funciones |
KeywordReturn |
kuttaya |
Retorno |
KeywordImport |
apnaq |
Importación |
KeywordEnum |
siqicha, enum |
Enumeraciones |
KeywordMatch |
khiti, match |
Selección por patrón |
KeywordCase |
kuna, case |
Rama de match |
KeywordDefault |
yaqha, default |
Rama por defecto |
KeywordTry |
yant'aña |
Bloque try |
KeywordCatch |
katjaña |
Bloque catch |
KeywordFinally |
tukuyawi |
Bloque finally |
KeywordThrow |
pantja |
Lanzar excepción |
KeywordClass |
kasta |
Definición de clases |
KeywordNew |
machaqa |
Crear instancia |
KeywordThis |
aka |
Referencia al objeto actual |
KeywordExtends |
jila |
Herencia |
KeywordOverride |
jikxata |
Sobrescribir método |
KeywordPrivate |
sapa |
Modificador privado |
KeywordPublic |
taqi |
Modificador público |
KeywordStatic |
sapakasta |
Modificador estático |
KeywordGetter |
uñt'aya |
Nombre reservado para getter |
KeywordSetter |
chura |
Nombre reservado para setter |
KeywordSuper |
jilaaka |
Referencia al padre |
KeywordTypeNumber |
jakhüwi |
Tipo numérico |
KeywordTypeString |
aru |
Tipo cadena |
KeywordTypeBool |
chiqa |
Tipo booleano |
KeywordTypeList |
listaña, t'aqa |
Tipo lista |
KeywordTypeMap |
mapa |
Tipo mapa (Español) |
KeywordTrue |
utji, chiqa |
Literal verdadero |
KeywordFalse |
janiutji, k'ari |
Literal falso |
Operadores y delimitadores¶
Los símbolos se mantienen sin cambios:
- Agrupación:
(),{},[] - Fin de sentencia:
; - Separador:
, - Asignación:
= - Dos puntos:
: - Operadores:
+ - * / % ^ - Comparación:
== != < <= > >= - Lógicos:
&& || ! - Rango en
case:..(solo enkhiti/match) - Comentarios:
//y/* */
Literales¶
Number: números enteros decimales con soporte0xy0b.String: cadenas entre comillas dobles o simples con escapes (\n,\t,\",\', etc.).
Notación EBNF utilizada¶
a*indica repetición de cero o más veces.a+indica una o más repeticiones.[a]marca un elemento opcional.a | brepresenta alternativas.
Gramática sintáctica¶
programa = [ "qallta" ] { sentencia } [ "tukuya" ] ;
sentencia = decl | asigna | if | while | for | func_def | class_def
| enum_def | match | retorno | salida | continuar | imprimir | importar
| try | throw | bloque | ";" ;
bloque = "{" { sentencia } "}" ;
decl = "yatiya" tipo id [ "=" expr ] ";" ;
tipo = "jakhüwi" | "aru" | "chiqa" | "listaña" | "t'aqa" | "mapa" | id ;
asigna = id "=" expr ";" ;
if = ("suti" | "jisa") "(" cond ")" bloque [ ("jani" | "maysatxa") bloque ] ;
while = ("kunawsati" | "ukhakamaxa") "(" cond ")" bloque ;
for = ("sapüru" | "taki") "(" [decl|asigna] ";" [cond] ";" [asigna_np] ")" bloque ;
asigna_np = id "=" expr ;
func_def = "lurawi" id "(" [ params ] ")" [ ":" tipo ] bloque ;
params = param { "," param } ;
param = tipo id ;
class_def = "kasta" id [ "jila" id ] "{" { class_member } "}" ;
class_member = { modificador } ( decl | metodo | ctor ) ;
modificador = "sapa" | "taqi" | "sapakasta" | "jikxata" ;
metodo = "lurawi" id "(" [ params ] ")" [ ":" tipo ] bloque ;
ctor = "qallta" "(" [ params ] ")" bloque ;
enum_def = ("siqicha" | "enum") id "{" enum_item { "," enum_item } "}" [ ";" ] ;
enum_item = id [ "=" expr ] ;
match = ("khiti" | "match") "(" expr ")" "{"
{ ("kuna" | "case") case_valores ":" bloque }
[ ("yaqha" | "default") ":" bloque ]
"}" [ ";" ] ;
case_valores = case_valor { "," case_valor } ;
case_valor = expr [ ".." expr ] ;
retorno = "kuttaya" [ expr ] ";" ;
salida = "p'akhiña" ";" ;
continuar = "sarantaña" ";" ;
throw = "pantja" "(" (str | id) [ "," str ] ")" ";" ;
try = "yant'aña" bloque { catch } [ finally ] ;
catch = "katjaña" "(" [ str "," ] id ")" bloque ;
finally = "tukuyawi" bloque ;
imprimir = "qillqa" "(" [ args ] ")" ";" ;
importar = "apnaq" "(" str ")" ";" ;
args = expr { "," expr } ;
cond = expr ;
expr = or ;
or = and { "||" and } ;
and = igualdad { "&&" igualdad } ;
igualdad = rel { ("==" | "!=") rel } ;
rel = suma { ("<" | "<=" | ">" | ">=") suma } ;
suma = multi { ("+" | "-") multi } ;
multi = unario { ("*" | "/" | "%") unario } ;
unario = [ "!" | "-" ] primario ;
primario = num | str | ("utji" | "chiqa") | ("janiutji" | "k'ari")
| "machaqa" id "(" [ args ] ")" | "aka" | "jilaaka"
| id | llamada | "(" expr ")" | lista ;
llamada = id "(" [ args ] ")" ;
lista = "[" [ args ] "]" ;
id = letra { letra | num | "_" } ;
num = digito { digito } ;
str = '\"' { caracter } '\"' | \"'\" { caracter } \"'\" ;
Anterior: Referencia del lenguaje | Siguiente: Arquitectura del compilador