Skip to content

Commit

Permalink
Corrigido alguns problemas no cálculo do intervalo de contexto de var…
Browse files Browse the repository at this point in the history
…iáveis locais, fazendo com que elas não fossem exibidas corretamente na seção de depuração.
  • Loading branch information
sharivan committed Aug 31, 2023
1 parent e8948aa commit ec9001e
Showing 1 changed file with 35 additions and 24 deletions.
59 changes: 35 additions & 24 deletions Comp/CompilerParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
using Comp.Lex;
using Comp.Types;

using SimpleCompiler.GUI;

namespace Comp;

public partial class Compiler
Expand Down Expand Up @@ -676,9 +678,13 @@ private Statement ParseStatement()
return result;
}

Symbol end;
SourceInterval interval;

Keyword kw = lexer.NextKeyword(false);
if (kw != null)
{
interval = kw.Interval;
switch (kw.Value)
{
case "var":
Expand All @@ -694,23 +700,27 @@ private Statement ParseStatement()

Expression expression = ParseExpression();

Symbol end = lexer.NextSymbol(")");
end = lexer.NextSymbol(")");

Statement thenStatement = ParseStatement();
interval = interval.Merge(thenStatement.Interval);

Statement elseStatement = null;
if (lexer.NextKeyword("senão", false) != null)
{
elseStatement = ParseStatement();
interval = interval.Merge(elseStatement.Interval);
}

IfStatement result = new(kw.Interval.Merge(end.Interval), expression, thenStatement, elseStatement);
IfStatement result = new(interval, expression, thenStatement, elseStatement);
return result;
}

case "para":
{
lexer.NextSymbol("(");

ForStatement result = new(kw.Interval);
ForStatement result = new(interval);

// inicializadores
if (lexer.NextSymbol(";", false) == null)
Expand Down Expand Up @@ -747,42 +757,38 @@ private Statement ParseStatement()
lexer.NextSymbol(")");
}

Statement stateent = ParseStatement();
result.Statement = stateent;
Statement statement = ParseStatement();
result.Statement = statement;

result.Interval = result.Interval.Merge(statement.Interval);
return result;
}

case "enquanto":
{
lexer.NextSymbol("(");

Expression expression = ParseExpression();

Symbol end = lexer.NextSymbol(")");

end = lexer.NextSymbol(")");
Statement statement = ParseStatement();

return new WhileStatement(kw.Interval.Merge(end.Interval), expression, statement);
return new WhileStatement(interval.Merge(end.Interval), expression, statement);
}

case "repita":
{
Statement statement = ParseStatement();

lexer.NextKeyword("enquanto");
lexer.NextSymbol("(");

Expression expression = ParseExpression();
end = lexer.NextSymbol(")");

Symbol end = lexer.NextSymbol(")");

return new DoStatement(kw.Interval.Merge(end.Interval), expression, statement);
interval = interval.Merge(statement.Interval).Merge(end.Interval);
return new DoStatement(interval, expression, statement);
}

case "leia":
{
ReadStatement result = new(kw.Interval);
ReadStatement result = new(interval);

if (lexer.NextSymbol(";", false) != null)
throw new CompilerException(lexer.CurrentInterval(), "Expressão esperada.");
Expand All @@ -796,8 +802,9 @@ private Statement ParseStatement()
result.AddExpression(expression);
}

lexer.NextSymbol(";");
end = lexer.NextSymbol(";");

result.Interval = result.Interval.Merge(end.Interval);
return result;
}

Expand All @@ -820,39 +827,43 @@ private Statement ParseStatement()
result.AddExpression(expression);
}

lexer.NextSymbol(";");
end = lexer.NextSymbol(";");

result.Interval = result.Interval.Merge(end.Interval);
return result;
}

case "retorne":
{
Expression expression = null;

Symbol end;
if ((end = lexer.NextSymbol(";", false)) == null)
{
expression = ParseExpression();
end = lexer.NextSymbol(";");
}

return new ReturnStatement(kw.Interval.Merge(end.Interval), expression);
interval = interval.Merge(end.Interval);
return new ReturnStatement(interval, expression);
}

case "quebra":
{
Symbol end = lexer.NextSymbol(";");
end = lexer.NextSymbol(";");

return new BreakStatement(kw.Interval.Merge(end.Interval));
interval = interval.Merge(end.Interval);
return new BreakStatement(interval);
}
}

lexer.PreviusToken();
}

Expression expr = ParseExpression();
lexer.NextSymbol(";");
return new ExpressionStatement(expr.Interval, expr);
end = lexer.NextSymbol(";");

interval = expr.Interval.Merge(end.Interval);
return new ExpressionStatement(interval, expr);
}

private BlockStatement ParseBlock()
Expand Down

0 comments on commit ec9001e

Please sign in to comment.