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