Introdução

Desenvolva um analisador sintático, que dado um ou mais arquivos .jack, ele execute a análise sintática e retorne um arquivo XML para cada arquivo .jack compilador.

Esse arquivo XML irá representar a árvore sintática (parse tree) das unidades compiladas e servirá para validar sua implementação.

<aside> 📢 Dica: Todo processo pode ser feito por etapa, não tente compilar um código com todos os elementos. Vá adicionando apenas os elementos que está compilando naquele momento. Na aula explico melhor esta estrategia.

</aside>

Para o desenvolvimento do analisador sintático, podemos usar a classe Parser desenvolvida para o Tradutor. Contudo, ela precisa ser atualizada para a gramática da Linguagem Jack, que possui muito mais elementos.

Descrição da sintaxe

API

A seguir é apresentado as rotinas, construtor e métodos do Parser (ou CompilationEngine). Lembrem-se que esse componente irá utilizar o Scanner (ou JackTokenizer) implementado anteriormente.

Rotina Descrição
Constructor Given Input stream/file Output stream/file. Creates a new compilation engine with the given input and output. The next routine called must be compileClass() .
parseClass Compiles a complete class.
parseClassVarDec Compiles a static declaration or a field declaration.
parseSubroutine Compiles a complete method, function, or constructor.
parseParameterList Compiles a (possibly empty) parameter list, not including the enclosing "()" .
parseVarDec Compiles a var declaration.
parseStatements Compiles a sequence of statements, not including the enclosing ‘‘{}’’.
parseDo Compiles a do statement.
parseLet Compiles a let statement.
parseReturn Compiles a return statement.
parseIf Compiles an if statement, possibly with a trailing else clause.
parseExpression Compiles an expression.
parseTerm Compiles a term. This routine is faced with a slight difficulty when trying to decide between some of the alternative parsing rules. Specifically, if the current token is an identifier, the routine must distinguish between a variable, an array entry, and a subroutine call. A single lookahead token, which may be one of ‘‘[’’, ‘‘(’’, or ‘‘.’’ suffices to distinguish between the three possibilities. Any other token is not part of this term and should not be advanced over.
parseExpressionList Compiles a (possibly empty) comma-separated list of expressions.

Implementação

Antes de iniciar a implementação do analisador sintático, iremos fazer algumas atualizações que irão nos ajudar.