@@ -2,6 +2,9 @@ class Analise
2
2
{
3
3
// Variaveis de uso comum do analisador
4
4
5
+
6
+ // Registro de erros possiveis no codigo fonte
7
+ public List < RegistroDeErro > Erros { get ; set ; } = new List < RegistroDeErro > ( ) ;
5
8
// Armazena os códigos fontes analisados
6
9
public List < Fonte > Fontes { get ; set ; } = new List < Fonte > ( ) ;
7
10
// Armazena os módulos carregados, usado para compilação
@@ -27,9 +30,9 @@ public Analise(List<DirectoryInfo> dirs)
27
30
// Processa tipo de uma variável
28
31
// Usado quando se declara o tipo da variável, por exemplo:
29
32
// Dim variavel as TIPO
30
- private TipoVariavel processaTipo ( ref Trechos trechos )
33
+ public static TipoVariavel ProcessaTipo ( string tipo )
31
34
{
32
- switch ( trechos . Atual . Conteudo . ToLower ( ) )
35
+ switch ( tipo )
33
36
{
34
37
case "int8" :
35
38
return TipoVariavel . Int16 ;
@@ -51,11 +54,15 @@ private TipoVariavel processaTipo(ref Trechos trechos)
51
54
return TipoVariavel . Structure ;
52
55
}
53
56
}
57
+ private TipoVariavel processaTipo ( ref Trechos trechos )
58
+ {
59
+ return ProcessaTipo ( trechos . Atual . Conteudo . ToLower ( ) ) ;
60
+ }
54
61
55
62
// Processa declaração de variável ou campo do modulo
56
63
// Exemplo:
57
64
// dim variavel as tipo
58
- private DeclaraVariavel processaDim ( NivelPublicidade publi , Estrutura mod , bool varDoModulo , ref Trechos trechos )
65
+ private DeclaraVariavel processaDim ( NivelPublicidade publi , Estrutura mod , bool varDoModulo , bool apenasPonteiro , ref Trechos trechos )
59
66
{
60
67
trechos . ExigeProximo ( "Esperado o nome da variável após o 'dim'" ) ;
61
68
trechos . ExigeId ( "Esperado o nome da variável" ) ;
@@ -76,6 +83,7 @@ private DeclaraVariavel processaDim(NivelPublicidade publi, Estrutura mod, bool
76
83
TipoVariavel tipoRetorno = TipoVariavel . UInt16 ;
77
84
string tipoRetornoNome = "uint16" ;
78
85
DeclaraVariavel dim = new DeclaraVariavel ( dimTrecho , mod , varDoModulo , publi , dimTipo , dimTipoNome , dimColecao , dimColecaoTam ) ;
86
+ dim . EstruturaEstaticaApenasPonteiro = apenasPonteiro ;
79
87
if ( dimTipo == TipoVariavel . Func | dimTipo == TipoVariavel . Action )
80
88
{
81
89
trechos . ExigeTipo ( TipoTrecho . AbreParenteses , $ "Esperado '(' após '{ dimTipoNome } '") ;
@@ -450,12 +458,12 @@ private void nivelRotina(Modulo mod, Rotina rot, List<No> cmds, bool apenasUmCom
450
458
do
451
459
{
452
460
reverifica :
453
- if ( trechos . EhIdentificador ( "end" ) | trechos . EhIdentificador ( "else" ) ) break ;
461
+ if ( trechos . EhIdentificador ( "end" ) | trechos . EhIdentificador ( "else" ) | trechos . EhIdentificador ( "catch" ) ) break ;
454
462
455
463
456
464
if ( trechos . EhIdentificador ( "dim" ) )
457
465
{
458
- rot . Variaveis . Add ( processaDim ( NivelPublicidade . Local , mod , false , ref trechos ) ) ;
466
+ rot . Variaveis . Add ( processaDim ( NivelPublicidade . Local , mod , false , false , ref trechos ) ) ;
459
467
}
460
468
else if ( trechos . EhIdentificador ( "let" ) )
461
469
{
@@ -491,9 +499,37 @@ private void nivelRotina(Modulo mod, Rotina rot, List<No> cmds, bool apenasUmCom
491
499
cmds . Add ( new VaPara ( trechos . Atual ) ) ;
492
500
trechos . Proximo ( ) ;
493
501
}
494
- else if ( trechos . EhIdentificador ( "invoke " ) )
502
+ else if ( trechos . EhIdentificador ( "throw " ) )
495
503
{
496
- throw new NotImplementedException ( ) ;
504
+ trechos . Proximo ( ) ;
505
+ EmiteErro emite = new EmiteErro ( trechos . Atual ) ;
506
+ trechos . ExigeId ( "Esperado o tipo de erro" ) ;
507
+ cmds . Add ( emite ) ;
508
+ trechos . Proximo ( ) ;
509
+ }
510
+ else if ( trechos . EhIdentificador ( "try" ) )
511
+ {
512
+ trechos . Proximo ( ) ;
513
+ Tenta tenta = new Tenta ( trechos . Atual ) ;
514
+ cmds . Add ( tenta ) ;
515
+ trechos . ExigeFimDaLinha ( "Esperado fim da linha" ) ;
516
+ trechos . ProximaLinha ( ) ;
517
+ nivelRotina ( mod , rot , tenta . TentaComandos , false , ref trechos ) ;
518
+ trechos . ExigeId ( "catch" , "Esperado um 'catch' ao final dos comandos de um 'try'" ) ;
519
+ do
520
+ {
521
+ trechos . Proximo ( ) ;
522
+ trechos . ExigeId ( "Esperado um tipo de erro" ) ;
523
+ List < No > erroCmds = new List < No > ( ) ;
524
+ string erroTipo = trechos . Atual . Conteudo ;
525
+ trechos . Proximo ( ) ;
526
+ trechos . ExigeFimDaLinha ( "Esperado fim da linha" ) ;
527
+ trechos . ProximaLinha ( ) ;
528
+ nivelRotina ( mod , rot , erroCmds , false , ref trechos ) ;
529
+ tenta . PegaErros . Add ( erroTipo , erroCmds ) ;
530
+ } while ( trechos . EhIdentificador ( "catch" ) ) ;
531
+ trechos . ExigeId ( "end" , "Esperado um 'end' ao final de um Try Catch" ) ;
532
+ trechos . Proximo ( ) ;
497
533
}
498
534
else if ( trechos . EhIdentificador ( ) & trechos . EhProximoTipo ( TipoTrecho . DoisPontos ) )
499
535
{
@@ -650,9 +686,10 @@ private Rotina processaSubFunction(Modulo mod, NivelPublicidade publi, bool reto
650
686
// end
651
687
private void nivelModulo ( Modulo mod , ref Trechos trechos )
652
688
{
653
- NivelPublicidade publi = NivelPublicidade . Privado ;
654
689
do
655
690
{
691
+ NivelPublicidade publi = NivelPublicidade . Privado ;
692
+ bool apenasPonteiro = false ;
656
693
if ( trechos . EhIdentificador ( "end" ) ) break ;
657
694
publi = NivelPublicidade . Privado ;
658
695
if ( trechos . EhIdentificador ( "public" ) )
@@ -665,21 +702,29 @@ private void nivelModulo(Modulo mod, ref Trechos trechos)
665
702
publi = NivelPublicidade . Privado ;
666
703
trechos . Proximo ( ) ;
667
704
}
705
+ if ( trechos . EhIdentificador ( "pointer" ) )
706
+ {
707
+ apenasPonteiro = true ;
708
+ trechos . Proximo ( ) ;
709
+ }
668
710
669
711
if ( trechos . EhIdentificador ( "dim" ) )
670
712
{
671
- mod . Campos . Add ( processaDim ( publi , mod , true , ref trechos ) ) ;
713
+ mod . Campos . Add ( processaDim ( publi , mod , true , apenasPonteiro , ref trechos ) ) ;
672
714
}
673
715
else if ( trechos . EhIdentificador ( "sub" ) )
674
716
{
717
+ if ( apenasPonteiro ) trechos . Erro ( "Marcador Pointer não é compatível com rotinas" ) ;
675
718
mod . Rotinas . Add ( processaSubFunction ( mod , publi , false , ref trechos ) ) ;
676
719
}
677
720
else if ( trechos . EhIdentificador ( "function" ) )
678
721
{
722
+ if ( apenasPonteiro ) trechos . Erro ( "Marcador Pointer não é compatível com rotinas" ) ;
679
723
mod . Rotinas . Add ( processaSubFunction ( mod , publi , true , ref trechos ) ) ;
680
724
}
681
725
else if ( ! trechos . FimDaLinha )
682
726
{
727
+ if ( apenasPonteiro ) trechos . Erro ( "Esperado alguma declaração de variável" ) ;
683
728
trechos . Erro ( "Comando desconhecido" ) ;
684
729
}
685
730
} while ( trechos . ProximaLinha ( ) ) ;
@@ -698,7 +743,7 @@ private void nivelEstrutura(Estrutura estrutura, ref Trechos trechos)
698
743
699
744
if ( trechos . EhIdentificador ( "dim" ) )
700
745
{
701
- estrutura . Campos . Add ( processaDim ( NivelPublicidade . Publico , estrutura , true , ref trechos ) ) ;
746
+ estrutura . Campos . Add ( processaDim ( NivelPublicidade . Publico , estrutura , true , false , ref trechos ) ) ;
702
747
}
703
748
else if ( ! trechos . FimDaLinha )
704
749
{
@@ -739,6 +784,19 @@ private void nivelRaiz(ref Trechos trechos)
739
784
trechos . ExigeProximoFimDaLinha ( "Esperado apenas o 'end', sem nenhum complemento posterior" ) ;
740
785
741
786
}
787
+ else if ( trechos . EhIdentificador ( "error" ) )
788
+ {
789
+ trechos . Proximo ( ) ;
790
+ trechos . ExigeId ( "Esperado o nome do erro" ) ;
791
+ var erroTrecho = trechos . Atual ;
792
+ trechos . Proximo ( ) ;
793
+ trechos . ExigeTipo ( TipoTrecho . Atribuicao , "Esperado um '=' após o nome do erro" ) ;
794
+ trechos . Proximo ( ) ;
795
+ trechos . ExigeTipo ( TipoTrecho . Numero , "Esperado um numero decimal" ) ;
796
+ RegistroDeErro erro = new RegistroDeErro ( erroTrecho , int . Parse ( trechos . Atual . Conteudo ) ) ;
797
+ Erros . Add ( erro ) ;
798
+ trechos . Proximo ( ) ;
799
+ }
742
800
else if ( trechos . EhIdentificador ( "imports" ) )
743
801
{
744
802
trechos . Proximo ( ) ;
@@ -813,7 +871,7 @@ private void CompilaReferencias(Modulo mod, Ambiente amb)
813
871
// Compila codigo fonte
814
872
public void Compila ( Saida saida )
815
873
{
816
- Ambiente amb = new Ambiente ( saida , DiretoriosImportacao , Modulos , Estruturas , Modulos . First ( ) . Trecho , Modulos . First ( ) ) ; ;
874
+ Ambiente amb = new Ambiente ( saida , DiretoriosImportacao , Erros , Modulos , Estruturas , Modulos . First ( ) . Trecho , Modulos . First ( ) ) ; ;
817
875
818
876
819
877
foreach ( var estru in Estruturas )
@@ -854,5 +912,6 @@ public void Compila(Saida saida)
854
912
amb . Saida . EmiteItemRealocacao ( realoc ) ;
855
913
}
856
914
amb . Saida . EmiteItemRealocacao ( new Realocacao ( TipoDeRealocacao . FimLista , 0 , "0" , 0 ) ) ;
915
+ amb . Saida . EmiteRotulo ( "END" ) ;
857
916
}
858
917
}
0 commit comments