Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Sintático finalizado #12

Merged
merged 45 commits into from
Oct 4, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
bae0748
Correções no CSS
iaglourenco Sep 13, 2022
d667062
Melhorias no editor e correção #8
iaglourenco Sep 16, 2022
7ff6347
#9 finalizado
iaglourenco Sep 16, 2022
aae14df
Merge pull request #31 from iaglourenco/implementar-programa
iaglourenco Sep 16, 2022
c9d371b
Analisa Bloco
iaglourenco Sep 16, 2022
2c1c020
Merge pull request #32 from iaglourenco/11-implementar-bloco
iaglourenco Sep 16, 2022
4fa05cb
Mudança no lexico para classe, melhorias no controle do token
iaglourenco Sep 16, 2022
f8d5868
Merge pull request #33 from iaglourenco/10-implementar-etapa-de-decla…
iaglourenco Sep 16, 2022
2aa27f8
Analise de declaração de variaveis
iaglourenco Sep 16, 2022
8d030e1
Merge pull request #34 from iaglourenco/13-implementar-declaração-de-…
iaglourenco Sep 16, 2022
5fe7d1b
Analisa tipo
iaglourenco Sep 16, 2022
d9bb30d
Merge pull request #35 from iaglourenco/14-implementar-tipo
iaglourenco Sep 16, 2022
910c7aa
implementar regra comandos
iaglourenco Sep 17, 2022
04c5025
Merge pull request #36 from iaglourenco/17-implementar-comandos
iaglourenco Sep 17, 2022
03dbd66
Implementar regra comando simples
iaglourenco Sep 17, 2022
1c3d81b
Merge pull request #37 from iaglourenco/15-implementar-comando
iaglourenco Sep 17, 2022
c3240f0
Closes #16 #25 #26
iaglourenco Sep 20, 2022
f81a329
chamada de procedimento, somente semântico
iaglourenco Sep 20, 2022
d218dbc
Merge pull request #40 from iaglourenco/16-implementar-atrib_chproced…
iaglourenco Sep 20, 2022
c163563
analisa fator
iaglourenco Sep 20, 2022
de297ce
Merge pull request #41 from iaglourenco/28-implementar-fator
iaglourenco Sep 20, 2022
18699a0
condicional
iaglourenco Sep 20, 2022
d2221a4
Merge pull request #42 from iaglourenco/21-implementar-condicional
iaglourenco Sep 20, 2022
cd1d6a7
adiciona fator
fabioirokawa Sep 21, 2022
e336e94
Mudanças na home, analisa escreva feito
iaglourenco Sep 21, 2022
2734aed
Merge pull request #44 from iaglourenco/19-implementar-comando_escreva
iaglourenco Sep 21, 2022
cf2164a
Merge branch '27-implementar-termo' into dev
iaglourenco Sep 21, 2022
ef4253b
Fix #27
iaglourenco Sep 21, 2022
64af34a
Format code
iaglourenco Sep 21, 2022
8895b78
Adicionado comentário da #27
iaglourenco Sep 21, 2022
a3500ce
Correção no analisa expressão
iaglourenco Sep 21, 2022
ffb4494
Fixes
iaglourenco Sep 21, 2022
98e6831
Closes #22, #23, #24
iaglourenco Sep 21, 2022
836fb11
Merge pull request #45 from iaglourenco/22-implementar-subrotinas
iaglourenco Sep 21, 2022
d1c0806
Analisa chamada de função criada
iaglourenco Sep 21, 2022
e0ccfff
analisa enquanto
iaglourenco Sep 21, 2022
3a10eb1
Merge pull request #46 from iaglourenco/20-implementar-repeticao
iaglourenco Sep 21, 2022
2428f5e
analisa leitura
iaglourenco Sep 21, 2022
a2b5d00
ajustes no CSS
iaglourenco Sep 21, 2022
1b5f93d
Ajustes nos erros e correção de bugs
iaglourenco Sep 22, 2022
3ec59ba
Fix analisaDeclVar
iaglourenco Sep 22, 2022
89f3db0
Atualizado documentação
iaglourenco Sep 22, 2022
4b8a9a1
Correções de erros
iaglourenco Sep 22, 2022
9d91440
Melhorias na interface
iaglourenco Sep 30, 2022
ebe1932
Adicionado testes do sintático. Testes OK
iaglourenco Oct 4, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
.example/
.vscode/
18 changes: 11 additions & 7 deletions compilador/index.html
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
<!DOCTYPE html>

<html lang="pt-BR">

<head>
Expand All @@ -20,11 +19,13 @@
<link rel="stylesheet" href="codemirror/addon/display/fullscreen.css" />

<script src="codemirror/lib/codemirror.js"></script>
<script src="codemirror/mode/pascal/pascal.js"></script>
<script src="codemirror/addon/display/fullscreen.js"></script>
<script src="codemirror/addon/hint/show-hint.js"></script>

<!-- Script imports -->
<script type="module" src="js/compilador.js"></script>
<script src="js/lpd-mode.js"></script>

</head>

<body>
Expand All @@ -37,12 +38,15 @@
x.className = "menu";
}
}


</script>

<div id="nav" class="menu">
<header id="nav" class="menu">
<div style="display: flex; width: 100%; justify-content: space-between;">
<h1 class="logo">compi{<span class="logo_snip">LPD</span>}lador</h1>

<a id="logo_container" href="/">
<h1 id="logo" class="logo">compi{<span class="logo_snip">LPD</span>}lador</h1>
</a>
<div onclick="openNav()" class="menu_btn" id="menu_icon">
<span class="material-icons"> menu </span>
<span>Menu</span>
Expand All @@ -64,7 +68,7 @@ <h1 class="logo">compi{<span class="logo_snip">LPD</span>}lador</h1>
<input id="file-input" type="file" accept=".txt" />
</div>
</div>
</div>
</header>

<div id="codeeditor">
<div id="codeeditor_header">
Expand All @@ -79,7 +83,7 @@ <h1 class="logo">compi{<span class="logo_snip">LPD</span>}lador</h1>
<div id="console">
<div style="display: flex; justify-content: space-between">
<legend>Log</legend>
<legend id="limpar" style="cursor: pointer" onclick="document.getElementById('log').value=''">
<legend id="limpar" onclick="document.getElementById('log').value=''">
Limpar (Ctrl+L)
</legend>
</div>
Expand Down
41 changes: 28 additions & 13 deletions compilador/js/compilador.js
Original file line number Diff line number Diff line change
Expand Up @@ -44,18 +44,22 @@ function logar(msg) {
document.getElementById(
"log"
).value += `[${new Date().toLocaleString()}] ${msg}\n`;
// Faz o scroll na textarea para o fim
document.getElementById("log").scrollTop =
document.getElementById("log").scrollHeight;
}

import { ErroLexico, ErroSemantico, ErroSintatico } from "./erros.js";
// Import dos módulos do compilador
import lexico from "./lexico.js";
import sintatico from "./sintatico.js";

window.onload = function () {
var editor = CodeMirror(document.getElementById("codeeditor"), {
mode: "text/x-pascal",
mode: "text/x-lpd",
theme: "dracula",
tabSize: 5,
lineNumbers: true,
autofocus: true,

viewportMargin: 150,
extraKeys: {
F11: function (cm) {
Expand All @@ -66,6 +70,17 @@ window.onload = function () {
},
},
});

// Animação do logo
document.getElementById("logo").addEventListener("mouseover", function () {
document.getElementsByClassName("logo_snip")[0].innerHTML = "return";
});

// Animação do logo
document.getElementById("logo").addEventListener("mouseout", function () {
document.getElementsByClassName("logo_snip")[0].innerHTML = "LPD";
});

// Atualiza os números da linha e coluna na janela
editor.on("cursorActivity", function () {
if (document.getElementById("filename").value == "") {
Expand Down Expand Up @@ -117,25 +132,25 @@ window.onload = function () {
var start = performance.now();
if (code.length > 0) {
logar(`Compilando...`);
// Chamada do lexico passando todo o código inserido no editor
const listaToken = lexico.tokenizar(code);
// Chamada do sintático para iniciar a análise
const codigo = sintatico.iniciar(code);

logar(`SUCESSO!`);
logar(`Tokens: ${JSON.stringify(listaToken)}`);
logar(`Qtd. Lexemas: ${listaToken.length}`);
console.table(listaToken);
// logar(`Tokens: ${JSON.stringify(listaToken)}`);
// console.table(listaToken);
} else {
throw new Error("Nenhum código inserido!");
}
} catch (e) {
console.error(e);

if (e.message.includes("Erro léxico")) {
// Pega a linha e a coluna da string de erro: `Erro léxico: caracter inválido "${caracter}" na linha ${linha} e coluna ${coluna}`
const linha = e.message.match(/linha (\d+)/)[1];
const coluna = e.message.match(/coluna (\d+)/)[1];
if (
e instanceof ErroLexico ||
e instanceof ErroSintatico ||
e instanceof ErroSemantico
) {
// Coloca o cursor na linha e coluna do erro
editor.setCursor(linha - 1, coluna - 1);
editor.setCursor(e.linha - 1, e.coluna - 1);
editor.focus();
}

Expand Down
56 changes: 56 additions & 0 deletions compilador/js/erros.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
// Author: Iago Lourenço (iagojlourenco@gmail.com) / erros.js
// Classe de tratamento de erros

// Mensagens de erros dos analisadores
export const messages = {
lxl1: "Erro léxico: } sem { correspondente",
lxl2: "Erro léxico: Caractere inválido",
lxl3: "Erro léxico: Comentário não fechado",
sxs1: "Erro sintático: Código após o ponto final",
sxs2: "Erro sintático: Esperado simbolo 'programa'",
sxs3: "Erro sintático: Esperado 'identificador'",
sxs4: "Erro sintático: Esperado ';'",
sxs5: "Erro sintático: Esperado ':'",
sxs6: "Erro sintático: Tipo inválido",
sxs7: "Erro sintático: Esperado 'inicio'",
sxs8: "Erro sintático: Esperado 'fim'",
sxs9: "Erro sintático: Parenteses não fechados",
sxs10: "Erro sintático: Simbolo não esperado",
sxs11: "Erro sintático: Esperado 'entao'",
sxs12: "Erro sintático: Esperado ')' ",
sxs13: "Erro sintático: Identificador não declarado",
sxs14: "Erro sintático: Ponto final não encontrado",
sxs15: "Erro sintático: Esperado 'faca'",
sxs16: "Erro sintático: Esperado '('",
};

export class ErroLexico extends Error {
constructor(messageId, token, linha, coluna) {
if (messageId == "lxl2")
super(
`${messages[messageId]} "${token}" na linha ${linha} e coluna ${coluna}`
);
else super(messages[messageId] + ` na linha ${linha} e coluna ${coluna}`);
this.token = token;
this.linha = linha;
this.coluna = coluna;
}
}

export class ErroSintatico extends Error {
constructor(messageId, token, linha, coluna) {
super(messages[messageId] + ` na linha ${linha} e coluna ${coluna}`);
this.token = token;
this.linha = linha;
this.coluna = coluna;
}
}

export class ErroSemantico extends Error {
constructor(messageId, token, linha, coluna) {
super(messages[messageId] + ` na linha ${linha} e coluna ${coluna}`);
this.token = token;
this.linha = linha;
this.coluna = coluna;
}
}
Loading