Introdução

Nesse capítulo, iremos ver muitos conceitos sobre compiladores, que serão trabalhados no desenvolvimento do nosso, mas por hora vamos começar com um pequeno trecho de código na linguagem Jack:

let custo = 80 + 65 * 42;

Considerando um conhecimento prévio de programação, alguns poderão dizer que essa sintaxe lembra javascript. De fato, esse código poderia ser copiado e colado em um programa JavaScript sem nenhuma alteração. Contudo, além da sintaxe temos a semântica, que nesse caso é um pouco diferente entre as linguagens Jack e JavaScript. A palavra reservada let é usado na declaração de uma variável, indicando nesse caso que ela é mutável, ou seja, a sequência seguinte seria valida em JavaScript

let custo = 80 + 65 * 42;
custo = 56;

Em JavaScript, o let permite que a variável tenha seu valor modificado em outro ponto do programa, o que não seria permitido caso se usasse a palavra reservada const. Esse código acima já não é um código Jack sintaticamente valido. Isso porque na linguagem Jack, a palavra reservada let tem outro significado. Ela é uma indicação de um comando de atribuição, ou seja, ela precisa estar presente em todas atribuições. Logo a seguinte sequência de comandos é valida em Jack, mas seria inválida em JavaScript:

let x = 10;
let x = 20;

Voltando ao código anterior, qualquer programador conseguiria identificar diferentes elementos naquele trecho de código, a palavra reservada let, um nome de uma variável, alguns números e operadores.

Untitled

De modo pouco formal, esses são os tokens que formam nosso programa e será a partir dele que iremos construir nossa gramática daqui a pouco. Contudo, antes de chegar nesse ponto, iremos trabalhar com um tradutor de expressões mais simples, onde cada caracter corresponde a um token. Como veremos mais a frente, isso elimina a necessidade do desenvolvimento de um analisador léxico, permitindo demonstrar alguns conceitos sobre o processo conhecido como Tradução Dirigida por Sintaxe.

A tradução dirigida por sintaxe é obtida ao anexar regras ou fragmentos de código às produções de uma gramática. Isso origina dois métodos de tradução:

  1. Definição dirigida por sintaxe, que associa: • Um conjunto de atributos a cada símbolo não-terminal da gramática, • Um conjunto de regras a cada produção

image.png