Skip to content

Commit

Permalink
Closes #16 #25 #26
Browse files Browse the repository at this point in the history
  • Loading branch information
iaglourenco committed Sep 20, 2022
1 parent 1c3d81b commit c3240f0
Show file tree
Hide file tree
Showing 3 changed files with 80 additions and 7 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
.example/
.vscode/
16 changes: 12 additions & 4 deletions compilador/js/lexico.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import { ErroLexico } from "./erros.js";
class Lexico {
constructor(data) {
this.listaToken = this.tokenizar(data);
this.ultimoToken = null;
this.tokenAtual = null;
}
tokenizar(data) {
Expand Down Expand Up @@ -352,9 +351,18 @@ class Lexico {
* Atualiza o token atual e o ultimo token lido com sucesso
* @returns {object} token
* */
this.tokenAtual = this.listaToken.shift() ?? this.ultimoToken;
this.ultimoToken = this.tokenAtual;
return this.ultimoToken;

if (this.listaToken.length == 0) {
// Retorna simbolo de final de arquivo, que não é reconhecido pelo analisador sintático causando a falha,
// Podemos futuramente tratar isso de outra forma, lançando um erro específico sobre, por exemplo
this.tokenAtual = {
simbolo: "Sfim_arquivo",
lexema: "fim_arquivo",
linha: this.tokenAtual.linha,
coluna: this.tokenAtual.coluna,
};
} else this.tokenAtual = this.listaToken.shift();
return this.tokenAtual;
}
}

Expand Down
70 changes: 67 additions & 3 deletions compilador/js/sintatico.js
Original file line number Diff line number Diff line change
Expand Up @@ -56,11 +56,14 @@ function analisaComandos() {
*/
if (lexico.tokenAtual.simbolo == "Sinicio") {
lexico.proximoToken();
analisaComandoSimples();
analisaComandoSimples(); // PROBLEMA!?

while (lexico.tokenAtual.simbolo != "Sfim") {
if (lexico.tokenAtual.simbolo == "Sponto_virgula") {
lexico.proximoToken();
analisaComandoSimples();
if (lexico.tokenAtual.simbolo != "Sfim") {
analisaComandoSimples();
}
} else {
throw new ErroSintatico(
"sxs4",
Expand Down Expand Up @@ -105,7 +108,68 @@ function analisaComandoSimples() {
}
}

function analisaAtribuicaoChprocedimento() {}
function analisaAtribuicaoChprocedimento() {
/**
* <atribuição_chprocedimento>::= (<comando atribuicao>|<chamada de procedimento>)
*/
lexico.proximoToken();
if (lexico.tokenAtual.simbolo == "Satribuicao") {
analisaComandoAtribuicao();
} else {
analisaChamadaProcedimento();
}
}

function analisaComandoAtribuicao() {
/**
* <comando atribuicao>::= identificador := <expressao>
*/
lexico.proximoToken();
analisaExpressao();
}
function analisaExpressao() {
/**
* <expressão>::= <expressão simples> [<operador relacional><expressão simples>]
*/
analisaExpressaoSimples();
if (
lexico.tokenAtual.simbolo == "Smaior" ||
lexico.tokenAtual.simbolo == "Smaior_igual" ||
lexico.tokenAtual.simbolo == "Smenor" ||
lexico.tokenAtual.simbolo == "Smenor_igual" ||
lexico.tokenAtual.simbolo == "Sigual" ||
lexico.tokenAtual.simbolo == "Sdiferente"
) {
lexico.proximoToken();
analisaExpressaoSimples();
}
}
function analisaExpressaoSimples() {
/**
* <expressão simples> ::= [ + | - ] <termo> {( + | - | ou) <termo> }
*/
if (
lexico.tokenAtual.simbolo == "Smais" ||
lexico.tokenAtual.simbolo == "Smenos"
) {
lexico.proximoToken();
analisaTermo();
}
while (
lexico.tokenAtual.simbolo == "Smais" ||
lexico.tokenAtual.simbolo == "Smenos" ||
lexico.tokenAtual.simbolo == "Sou"
) {
lexico.proximoToken();
analisaTermo();
}
}
function analisaChamadaProcedimento() {
/**
* <chamada de procedimento>::= <identificador>
*/
lexico.proximoToken();
}
function analisaComandoCondicional() {}
function analisaComandoEnquanto() {}
function analisaComandoLeitura() {}
Expand Down

0 comments on commit c3240f0

Please sign in to comment.