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.
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. |
Antes de iniciar a implementação do analisador sintático, iremos fazer algumas atualizações que irão nos ajudar.