Skip to content

Commit

Permalink
adicionado laços de repetição
Browse files Browse the repository at this point in the history
Adicionado:
- Botão 'mostrar bytecode' no canto direito do editor
- Laços de repetição enquanto e faca-enquanto
- Sistema de execução do código retrabalhado, ainda assim funciona 10 vezes mais lento que código no portugol
Corrigido:
- Expressões com operadores de mesma prioridade é calculada corretamente agora.
- nem lembro mais. entre outras coisinhas.
  • Loading branch information
erickweil authored Mar 19, 2019
1 parent fbbcc46 commit 6f6c0ca
Show file tree
Hide file tree
Showing 4 changed files with 409 additions and 377 deletions.
35 changes: 21 additions & 14 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@
}
}
</div>
<div id="myOutput">
<div id="myOutput" style="position:relative;">
<div class="portugol-buttons">
<input type="button" id="btn-run" value="Executar" onclick="executar()"/>

Expand All @@ -68,12 +68,16 @@
</div>
<div class="saida" id="saida"><div id="errorArea"></div><textarea id="textAreaSaida" onclick="cursorToEnd(this)" onkeyup="cursorToEnd(this)" oninput="receiveInput(this)">??</textarea></div>
<div class="saida" id="hidden"></div>
<input type="button" value="mostrar bytecode" style="position:absolute;top:0px;right:0px;background:transparent;z-index: 5;border:none" onclick="document.getElementById('hidden').style.display = 'block';"/>
</div>
<script src="tokenizer.js"></script>
<script src="parser.js"></script>
<script src="tokenizer.js"></script> <!-- Quebra o texto [para, , tokens, certinho]-->
<script src="parser.js"></script> <!-- pega os tokens e constroi a árvore -->

<!--<script src="interpreter.js"></script>-->
<script src="vm.js"></script>
<script src="vmcompiler.js"></script>
<script src="vm.js"></script> <!-- executa o 'bytecode' -->
<script src="vmcompiler.js"></script> <!-- compila a árvore em 'bytecode' ( parecido com java só que não é java ) -->

<!--<script src="treeview.js"></script>< ! - - para visuzalizar a árvore -->
<script src="src-min-noconflict/ace.js" type="text/javascript" charset="utf-8"></script>

<script src="ace_portugol.js"></script>
Expand Down Expand Up @@ -180,7 +184,7 @@
interpreter.run();
}*/

var lastvm = false;
//var lastvm = false;
var lastvmState = STATE_ENDED;
function executar()
{
Expand All @@ -194,28 +198,31 @@

var relevantTokens = tokenizer.getRelevantTokens();
var tree = new Parser(relevantTokens,string_cod).parse();
console.log(tree.funcoes[0].statements);
console.log(tree);

var compiler = new Compiler(tree,relevantTokens,string_cod,div_saida);
compiler.compile();

lastvm = new Vm(compiler.functions,string_cod,div_saida);
document.getElementById("hidden").innerHTML = lastvm.toString();
lastvmState = lastvm.run();
if(lastvmState == STATE_ENDED) lastvm.escreva("\n\nPrograma Terminado.");
//lastvm = new Vm(compiler.functions,string_cod,div_saida);
VMsetup(compiler.functions,string_cod,div_saida);
document.getElementById("hidden").innerHTML = VMtoString();
//lastvmState = lastvm.run();
lastvmState = VMrun();
//VM_saidaDiv.value = VM_saida;
if(lastvmState == STATE_ENDED) escreva("\n\nPrograma Terminado.");
}

function receiveInput(textarea)
{
if(lastvmState == STATE_WAITINGINPUT)
{
var saidadiv = textarea.value;
var entrada = saidadiv.substring(lastvm.saida.length,saidadiv.length);
var entrada = saidadiv.substring(VM_saida.length,saidadiv.length);

if(entrada.endsWith("\n"))
{
lastvmState = lastvm.run();
if(lastvmState == STATE_ENDED) lastvm.escreva("\n\nPrograma Terminado.");
lastvmState = VMrun();
if(lastvmState == STATE_ENDED) escreva("\n\nPrograma Terminado.");
}
}
}
Expand Down
42 changes: 39 additions & 3 deletions parser.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ var STATEMENT_declVar = 1;
var STATEMENT_expr = 2;
var STATEMENT_block = 3;
var STATEMENT_se = 4;
var STATEMENT_enquanto = 5;
var STATEMENT_facaEnquanto = 6;


function pmatch(index,tokens)
Expand Down Expand Up @@ -192,11 +194,45 @@ class Parser {
// "faca" block "enquanto" ( expression )
else if(t == T_enquanto)
{
this.erro(tokens[i],"enquanto não implementado ainda");
var logic_Expr = [];
var statements = [];
// i -->
// enquanto ( expr )
i++;
if(tokens[i].id != T_parO) this.erro(tokens[i],"esqueceu de abrir os parênteses da condição do enquanto");
i = this.parseExpressao(i,tokens,logic_Expr,0);
// i -->
// enquanto ( expr ) statementOrBlock
if(tokens[i].id != T_parC) this.erro(tokens[i],"esqueceu de fechar os parênteses da condição do enquanto");
i++;
i = this.parseStatementOrBlock(i,tokens,statements);

tree.push({id:STATEMENT_enquanto,index:tIndex,expr:logic_Expr[0],statements:statements});
}
else if(t == T_faca)
{
this.erro(tokens[i],"faca não implementado ainda");
var logic_Expr = [];
var statements = [];
// i -->
// faca statementOrBlock enquanto ( expr )
i++;
i = this.parseStatementOrBlock(i,tokens,statements);

// i -->
// faca statementOrBlock enquanto ( expr )
i++;
if(tokens[i].id != T_enquanto) this.erro(tokens[i],"esperando 'enquanto' aqui, a estrutura faca está incompleta");

// i -->
// faca statementOrBlock enquanto ( expr )
i++;
if(tokens[i].id != T_parO) this.erro(tokens[i],"esqueceu de abrir os parênteses da condição do enquanto");
i = this.parseExpressao(i,tokens,logic_Expr,0);
// i -->
// enquanto ( expr ) statementOrBlock
if(tokens[i].id != T_parC) this.erro(tokens[i],"esqueceu de fechar os parênteses da condição do enquanto");

tree.push({id:STATEMENT_facaEnquanto,index:tIndex,expr:logic_Expr[0],statements:statements});
}


Expand Down Expand Up @@ -363,7 +399,7 @@ class Parser {

var op = tokens[i].id;

if(getOpPrecedence(op) < prevPrecedence) // acabou aqui, tem que voltar pro operador anterior
if(getOpPrecedence(op) <= prevPrecedence) // acabou aqui, tem que voltar pro operador anterior
{
// voltar para o operador anterior
tree.push(member0);
Expand Down
Loading

0 comments on commit 6f6c0ca

Please sign in to comment.