Aplicação feita em Python para a aula de Compiladores
github: https://github.com/cmdrlias/compilador/
Análise Léxica:
- Definição de padrões através do uso de palavras-chave
- Implementação do Autômato Finito Determinístico para interpretação da linguagem proposta
- Fluxo de caracteres é lido da esquerda para a direita e agrupado em tokens;
- Forma a gramática
Análise Sintática: Agrupamento de tokens de forma hierarquica em coleções aninhadas com significado coletivo, ou seja, algo que foi declarado em linha deve fazer sentido em código.
- Reconhece estruturas sintáticas do fonte utilizando os tokens.
- É necessário uma gramática.
- Análise Top-Down, LL parsing;
- Análise Bottom-Up, LR parsing.
- Definição Dirigida pela Sintaxe;
- Esquema de Tradução
Análise Semântica: Realiza verificações a fim de assegurar que os componentes de um programa combinam de forma significativa.
- Coleta informações sobre tipos de identificadores e expressões;
- Verifica a consistência das operações do programa fonte de acordo com a definição da linguagem.
- Verificação de tipos.
Linguagem:
Programa → Classe EOF
Classe → "class" ID ":" ListaFuncao Main "end" "."
DeclaraID → TipoPrimitivo ID ";"
ListaFuncao → ListaFuncao Funcao | ε
Funcao → "def" TipoPrimitivo ID "(" ListaArg ")" ":" (DeclaraID)∗ ListaCmd Retorno "end" ";"
ListaArg → Arg "," ListaArg | Arg
Arg → TipoPrimitivo ID
Retorno → "return" Expressao ";" | ε
Main → "defstatic" "void" "main" "(" "String" "[" "]" ID ")" ":" (DeclaraID)∗ ListaCmd "end" ";"
TipoPrimitivo → "bool" | "integer" | "String" | "double" | "void"
ListaCmd → ListaCmd Cmd | ε
Cmd → CmdIF | CmdWhile | CmdAtribui | CmdFuncao | CmdWrite
CmdIF → "if" "(" Expressao ")" ":" ListaCmd "end" ";" | "if" "(" Expressao ")" ":" ListaCmd "else" ":" ListaCmd "end" ";"
CmdWhile → "while" "(" Expressao ")" ":" ListaCmd "end" ";"
CmdWrite → "write" "(" Expressao ")" ";"
CmdAtribui → ID "=" Expressao ";"
CmdFuncao → ID "(" (Expressao ("," Expressao)∗ )? ")" ";"
Expressao → Expressao Op Expressao | ID | ID "(" (Expressao ("," Expressao)∗ )? ")" | ConstInteger | ConstDouble | ConstString | "true" | "false" | OpUnario Expressao | "(" Expressao")"
Op → "or" | "and" | "<" | "<=" | ">" | ">=" | "==" | "!=" | "/" | "*" | "-" | "+"
OpUnario → "-" | "!"
Descrição dos padrões propostos:
- ID: deve iniciar com uma letra seguida de 0 ou mais produções de letras, dígitos e/ou caracteres _.
- ConstInteger: cadeia numérica contendo 1 ou mais produções de dígitos.
- ConstDouble cadeia numérica contendo 1 ou mais produções de dígitos, tendo em seguida um símbolo de ponto (.) e, em seguida, 1 ou mais produções de dígitos.
- ConstString: deve iniciar e finalizar com o caractere aspas (") contendo entre eles uma sequência de 1 ou mais produções de letras, dígitos e/ou símbolos da tabela ASCII – exceto o próprio caractere aspas.
- EOF é o código de fim de arquivo.
- Aspas na gramática apenas destacam os terminais, e os diferencia dos não-terminais.
- Apenas comentários de uma linha são permitidos e seguem o padrão de Python.