Projeto da disciplina Paradigmas de Linguagens de Programação - CIn/UFPE.
Com base nos princípios de flexibilidade e generalização, vamos adicionar tipagem e união de tipos à Linguagem Funcional 1 apresentada na disciplina. Com isso, variáveis, parâmetros ou retorno de funções poderão ser anotados com os tipos específicos já definidos na linguagem, mas também com suporte à união deles. Um novo operador chamado typeof também será implementado para expandir a utilidade da união de tipos na linguagem.
Programa ::= Expressao
Expressao ::= Valor
| ExpUnaria
| ExpBinaria
| ExpDeclaracao
| Id
| Aplicacao
| IfThenElse
Valor ::= ValorConcreto
ValorConcreto ::= ValorInteiro
| ValorBooleano
| ValorString
ExpUnaria ::= "-" Expressao
| "not" Expressao
| "length" Expressao
| "typeof" Expressao
ExpBinaria ::= Expressao "+" Expressao
| Expressao "-" Expressao
| Expressao "and" Expressao
| Expressao "or" Expressao
| Expressao "==" Expressao
| Expressao "++" Expressao
ExpDeclaracao ::= "let" DeclaracaoFuncional "in" Expressao
DeclaracaoFuncional ::= DecVariavel
| DecFuncao
| DecComposta
DecVariavel ::= AnotacaoTipo Id "=" Expressao
DecFuncao ::= "fun" ListId "=" Expressao
DecComposta ::= DeclaracaoFuncional "," DeclaracaoFuncional
ListId ::= AnotacaoTipo Id | AnotacaoTipo Id ListId
Aplicacao ::= Id "(" ListExp ")"
ListExp ::= Expressao | Expressao, ListExp
IfThenElse ::= "if" Expressao "then" Expressao "else" Expressao
AnotacaoTipo ::= TipoPrimitivo | TipoCustom
TipoCustom ::= TipoPrimitivo "|" TipoPrimitivo
TipoPrimitivo ::= "string" | "int" | "boolean"