/
Nolae.g
50 lines (50 loc) · 1.78 KB
/
Nolae.g
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
grammar Nolae;
options {language=Cpp;}
//Tokens
NUMERO : ('+'|'-') ? ('0'..'9')+ ('.' '0'..'9') ?;
IDENTIFICADOR
: (('a'..'z')|('A'..'Z')) (('a'..'z')|('A'..'Z')|'0'..'9')*;
TEXTO : '\"' ('a'..'z'|'A'..'Z'|'0'..'9'|' ')* '\"';
CARACTER: '\'' ('a'..'z'|'A'..'Z'|'0'..'9'|' ') '\'';
FINLINEA: '\r' ? '\n' {skip();};
//Producciones
programa: funcion* 'inicio' instruccion* 'fin';
funcion
: (tipo|'proceso') IDENTIFICADOR '(' listaparametros? ')' bloque;
listaparametros: parametro (',' parametro)*;
parametro
: tipo IDENTIFICADOR ('=' (NUMERO|CARACTER|TEXTO))?;
instruccion
: iImprimir|iPedir|iAsignar|iCrearVariable|iSi|iMientras|iPara|iHaga|iSeleccion|iSalir|iContinuar|iRetornar;
iImprimir
: 'imprimir' (TEXTO|CARACTER|NUMERO|IDENTIFICADOR) ';' ;
iPedir : 'pedir' IDENTIFICADOR ';';
iCrearVariable
: 'variable' tipo IDENTIFICADOR ('=' (TEXTO|NUMERO|CARACTER))? ';';
tipo : ('real'|'caracter'|'booleana'|'entera');
iAsignar: IDENTIFICADOR '=' expresion ';';
expresion
: suma (('+'|'-') suma)*;
suma : producto (('*'|'/') producto)*;
producto: proposicion (('&&'|'||') proposicion)*;
proposicion
: '!'? comparacion;
comparacion: factor (('>'|'>='|'<'|'<='|'=='|'!=') factor)? ;
factor : (CARACTER|NUMERO|IDENTIFICADOR);
iSi : 'si' '(' expresion ')' 'entonces' bloque sino;
sino : ('sino' bloque)?;
bloque : (instruccion| ('{' (instruccion)* '}'));
iMientras
: 'mientras' '(' expresion ')' bloque;
iHaga : 'haga' bloque 'mientras' '(' expresion ')' ';';
iPara : 'para' '(' (iCrearVariable|iAsignar) expresion ';' (IDENTIFICADOR '=' expresion) ')' bloque;
iSeleccion
: 'seleccion' '(' IDENTIFICADOR ')' bloqueCasos ;
bloqueCasos
: '{' (caso)* '}';
caso : (('caso' (NUMERO|CARACTER)) | 'sino') bloque;
iSalir : 'salir' ';';
iContinuar
: 'continuar' ';';
iRetornar
: 'retornar' expresion? ';' ;