Skip to content

Commit ec9001e

Browse files
committed
Corrigido alguns problemas no cálculo do intervalo de contexto de variáveis locais, fazendo com que elas não fossem exibidas corretamente na seção de depuração.
1 parent e8948aa commit ec9001e

File tree

1 file changed

+35
-24
lines changed

1 file changed

+35
-24
lines changed

Comp/CompilerParser.cs

+35-24
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
using Comp.Lex;
44
using Comp.Types;
55

6+
using SimpleCompiler.GUI;
7+
68
namespace Comp;
79

810
public partial class Compiler
@@ -676,9 +678,13 @@ private Statement ParseStatement()
676678
return result;
677679
}
678680

681+
Symbol end;
682+
SourceInterval interval;
683+
679684
Keyword kw = lexer.NextKeyword(false);
680685
if (kw != null)
681686
{
687+
interval = kw.Interval;
682688
switch (kw.Value)
683689
{
684690
case "var":
@@ -694,23 +700,27 @@ private Statement ParseStatement()
694700

695701
Expression expression = ParseExpression();
696702

697-
Symbol end = lexer.NextSymbol(")");
703+
end = lexer.NextSymbol(")");
698704

699705
Statement thenStatement = ParseStatement();
706+
interval = interval.Merge(thenStatement.Interval);
700707

701708
Statement elseStatement = null;
702709
if (lexer.NextKeyword("senão", false) != null)
710+
{
703711
elseStatement = ParseStatement();
712+
interval = interval.Merge(elseStatement.Interval);
713+
}
704714

705-
IfStatement result = new(kw.Interval.Merge(end.Interval), expression, thenStatement, elseStatement);
715+
IfStatement result = new(interval, expression, thenStatement, elseStatement);
706716
return result;
707717
}
708718

709719
case "para":
710720
{
711721
lexer.NextSymbol("(");
712722

713-
ForStatement result = new(kw.Interval);
723+
ForStatement result = new(interval);
714724

715725
// inicializadores
716726
if (lexer.NextSymbol(";", false) == null)
@@ -747,42 +757,38 @@ private Statement ParseStatement()
747757
lexer.NextSymbol(")");
748758
}
749759

750-
Statement stateent = ParseStatement();
751-
result.Statement = stateent;
760+
Statement statement = ParseStatement();
761+
result.Statement = statement;
752762

763+
result.Interval = result.Interval.Merge(statement.Interval);
753764
return result;
754765
}
755766

756767
case "enquanto":
757768
{
758769
lexer.NextSymbol("(");
759-
760770
Expression expression = ParseExpression();
761-
762-
Symbol end = lexer.NextSymbol(")");
763-
771+
end = lexer.NextSymbol(")");
764772
Statement statement = ParseStatement();
765773

766-
return new WhileStatement(kw.Interval.Merge(end.Interval), expression, statement);
774+
return new WhileStatement(interval.Merge(end.Interval), expression, statement);
767775
}
768776

769777
case "repita":
770778
{
771779
Statement statement = ParseStatement();
772-
773780
lexer.NextKeyword("enquanto");
774781
lexer.NextSymbol("(");
775-
776782
Expression expression = ParseExpression();
783+
end = lexer.NextSymbol(")");
777784

778-
Symbol end = lexer.NextSymbol(")");
779-
780-
return new DoStatement(kw.Interval.Merge(end.Interval), expression, statement);
785+
interval = interval.Merge(statement.Interval).Merge(end.Interval);
786+
return new DoStatement(interval, expression, statement);
781787
}
782788

783789
case "leia":
784790
{
785-
ReadStatement result = new(kw.Interval);
791+
ReadStatement result = new(interval);
786792

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

799-
lexer.NextSymbol(";");
805+
end = lexer.NextSymbol(";");
800806

807+
result.Interval = result.Interval.Merge(end.Interval);
801808
return result;
802809
}
803810

@@ -820,39 +827,43 @@ private Statement ParseStatement()
820827
result.AddExpression(expression);
821828
}
822829

823-
lexer.NextSymbol(";");
830+
end = lexer.NextSymbol(";");
824831

832+
result.Interval = result.Interval.Merge(end.Interval);
825833
return result;
826834
}
827835

828836
case "retorne":
829837
{
830838
Expression expression = null;
831839

832-
Symbol end;
833840
if ((end = lexer.NextSymbol(";", false)) == null)
834841
{
835842
expression = ParseExpression();
836843
end = lexer.NextSymbol(";");
837844
}
838845

839-
return new ReturnStatement(kw.Interval.Merge(end.Interval), expression);
846+
interval = interval.Merge(end.Interval);
847+
return new ReturnStatement(interval, expression);
840848
}
841849

842850
case "quebra":
843851
{
844-
Symbol end = lexer.NextSymbol(";");
852+
end = lexer.NextSymbol(";");
845853

846-
return new BreakStatement(kw.Interval.Merge(end.Interval));
854+
interval = interval.Merge(end.Interval);
855+
return new BreakStatement(interval);
847856
}
848857
}
849858

850859
lexer.PreviusToken();
851860
}
852861

853862
Expression expr = ParseExpression();
854-
lexer.NextSymbol(";");
855-
return new ExpressionStatement(expr.Interval, expr);
863+
end = lexer.NextSymbol(";");
864+
865+
interval = expr.Interval.Merge(end.Interval);
866+
return new ExpressionStatement(interval, expr);
856867
}
857868

858869
private BlockStatement ParseBlock()

0 commit comments

Comments
 (0)