A documentação da linguagem está dividida em dois documentos:
- A Definição geral da linguagem, a qual envolve:
- Características gerais da linguagem
- Tipos de dados e operadores
- Precedência de operadores
- Instruções (condicionais e iterativas) da linguagem
- A Definição do compilador, a qual envolve:
- Linguagem de implementação
- Enumeração das categorias dos tokens
- Especificação dos tokens da linguagem
- esses tokens são utilizados nas gramáticas em
GLC.txt
eGramática LL1.txt
como terminais
- esses tokens são utilizados nas gramáticas em
Inclusas no projeto estão duas gramáticas equivalentes, sendo uma GLC (Gramática Livre de Contexto) e uma Gramática LL1. Sendo a GLC apenas uma versão mais simplificada e de melhor legibilidade do que a gramática LL1.
Por conta do tipo de compilador escolhido (preditivo recursivo), a gramática LL1 foi a utilizada para desenvolvimento, visto que o compilador analisa da esquerda para a direita e tem por objetivo saber que derivação escolher a partir do primeiro token observado para cada não-terminal. Dessa forma, duas derivações de um mesmo não-terminal não podem gerar um mesmo first (terminal na primeira posição).
Nas gramáticas "terminais" são os termos que estão entre aspas simples, esses termos são os literais da linguagem, ou seja, eles são o código da linguagem em sí. Além disso, terminais podem se tratar de tokens definidos na documentação do compilador, por exemplo, o terminal 'funDef' representa fun
na linguagem em sí e o terminal 'digit' representa um digito decimal (0-9) na linguagem em sí.
Obs: & significa vazio, esse simbolo foi usado no lugar de epsilon para simplicidade em questão de encoding de caracteres das gramáticas
Já os "não-terminais" são os termos que começam por letra maiúscula e não tem aspas simples em volta, esses são termos que tem derivações, ou seja, que aparecem à esquerda da igualdade de pelo menos uma linha da gramática. Dessa forma, seu valor de fato apenas é decidido ao ler os tokens subsequentes de código.