From ec9001efc27f6abe8d487ee588166c20481fffc3 Mon Sep 17 00:00:00 2001 From: Sharivan Date: Thu, 31 Aug 2023 00:04:51 -0300 Subject: [PATCH] =?UTF-8?q?Corrigido=20alguns=20problemas=20no=20c=C3=A1lc?= =?UTF-8?q?ulo=20do=20intervalo=20de=20contexto=20de=20vari=C3=A1veis=20lo?= =?UTF-8?q?cais,=20fazendo=20com=20que=20elas=20n=C3=A3o=20fossem=20exibid?= =?UTF-8?q?as=20corretamente=20na=20se=C3=A7=C3=A3o=20de=20depura=C3=A7?= =?UTF-8?q?=C3=A3o.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Comp/CompilerParser.cs | 59 +++++++++++++++++++++++++----------------- 1 file changed, 35 insertions(+), 24 deletions(-) diff --git a/Comp/CompilerParser.cs b/Comp/CompilerParser.cs index c861de7..5e410cf 100644 --- a/Comp/CompilerParser.cs +++ b/Comp/CompilerParser.cs @@ -3,6 +3,8 @@ using Comp.Lex; using Comp.Types; +using SimpleCompiler.GUI; + namespace Comp; public partial class Compiler @@ -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": @@ -694,15 +700,19 @@ 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; } @@ -710,7 +720,7 @@ private Statement ParseStatement() { lexer.NextSymbol("("); - ForStatement result = new(kw.Interval); + ForStatement result = new(interval); // inicializadores if (lexer.NextSymbol(";", false) == null) @@ -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."); @@ -796,8 +802,9 @@ private Statement ParseStatement() result.AddExpression(expression); } - lexer.NextSymbol(";"); + end = lexer.NextSymbol(";"); + result.Interval = result.Interval.Merge(end.Interval); return result; } @@ -820,8 +827,9 @@ private Statement ParseStatement() result.AddExpression(expression); } - lexer.NextSymbol(";"); + end = lexer.NextSymbol(";"); + result.Interval = result.Interval.Merge(end.Interval); return result; } @@ -829,21 +837,22 @@ private Statement ParseStatement() { 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); } } @@ -851,8 +860,10 @@ private Statement ParseStatement() } 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()