-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathsyntaxDiagrams.txt
77 lines (67 loc) · 6.67 KB
/
syntaxDiagrams.txt
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/* Code to run on http://www.bottlecaps.de/rr/ui to get the syntax diagrams*/
Program ::= ProgramName f_loadVispiFunctions Hardware Vars Assign Functions 'genera cuádruplo ENDPROC y prepara el archivo de cuádruplos'
ProgramName ::= 'program' 'id' '\n' 'genera el GOTO main y guarda el nombre del programa'
Hardware ::= CamDeclaration InputsDeclaration OutputsDeclaration PwmDeclaration
CamDeclaration ::= ( 'CAM' ('webcam' | 'picam') ':' 'id' '\n' 'genera el cuádruplo CAM')?
InputsDeclaration ::= ( 'INPUT' f_savetype PinList '\n' )? 'genera los cuádruplos INPUT'
OutputsDeclaration ::= ( 'OUTPUT' f_savetype PinList '\n' )? 'genera los cuádruplos OUTPUT'
PwmDeclaration ::= ( 'PWM' f_savetype PinList '\n' )? 'genera los cuádruplos PWM'
PinList ::= 'c_int' ':' 'id' (',' 'c_int' ':' 'id')* 'guarda los id de pines como var. globales'
Vars ::= (f_checktab Tipo idList NEWLINE)+
idList ::= 'id' (',' 'id')* 'guarda los id en el dir. de proc. ya sea como locales o como globales y su tipo'
Tipo ::= ('bool' | 'int' | 'float' | 'char' | 'string' | 'image') f_saveType
Functions ::= ('def' F_Stage1 f_saveModule '(' F_Stage2 ')' ':' NEWLINE f_incTab Block f_endModule)*
F_Stage1 ::= (Tipo 'id' | 'void' f_setVoid ('id' | 'main'))
F_Stage2 ::= (Tipo 'id' f_addToParam (',' Tipo 'id' f_addToParam)* )?
Assign ::= (f_checkTab 'id' f_checkID '=' f_isAssign Expression NEWLINE f_generateEqual)+
Block ::= ('\t' f_addTab moreTabs Statement)+ 'decrementa la tabulación esperada en 1'
moreTabs ::= ( ('\t' f_addTab) | (NEWLINE '\t' f_addTab) )*
Statement ::= (Vars | Assign | f_checkTab Condition | f_checkTab DoCycle | Cycle | f_checkTab Funct NEWLINE | f_checkTab 'return' f_isReturn Expression f_return NEWLINE)? 'resetea la bandera de estatuto return'
Condition ::= 'if' f_isCondition Expression ':' f_endCondition NEWLINE f_incTab Block 'end' NEWLINE (f_checkTab 'else' f_popIf ':' NEWLINE f_incTab Block 'end' NEWLINE)? 'rellena la dirección destino del GOTOF del if'
Cycle ::= f_checkTab 'while' f_isCondition Expression ':' f_endCondition NEWLINE f_incTab Block 'end' NEWLINE 'Genera cuádruplo GOTO correspondiente al fin del while'
DoCycle ::= 'do' f_pushDo ':' NEWLINE f_incTab Block f_checkTab 'loop' f_isDoWhile f_isCondition Expression f_endCondition NEWLINE
Funct ::= 'id' f_checkProc '(' ( f_functCall Expression f_genParam f_functCall (',' Expression f_genParam 'verifica número de parámetros')* )? ')' 'genera cuádruplos GOSUB o CALL así como la asignación del valor de retorno de la función a una variable temporal, si es que no es void. Apaga la bandera functCall'
Expression ::= OrExp ('||' f_pushOperator OrExp f_popOrExp)*
OrExp ::= AndExp ('&&' f_pushOperator AndExp f_popAndExp)*
AndExp ::= NotExp
NotExp ::= BoolExp | (NOT f_pushOperator BoolExp f_popNotExp)
NEWLINE ::= '\n' f_resetTab
BoolExp ::= Exp (('>'|'<'|'>='|'<='|'!='|'==') Exp f_popComparation)?
Exp ::= Term ( ('+'|'-') f_pushOperator Term f_popTerm)*
Term ::= Factor ( ('*'|'/'|'%') f_pushOperator Factor f_popFactor)*
Factor ::= '(' f_pushOperator Expression ')' f_popOperator | Cvar | Funct
Cvar ::= 'id' f_isID | ('c_int' | 'c_float' | 'c_bool' | 'c_string') f_isConst
f_loadVispiFunctions ::= 'carga las funciones predefinidas de nuestro lenguaje en el dir. de procedimientos'
f_saveType ::= 'guarda el tipo de dato correspondiente al HW o variable primitiva declarada para su uso futuro'
f_setVoid ::= 'guarda "void" en el tipo de dato'
f_saveModule ::= 'verifica si el id definido ya existe. Declara un nuevo procedimiento en el directorio'
f_addToParam ::= 'agrega el parametro declarado a su lugar en el dir. de procedimientos'
f_resetTab ::= 'reinicia el contador de tabs a 0'
f_incTab ::= 'incrementa en 1 la tabulación esperada a partir de este punto'
f_decTab ::= 'decrementa en 1 la tabulación esperada a partir de este punto'
f_endModule ::= 'guarda el tamaño de la funcion declarada, reinicia contadores de variables y genera el cuad. RET'
f_checkTab ::= 'verifica que el contador de tabs corresponda con lo esperado'
f_checkID ::= 'verifica que el id ya haya sido declarado como local o global. Si sí, inserta operando y tipo en sus pilas respectivas'
f_isAssign ::= 'enciende una bandera para saber que se procesa una asignación'
f_generateEqual ::= 'hace 2 pop de la pila de tipos y de operandos, verifica tipos y genera el cuádruplo de la asignación'
f_addTab ::= 'incrementa en 1 el contador de tabs y verifica que corresponda con la tabulación esperada'
f_return ::= 'marca error si hay return en función void. Verifica que el valor de retorno (top de pila) sea del tipo adecuado. Genera el cuádruplo RETURN'
f_isReturn ::= 'enciende una bandera que indica que el estatuto es un return'
f_isCondition ::= 'enciende una bandera para indicar que se está procesando una condición o ciclo. Si es del tipo while, se inserta el número de cuádruplo en pilaDeBranch'
f_popIf ::= 'dado que vino un else, genera el GOTO del final del if e inserta en una pilaDeBranch el número del siguiente cuádruplo'
f_pushDo ::= 'genera un cuádruplo DO que indica el inicio de un do..loop e inserta su número en la pilaDeBranch'
f_isDoWhile ::= 'enciende una bandera que indica que se está procesando un do..loop'
f_checkProc ::= 'verifica que el módulo llamado esté definido y genera el cuádruplo ERA'
f_genParam ::= 'dados los parámetros de la función, genera los cuádruplos PARAM verificando el tipo'
f_popOrExp ::= 'si la operación es || verifica tipos en el cubo semántico y genera el cuádruplo'
f_popAndExp ::= 'si la operación es && verifica tipos en el cubo semántico y genera el cuádruplo'
f_popNotExp ::= 'si la operación es ! verifica el tipo en el cubo semántico y genera el cuádruplo'
f_popComparation ::= 'si se hizo una comparación: verifica tipo en el cubo semántico, genera una temporal con el resultado (a la pilaOperandos) y genera el cuádruplo correspondiente'
f_popTerm ::= 'si la operación fue + o -: verifica tipos en el cubo semántico, genera una temporal con el resultado (a la pila pilaOperandos) y genera el cuádruplo'
f_popFactor ::= 'si es * / o % la operación: verifica tipos en el cubo semántico y genera el cuádruplo'
f_pushOperator ::= 'siempre que la bandera de condición esté apagada inserta el operador en su pila'
f_popOperator ::= 'hace pop del operador en la cima del stack'
f_isID ::= 'verifica que el id esté declarado como local o global'
f_isConst ::= 'guarda la constante en la tabla de constantes junto con su tipo y los inserta en la pila de operandos y tipos'
f_endCondition ::= 'verifica que tipo del operando en stack.top sea bool o int. Genera GOTOF y hace push a pilaDeBranch si es if o while, o hace pop a pilaDeBranch y genera GOTOT si es do'
f_functCall ::= 'enciende una bandera que indica que se procesa una llamada a función'