3
3
using Comp . Lex ;
4
4
using Comp . Types ;
5
5
6
+ using SimpleCompiler . GUI ;
7
+
6
8
namespace Comp ;
7
9
8
10
public partial class Compiler
@@ -676,9 +678,13 @@ private Statement ParseStatement()
676
678
return result ;
677
679
}
678
680
681
+ Symbol end ;
682
+ SourceInterval interval ;
683
+
679
684
Keyword kw = lexer . NextKeyword ( false ) ;
680
685
if ( kw != null )
681
686
{
687
+ interval = kw . Interval ;
682
688
switch ( kw . Value )
683
689
{
684
690
case "var" :
@@ -694,23 +700,27 @@ private Statement ParseStatement()
694
700
695
701
Expression expression = ParseExpression ( ) ;
696
702
697
- Symbol end = lexer . NextSymbol ( ")" ) ;
703
+ end = lexer . NextSymbol ( ")" ) ;
698
704
699
705
Statement thenStatement = ParseStatement ( ) ;
706
+ interval = interval . Merge ( thenStatement . Interval ) ;
700
707
701
708
Statement elseStatement = null ;
702
709
if ( lexer . NextKeyword ( "senão" , false ) != null )
710
+ {
703
711
elseStatement = ParseStatement ( ) ;
712
+ interval = interval . Merge ( elseStatement . Interval ) ;
713
+ }
704
714
705
- IfStatement result = new ( kw . Interval . Merge ( end . Interval ) , expression , thenStatement , elseStatement ) ;
715
+ IfStatement result = new ( interval , expression , thenStatement , elseStatement ) ;
706
716
return result ;
707
717
}
708
718
709
719
case "para" :
710
720
{
711
721
lexer . NextSymbol ( "(" ) ;
712
722
713
- ForStatement result = new ( kw . Interval ) ;
723
+ ForStatement result = new ( interval ) ;
714
724
715
725
// inicializadores
716
726
if ( lexer . NextSymbol ( ";" , false ) == null )
@@ -747,42 +757,38 @@ private Statement ParseStatement()
747
757
lexer . NextSymbol ( ")" ) ;
748
758
}
749
759
750
- Statement stateent = ParseStatement ( ) ;
751
- result . Statement = stateent ;
760
+ Statement statement = ParseStatement ( ) ;
761
+ result . Statement = statement ;
752
762
763
+ result . Interval = result . Interval . Merge ( statement . Interval ) ;
753
764
return result ;
754
765
}
755
766
756
767
case "enquanto" :
757
768
{
758
769
lexer . NextSymbol ( "(" ) ;
759
-
760
770
Expression expression = ParseExpression ( ) ;
761
-
762
- Symbol end = lexer . NextSymbol ( ")" ) ;
763
-
771
+ end = lexer . NextSymbol ( ")" ) ;
764
772
Statement statement = ParseStatement ( ) ;
765
773
766
- return new WhileStatement ( kw . Interval . Merge ( end . Interval ) , expression , statement ) ;
774
+ return new WhileStatement ( interval . Merge ( end . Interval ) , expression , statement ) ;
767
775
}
768
776
769
777
case "repita" :
770
778
{
771
779
Statement statement = ParseStatement ( ) ;
772
-
773
780
lexer . NextKeyword ( "enquanto" ) ;
774
781
lexer . NextSymbol ( "(" ) ;
775
-
776
782
Expression expression = ParseExpression ( ) ;
783
+ end = lexer . NextSymbol ( ")" ) ;
777
784
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 ) ;
781
787
}
782
788
783
789
case "leia" :
784
790
{
785
- ReadStatement result = new ( kw . Interval ) ;
791
+ ReadStatement result = new ( interval ) ;
786
792
787
793
if ( lexer . NextSymbol ( ";" , false ) != null )
788
794
throw new CompilerException ( lexer . CurrentInterval ( ) , "Expressão esperada." ) ;
@@ -796,8 +802,9 @@ private Statement ParseStatement()
796
802
result . AddExpression ( expression ) ;
797
803
}
798
804
799
- lexer . NextSymbol ( ";" ) ;
805
+ end = lexer . NextSymbol ( ";" ) ;
800
806
807
+ result . Interval = result . Interval . Merge ( end . Interval ) ;
801
808
return result ;
802
809
}
803
810
@@ -820,39 +827,43 @@ private Statement ParseStatement()
820
827
result . AddExpression ( expression ) ;
821
828
}
822
829
823
- lexer . NextSymbol ( ";" ) ;
830
+ end = lexer . NextSymbol ( ";" ) ;
824
831
832
+ result . Interval = result . Interval . Merge ( end . Interval ) ;
825
833
return result ;
826
834
}
827
835
828
836
case "retorne" :
829
837
{
830
838
Expression expression = null ;
831
839
832
- Symbol end ;
833
840
if ( ( end = lexer . NextSymbol ( ";" , false ) ) == null )
834
841
{
835
842
expression = ParseExpression ( ) ;
836
843
end = lexer . NextSymbol ( ";" ) ;
837
844
}
838
845
839
- return new ReturnStatement ( kw . Interval . Merge ( end . Interval ) , expression ) ;
846
+ interval = interval . Merge ( end . Interval ) ;
847
+ return new ReturnStatement ( interval , expression ) ;
840
848
}
841
849
842
850
case "quebra" :
843
851
{
844
- Symbol end = lexer . NextSymbol ( ";" ) ;
852
+ end = lexer . NextSymbol ( ";" ) ;
845
853
846
- return new BreakStatement ( kw . Interval . Merge ( end . Interval ) ) ;
854
+ interval = interval . Merge ( end . Interval ) ;
855
+ return new BreakStatement ( interval ) ;
847
856
}
848
857
}
849
858
850
859
lexer . PreviusToken ( ) ;
851
860
}
852
861
853
862
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 ) ;
856
867
}
857
868
858
869
private BlockStatement ParseBlock ( )
0 commit comments