A linguagem Monga 99 é uma linguagem
bastante simples (como o nome implica). Seus tipos se resumem a strings,
inteiros, e arrays. Como em C, em Monga variáveis do tipo array são na verdade
referências (ponteiros) para arrays; diferentemente de C, em Monga arrays devem
ser explicitamente criados, com uma expressão new (como em Java).
Uma atribuição de arrays a = b (assim como passagem de parâmetros e
retornos) implica que a passa a ser referência para o mesmo array
que b. Comentários em Monga começam com // e vão até o
final da linha.
and do else float if string new nil not or return then void while
programa : {declaracao}
obs: a execução de um programa consiste na execução de sua função
void main( ).
declaracao : dec-variavel | dec-funcao
dec-variavel : tipo lista-de-nomes ';'
lista-de-nomes : nome { ',' nome }
tipo : tipo-base | tipo '[' ']'
obs: 'x[ ]' é um array de x (ou, mais
precisamente, uma referência para um array).
tipo-base : 'int' | 'string'
dec-funcao : tipo-retorno nome '(' parametros ')' bloco
tipo-retorno : tipo | 'void'
parametros : /* vazio */ | parametro { ',' parametro }
parametro : tipo nome
bloco : '{' { dec-variavel } { comando } '}'
comando : 'if' exp 'then' comando parte-else
| 'while' exp 'do' comando
| var '=' exp ';'
| 'return' [ exp ] ';'
| chamada ';'
| bloco
obs: as expressões em if e while devem ter tipo
inteiro; um valor 0 significa falso, e diferente de 0 verdadeiro.
parte-else : /* vazio */ | 'else' comando
var : nome | var '[' exp ']'
exp : numeral | literal
| 'nil'
| var
| '(' exp ')'
| chamada
| 'new' tipo '(' exp ')'
| '-' exp
| exp '+' exp
| exp '-' exp
| exp '*' exp
| exp '/' exp
| exp '==' exp
| exp '<=' exp
| exp '>=' exp
| exp '<' exp
| exp '>' exp
| 'not' exp
| exp 'and' exp
| exp 'or' exp
'new x (exp)' cria um array com tipo x, e com
exp elementos (exp deve ser uma expressão de tipo
inteiro).
+ pode ser usado sobre strings, para fazer a
concatenação de strings.
int, 0 para
falso e 1 para verdadeiro.
'and' e 'or' devem usar "curto-circuito".
chamada : nome '(' lista-exp ')'
obs: a passagem de parâmetros é como em C, sempre por valor.
lista-exp : /* vazio */ | exp { ',' exp }
A linguagem Monga 99 inclui também as seguintes funções pré-definidas:
string tostring( int i ) - converte inteiro para string.
int toint( string s ) - converte string para inteiro.
void print( string s ) - imprime uma string.
string read( ) - lê uma string. A tipagem de Monga é bastante simples:
int, literais têm tipo
string.
nil é a única expressão polimórfica: seu tipo é
X[ ] para qualquer X.
int ou string).
var[ exp ], var tem que ser
um array de X, exp tem que ter tipo inteiro, e o
tipo final da expressão é X.
new X (exp) tem tipo X; esse tipo
deve ser um array, e o tipo de exp deve ser int.
int, que também é o tipo das expressões de
controle de if's e while's.
void; o valor de
retorno é simplesmente descartado.