Repositório para disciplina de PLP. A proposição deste trabalho é implementar a coerção de tipos, também conhecida como conversão implícita, para a Linguagem Imperativa 2. A coerção é inspirada em Linguagens Tipadas Dinamicamente, como Python, em que o tipo do lado esquerdo da expressão pode ser alterado durante uma atribuição.
A coerção é um mecanismo de conversão implícita de tipos implementadas pelo compilador de uma linguagem. Neste tipo de conversão, ao contrário da explícita, em que o programador deve indicar qual variável será alterada, o compilador muda o tipo da variável menos abrangente para o tipo mais abrangente. Por exemplo, um tipo booleano só consegue representar dois valores (0 ou 1), enquanto o tipo inteiro consegue representar 65.535 valores (-32767 a 32767).
- Extensão da Gramática para incluir tipo float e tipo char, operação de multiplicação e operação de divisão;
- Implementação da coerção para soma, multiplicação e divisão entre um int e um float;
- Implementação da coerção para divisão entre ints;
- Implementação da coerção para soma, multiplicação e divisão entre boolean e int;
- Implementação da coerção para soma, multiplicação e divisão entre char e int (conversão do char via ASCII);
- Implementação da coerção para contatenação (Todos os tipos são convertidos para string);
- Implementação da Coerção na Atribuição.
Comando ::= Atribuicao
| While
| IO
| Skip
Skip ::=
Atribuicao ::= Id ":=" Expressao
Expressao ::= Valor | ExpUnaria | ExpBinaria | Id
Valor ::= ValorConcreto
ValorConcreto ::= ValorInteiro | ValorBooleano | ValorString | ValorFloat | ValorChar
ExpUnaria ::= "-" Expressao | "not" Expressao | "length" Expressao
ExpBinaria ::= Expressao "+" Expressao
ComandoDeclaracao :: = "{" Declaracao ";" Comando "}"
Declaracao ::= DeclaracaoVariavel
DeclaracaoVariavel ::= "var" Id "=" Expressao
DeclaracaoComposta ::= Declaracao "," Declaracao
DeclaracaoProcedimento ::= "proc" Id "(" [ ListaDeclaracaoParametro ] ")" "{" Comando "}"
ListaDeclaracaoParametro ::= Tipo Id | Tipo Id "," ListaDeclaracaoParametro
Tipo ::= "string" | "int" | "boolean" | "float" | "char"
While ::= "while" Expressao "do" Comando
IfThenElse ::= "if" Expressao "then" Comando "else" Comando
IO ::= "write" "(" Expressao ")" | "read" "(" Id ")"
ChamadaProcedimento ::= "call" Id "(" [ ListaExpressao ] ")"
ListaExpressao ::= Expressao | Expressao, ListaExpressao
- Lucas A. Lisboa
- https://www.cin.ufpe.br/~in1007/linguagens/Imperativa2/imperativa2.html
- https://www.inf.ufpr.br/cursos/ci067/Docs/NotasAula/notas-21_Mais_sobre_tipos_convers.html
- https://www.geeksforgeeks.org/type-conversion-c/
- https://github.com/filipanselmo11/Lisp/blob/master/Conceitos%20de%20Linguagem%20de%20Programa%C3%A7%C3%A3o%20(9a%20Edi%C3%A7%C3%A3o)%20-%20Robert%20W.%20Sebesta%20-%20trabalho.pdf