@@ -6,6 +6,8 @@ class Analise
6
6
public List < Fonte > Fontes { get ; set ; } = new List < Fonte > ( ) ;
7
7
// Armazena os módulos carregados, usado para compilação
8
8
public List < Modulo > Modulos { get ; set ; } = new List < Modulo > ( ) ;
9
+ // Armazena as estruturas carregadas, usado para compilação
10
+ public List < Estrutura > Estruturas { get ; set ; } = new List < Estrutura > ( ) ;
9
11
// Armazena os diretorios para uso do comando Imports
10
12
public List < DirectoryInfo > DiretoriosImportacao = new List < DirectoryInfo > ( ) ;
11
13
@@ -50,7 +52,7 @@ private TipoVariavel processaTipo(ref Trechos trechos)
50
52
// Processa declaração de variável ou campo do modulo
51
53
// Exemplo:
52
54
// dim variavel as tipo
53
- private DeclaraVariavel processaDim ( NivelPublicidade publi , Modulo mod , bool varDoModulo , ref Trechos trechos )
55
+ private DeclaraVariavel processaDim ( NivelPublicidade publi , Estrutura mod , bool varDoModulo , ref Trechos trechos )
54
56
{
55
57
trechos . ExigeProximo ( "Esperado o nome da variável após o 'dim'" ) ;
56
58
trechos . ExigeId ( "Esperado o nome da variável" ) ;
@@ -105,39 +107,40 @@ private DeclaraVariavel processaDim(NivelPublicidade publi, Modulo mod, bool var
105
107
}
106
108
else if ( trechos . EhIdentificador ( ) | trechos . EhTipo ( TipoTrecho . Arroba ) | trechos . EhTipo ( TipoTrecho . Cerquilha ) )
107
109
{
108
- LeiaVariavel . TipoLeitura varTipo = LeiaVariavel . TipoLeitura . Comum ;
110
+ Acao . TipoDeAcao varTipo = Acao . TipoDeAcao . Leitura ;
109
111
if ( trechos . EhTipo ( TipoTrecho . Arroba ) )
110
112
{
111
113
trechos . Proximo ( ) ;
112
114
trechos . ExigeId ( "Esperado o nome da variável" ) ;
113
- varTipo = LeiaVariavel . TipoLeitura . Desvio ;
115
+ varTipo = Acao . TipoDeAcao . LeituraDesvio ;
114
116
}
115
117
if ( trechos . EhTipo ( TipoTrecho . Cerquilha ) )
116
118
{
117
119
trechos . Proximo ( ) ;
118
120
trechos . ExigeId ( "Esperado o nome da variável" ) ;
119
- varTipo = LeiaVariavel . TipoLeitura . Segmento ;
121
+ varTipo = Acao . TipoDeAcao . LeituraSegmento ;
120
122
}
121
123
var varModulo = mod . Nome ;
122
- var varNome = trechos . Atual . Conteudo ;
124
+ var varNome = new List < string > ( ) ;
125
+ varNome . Add ( trechos . Atual . Conteudo ) ;
123
126
var varTrecho = trechos . Atual ;
124
127
trechos . Proximo ( ) ;
125
- if ( trechos . EhTipo ( TipoTrecho . Ponto ) )
128
+ while ( trechos . EhTipo ( TipoTrecho . Ponto ) )
126
129
{
127
130
trechos . Proximo ( ) ;
128
131
trechos . ExigeId ( "Esperado o nome da variável" ) ;
129
- varModulo = varNome ;
130
- varNome = trechos . Atual . Conteudo ;
132
+ varNome . Add ( trechos . Atual . Conteudo ) ;
131
133
trechos . Proximo ( ) ;
132
134
}
135
+ Acao acao = new Acao ( varTrecho , varNome , varTipo ) ;
136
+ ret = acao ;
133
137
if ( trechos . EhTipo ( TipoTrecho . AbreParenteses ) )
134
138
{
135
- ChamaRotina chamaRotina = new ChamaRotina ( varTrecho , varModulo , varNome ) ;
136
- ret = chamaRotina ;
139
+ acao . Tipo = Acao . TipoDeAcao . Chamada ;
137
140
trechos . Proximo ( ) ;
138
141
while ( ! trechos . EhTipo ( TipoTrecho . FechaParenteses ) )
139
142
{
140
- chamaRotina . Argumentos . Add ( processaExpressao ( mod , rot , ref trechos ) ) ;
143
+ acao . ArgumentosChamada . Add ( processaExpressao ( mod , rot , ref trechos ) ) ;
141
144
if ( trechos . EhTipo ( TipoTrecho . Virgula ) )
142
145
{
143
146
trechos . Proximo ( ) ;
@@ -149,10 +152,6 @@ private DeclaraVariavel processaDim(NivelPublicidade publi, Modulo mod, bool var
149
152
}
150
153
trechos . Proximo ( ) ;
151
154
}
152
- else
153
- {
154
- ret = new LeiaVariavel ( varTrecho , varTipo , varModulo , varNome ) ;
155
- }
156
155
}
157
156
return ret ;
158
157
}
@@ -257,7 +256,7 @@ private No processaExpressao(Modulo mod, Rotina rot, ref Trechos trechos)
257
256
// let variavel = 123
258
257
// let @variavel = 123
259
258
// let #variavel = 123
260
- private Atribuicao processaAtribuicao ( Modulo mod , Rotina rot , ref Trechos trechos )
259
+ private Acao processaAtribuicao ( Modulo mod , Rotina rot , ref Trechos trechos )
261
260
{
262
261
if ( trechos . EhProximoTipo ( TipoTrecho . Arroba ) | trechos . EhProximoTipo ( TipoTrecho . Cerquilha ) )
263
262
{
@@ -277,24 +276,28 @@ private Atribuicao processaAtribuicao(Modulo mod, Rotina rot, ref Trechos trecho
277
276
trechos . ExigeProximo ( "Esperado continuação do nome da variável" ) ;
278
277
}
279
278
while ( trechos . EhTipo ( TipoTrecho . Ponto ) ) ;
280
- Atribuicao atrib = new Atribuicao ( varTrecho , nomeVar ) ;
281
- if ( segmento ) atrib . Tipo = Atribuicao . TipoAtribuicao . Segmento ;
282
- if ( desvio ) atrib . Tipo = Atribuicao . TipoAtribuicao . Desvio ;
279
+ Acao atrib = new Acao ( varTrecho , nomeVar , Acao . TipoDeAcao . Gravacao ) ;
280
+ if ( segmento ) atrib . Tipo = Acao . TipoDeAcao . GravacaoSegmento ;
281
+ if ( desvio ) atrib . Tipo = Acao . TipoDeAcao . GravacaoDesvio ;
283
282
if ( trechos . EhTipo ( TipoTrecho . Atribuicao ) )
284
283
{
285
284
trechos . ExigeTipo ( TipoTrecho . Atribuicao , "Esperado '=' após o nome da variável" ) ;
286
285
trechos . ExigeProximo ( "Esperado um valor após o '='" ) ;
287
- atrib . Valor = processaExpressao ( mod , rot , ref trechos ) ;
286
+ atrib . ValorGravacao = processaExpressao ( mod , rot , ref trechos ) ;
288
287
}
289
288
else if ( trechos . EhOpMatematica ( "++" ) )
290
289
{
291
290
trechos . Proximo ( ) ;
292
- atrib . OperacaoEspecial = Atribuicao . TipoOperacaoEspecial . Incrementa ;
291
+ atrib . Tipo = Acao . TipoDeAcao . Incremento ;
292
+ if ( segmento ) atrib . Tipo = Acao . TipoDeAcao . IncrementoSegmento ;
293
+ if ( desvio ) atrib . Tipo = Acao . TipoDeAcao . IncrementoDesvio ;
293
294
}
294
295
else if ( trechos . EhOpMatematica ( "--" ) )
295
296
{
296
297
trechos . Proximo ( ) ;
297
- atrib . OperacaoEspecial = Atribuicao . TipoOperacaoEspecial . Decrementa ;
298
+ atrib . Tipo = Acao . TipoDeAcao . Incremento ;
299
+ if ( segmento ) atrib . Tipo = Acao . TipoDeAcao . IncrementoSegmento ;
300
+ if ( desvio ) atrib . Tipo = Acao . TipoDeAcao . IncrementoDesvio ;
298
301
}
299
302
else trechos . ExigeTipo ( TipoTrecho . Atribuicao , "Esperado '=' ou '++' or '--' após o nome da variável" ) ;
300
303
return atrib ;
@@ -455,35 +458,75 @@ private void nivelRotina(Modulo mod, Rotina rot, List<No> cmds, bool apenasUmCom
455
458
trechos . Proximo ( ) ;
456
459
goto reverifica ;
457
460
}
458
- else if ( trechos . EhIdentificador ( ) )
461
+ else if ( trechos . EhIdentificador ( ) | trechos . EhTipo ( TipoTrecho . Arroba ) | trechos . EhTipo ( TipoTrecho . Cerquilha ) )
459
462
{
460
- Trecho chamaTrecho = trechos . Atual ;
461
- string chamaModulo = mod . Nome ;
462
- string chamaRotina = trechos . Atual . Conteudo ;
463
- if ( trechos . EhProximoTipo ( TipoTrecho . Ponto ) )
463
+ bool cerquilha = false ;
464
+ bool arroba = false ;
465
+ if ( trechos . EhTipo ( TipoTrecho . Arroba ) )
466
+ {
467
+ arroba = true ;
468
+ trechos . Proximo ( ) ;
469
+ trechos . ExigeId ( "Esperado o nome da variável" ) ;
470
+ }
471
+ if ( trechos . EhTipo ( TipoTrecho . Cerquilha ) )
472
+ {
473
+ cerquilha = true ;
474
+ trechos . Proximo ( ) ;
475
+ trechos . ExigeId ( "Esperado o nome da variável" ) ;
476
+ }
477
+ Trecho acaoTrecho = trechos . Atual ;
478
+ List < string > acaoNome = new List < string > ( ) ;
479
+ acaoNome . Add ( acaoTrecho . Conteudo ) ;
480
+ while ( trechos . EhProximoTipo ( TipoTrecho . Ponto ) )
464
481
{
465
482
trechos . Proximo ( ) ;
466
483
trechos . ExigeProximo ( "Esperado continuação do nome da rotina" ) ;
467
484
trechos . ExigeId ( "Esperado continuação do nome da rotina" ) ;
468
- chamaModulo = chamaRotina ;
469
- chamaRotina = trechos . Atual . Conteudo ;
485
+ acaoNome . Add ( trechos . Atual . Conteudo ) ;
486
+ }
487
+ Acao acao = new Acao ( acaoTrecho , acaoNome , Acao . TipoDeAcao . Desconhecida ) ;
488
+ cmds . Add ( acao ) ;
489
+ trechos . Proximo ( ) ;
490
+ if ( trechos . EhTipo ( TipoTrecho . Atribuicao ) )
491
+ {
492
+ trechos . Proximo ( ) ;
493
+ acao . Tipo = Acao . TipoDeAcao . Gravacao ;
494
+ if ( arroba ) acao . Tipo = Acao . TipoDeAcao . GravacaoDesvio ;
495
+ if ( cerquilha ) acao . Tipo = Acao . TipoDeAcao . GravacaoSegmento ;
496
+ acao . ValorGravacao = processaExpressao ( mod , rot , ref trechos ) ;
470
497
}
471
- ChamaRotina chama = new ChamaRotina ( chamaTrecho , chamaModulo , chamaRotina ) ;
472
- cmds . Add ( chama ) ;
473
- if ( trechos . Proximo ( ) )
498
+ else if ( trechos . EhOpMatematica ( "++" ) )
474
499
{
475
- do
500
+ trechos . Proximo ( ) ;
501
+ acao . Tipo = Acao . TipoDeAcao . Incremento ;
502
+ if ( arroba ) acao . Tipo = Acao . TipoDeAcao . IncrementoDesvio ;
503
+ if ( cerquilha ) acao . Tipo = Acao . TipoDeAcao . IncrementoSegmento ;
504
+ }
505
+ else if ( trechos . EhOpMatematica ( "--" ) )
506
+ {
507
+ trechos . Proximo ( ) ;
508
+ acao . Tipo = Acao . TipoDeAcao . Decremento ;
509
+ if ( arroba ) acao . Tipo = Acao . TipoDeAcao . DecrementoDesvio ;
510
+ if ( cerquilha ) acao . Tipo = Acao . TipoDeAcao . DecrementoSegmento ;
511
+ }
512
+ else
513
+ {
514
+ acao . Tipo = Acao . TipoDeAcao . Chamada ;
515
+ if ( ! trechos . FimDaLinha )
476
516
{
477
- chama . Argumentos . Add ( processaExpressao ( mod , rot , ref trechos ) ) ;
478
- if ( trechos . EhTipo ( TipoTrecho . Virgula ) )
517
+ do
479
518
{
480
- trechos . Proximo ( ) ;
481
- }
482
- else if ( ! trechos . FimDaLinha )
483
- {
484
- break ;
485
- }
486
- } while ( ! trechos . FimDaLinha ) ;
519
+ acao . ArgumentosChamada . Add ( processaExpressao ( mod , rot , ref trechos ) ) ;
520
+ if ( trechos . EhTipo ( TipoTrecho . Virgula ) )
521
+ {
522
+ trechos . Proximo ( ) ;
523
+ }
524
+ else if ( ! trechos . FimDaLinha )
525
+ {
526
+ break ;
527
+ }
528
+ } while ( ! trechos . FimDaLinha ) ;
529
+ }
487
530
}
488
531
489
532
}
@@ -573,7 +616,7 @@ private void nivelModulo(Modulo mod, ref Trechos trechos)
573
616
574
617
if ( trechos . EhIdentificador ( "dim" ) )
575
618
{
576
- mod . Variaveis . Add ( processaDim ( publi , mod , true , ref trechos ) ) ;
619
+ mod . Campos . Add ( processaDim ( publi , mod , true , ref trechos ) ) ;
577
620
}
578
621
else if ( trechos . EhIdentificador ( "sub" ) )
579
622
{
@@ -590,6 +633,28 @@ private void nivelModulo(Modulo mod, ref Trechos trechos)
590
633
} while ( trechos . ProximaLinha ( ) ) ;
591
634
}
592
635
636
+ // Processa comandos do nivel estrutura (comandos que estão dentro de uma estrutura)
637
+ // Exemplo:
638
+ // structure nome
639
+ // ' PROCESSA COMANDOS DAQUI
640
+ // end
641
+ private void nivelEstrutura ( Estrutura estrutura , ref Trechos trechos )
642
+ {
643
+ do
644
+ {
645
+ if ( trechos . EhIdentificador ( "end" ) ) break ;
646
+
647
+ if ( trechos . EhIdentificador ( "dim" ) )
648
+ {
649
+ estrutura . Campos . Add ( processaDim ( NivelPublicidade . Publico , estrutura , true , ref trechos ) ) ;
650
+ }
651
+ else if ( ! trechos . FimDaLinha )
652
+ {
653
+ trechos . Erro ( "Comando desconhecido" ) ;
654
+ }
655
+ } while ( trechos . ProximaLinha ( ) ) ;
656
+ }
657
+
593
658
// Processa comandos do nivel raiz do codigo fonte
594
659
private void nivelRaiz ( ref Trechos trechos )
595
660
{
@@ -609,6 +674,19 @@ private void nivelRaiz(ref Trechos trechos)
609
674
trechos . ExigeId ( "end" ) ;
610
675
trechos . ExigeProximoFimDaLinha ( "Esperado apenas o 'end', sem nenhum complemento posterior" ) ;
611
676
}
677
+ else if ( trechos . EhIdentificador ( "structure" ) )
678
+ {
679
+ trechos . Proximo ( ) ;
680
+ trechos . ExigeId ( "Esperado o nome da estrutura após o 'structure'" ) ;
681
+ Estrutura estrutura = new Estrutura ( trechos . Atual ) ;
682
+ Estruturas . Add ( estrutura ) ;
683
+ trechos . ExigeProximoFimDaLinha ( "Esperado fim da linha depois da declaração da estrutura." ) ;
684
+ trechos . ExigeProximaLinha ( estrutura . Trecho , "Encontrado fim do arquivo com um 'structure' aberto" ) ;
685
+ nivelEstrutura ( estrutura , ref trechos ) ;
686
+ trechos . ExigeId ( "end" ) ;
687
+ trechos . ExigeProximoFimDaLinha ( "Esperado apenas o 'end', sem nenhum complemento posterior" ) ;
688
+
689
+ }
612
690
else if ( trechos . EhIdentificador ( "imports" ) )
613
691
{
614
692
trechos . Proximo ( ) ;
@@ -671,24 +749,28 @@ public void Compila(Saida saida)
671
749
Ambiente ? amb = null ;
672
750
foreach ( var mod in Modulos )
673
751
{
674
- amb = amb ?? new Ambiente ( saida , DiretoriosImportacao , Modulos , mod . Trecho , mod ) ;
752
+ amb = amb ?? new Ambiente ( saida , DiretoriosImportacao , Modulos , Estruturas , mod . Trecho , mod ) ;
675
753
mod . Inicializa ( amb ) ;
676
754
}
677
755
foreach ( var mod in Modulos )
678
756
{
679
- amb = amb ?? new Ambiente ( saida , DiretoriosImportacao , Modulos , mod . Trecho , mod ) ;
757
+ amb = amb ?? new Ambiente ( saida , DiretoriosImportacao , Modulos , Estruturas , mod . Trecho , mod ) ;
680
758
mod . Otimiza ( amb ) ;
681
759
}
682
760
683
761
// Busca e compila o módulo OS da biblioteca System, e todas suas referencias
684
762
// Como o modulo OS chama o Program.Main, acaba compilando tudo que o Program usa direta ou indiretamente
685
763
foreach ( var mod in Modulos . Where ( m => m . Nome . ToLower ( ) == "os" ) )
686
764
{
687
- amb = amb ?? new Ambiente ( saida , DiretoriosImportacao , Modulos , mod . Trecho , mod ) ;
765
+ amb = amb ?? new Ambiente ( saida , DiretoriosImportacao , Modulos , Estruturas , mod . Trecho , mod ) ;
688
766
var cons = mod . Rotinas . Where ( r => r . Nome . ToLower ( ) == "start" ) ;
689
767
if ( ! cons . Any ( ) ) throw new Erro ( mod . Trecho , "Esperado uma rotina 'OS.Start'" ) ;
690
768
cons . First ( ) . IgnorarCabecalhoRodape = true ;
769
+ amb . Modulo = mod ;
770
+ amb . Rotina = cons . First ( ) ;
691
771
cons . First ( ) . Compila ( amb ) ;
772
+ amb . Modulo = null ;
773
+ amb . Rotina = null ;
692
774
mod . Compila ( amb ) ;
693
775
CompilaReferencias ( mod , amb ) ;
694
776
}
0 commit comments