Skip to content

Latest commit

 

History

History
104 lines (62 loc) · 6.75 KB

README.md

File metadata and controls

104 lines (62 loc) · 6.75 KB

PLP

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.

COERÇÃO DE TIPOS

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).

Implementações do Projeto:

  • 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.

BNF

Imperativa 2

Programa ::= Comando

Comando ::= Atribuicao

         | ComandoDeclaracao

         | While

         | IfThenElse

         | IO

         | Comando ";" Comando

         | Skip

         | ChamadaProcedimento

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

         | Expressao "-" Expressao

         | Expressao "and" Expressao

         | Expressao "or" Expressao

         | Expressao "==" Expressao

         | Expressao "++" Expressao

         | Expressao "*" Expressao

         | Expressao "/" Expressao

ComandoDeclaracao :: = "{" Declaracao ";" Comando "}"

Declaracao ::= DeclaracaoVariavel

         | DeclaracaoProcedimento

         | DeclaracaoComposta

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

Equipe:

  • Lucas A. Lisboa

Links de Apoio: