SimplePASCAL es una adaptación del lenguaje de programación PASCAL para esta herramienta. Su objetivo es tener las construcciones sintácticas necesarias para enseñar los conceptos de la tabla de símbolos. Por ello, se han eliminado ciertas partes, y añadido otras.
Algunas de las partes que se han eliminado son las sentencias: USE, CASE o FOR. En cuanto a los añadidos, ahora se permiten definir ámbitos anónimos. Para definir estos bloques basta con utilizar el esquema:
declaraciones BEGIN sentencias END
A continuación se muestra la gramática de SimplePASCAL.
programa ::= <PROGRAM> id [ "(" id ")" ] ";" bloque "."
bloque ::= declaracion <BEGIN> sentencia ( ";" sentencia )* <END>
bloqueEjecutable ::= ( defCte | defTip | defVar)* <BEGIN> sentencia ( ";" sentencia )* <END>
declaracion ::= ( defCte | defTip | defVar | defSubprograma )*
defSubprograma ::= ( defProcedimiento | defFuncion )
defCte ::= <CONST> (unaConst ";")+
unaConst ::= id "=" valorSimple
defTip ::= <TYPE> (unTipo ";")+
unTipo ::= <ID> "=" tipoEstr
tipoEstr ::= ( estrTab | estrReg )
estrTab ::= <ARRAY> "[" valorSimple ".." valorSimple "]" <OF> <ID>
estrReg ::= <RECORD> listaVar ( ";" listaVar )* <END>
defVar ::= <VAR> ( listaVar ";" )+
defProcedimiento ::= <PROCEDURE> id [ "(" stactions = parFormales ")" ] ";" bloque ";"
defFuncion ::= <FUNCTION> id [ "(" parFormales ")" ] ":" id ";" bloque ";"
parFormales ::= listaParam ( ";" listaParam )*
listaParam ::= [ <VAR> ] id ( "," id )* ":" id
listaVar ::= id( "," id )* ":" id
grupoSent ::= <BEGIN> sentencia ( ";" sentencia )* <END>
sentencia ::= [ asignacion | condicional | ciclica | llamada | bloqueEjecutable ]
asignacion ::= id ":=" expresion
condicional ::= <IF> expresion <THEN> sentencia [ <ELSE> sentencia ]
ciclica ::= <WHILE> expresion <DO> sentencia
llamada ::= id [ "(" parLlamada ")" ]
parLlamada ::= expresion ( "," expresion )*
expresion ::= exprSimple [ opRel exprSimple ]
exprSimple ::= [ signo ] termino (opAdt termino )*
termino ::= factor ( opMul factor)*
factor ::= ( valorSimple | nombreEval | <NOT> factor | "(" expresion ")" )
nombreEval ::= id [ selector ]
selector ::= "[" expresion "]" | "." <ID>
valorSimple ::= [ signo ] <NUMERO> | <CADENA>
opRel ::= ("<" | ">" | "<=" | ">=" | "=" | "<>")
opAdt ::= ( signo | "OR" )
opMul ::= ("*" | "DIV" | "MOD" | "AND")
signo ::= ("+" | "-")
id ::= <ID>