Skip to content

Commit 7499f2e

Browse files
Implementado parcialmente as Structures, melhorias diversas
Criado metodo para distribuir os Releases do projeto, será usado quando for minimamente funcional. Unificado LeiaVariavel, ChamaRotina e Atribuicao, em um único item chamado Acao
1 parent 41e9ed4 commit 7499f2e

File tree

1,940 files changed

+16660
-824
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,940 files changed

+16660
-824
lines changed

Ambiente.cs

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ class Ambiente
55
public List<DirectoryInfo> DiretoriosImportacao ;
66
// Todos os modulos carregados
77
public List<Modulo> Modulos { get; set; }
8+
// Todos as Estruturas carregados
9+
public List<Estrutura> Estruturas { get; set; }
810
// Modulo atual durante o processamento
911
public Modulo? Modulo { get; set; } = null;
1012
// Rotina atual durante o processamento
@@ -23,6 +25,7 @@ class Ambiente
2325

2426
public bool TipoSemSinal => Tipo == TipoVariavel.UInt8 | Tipo == TipoVariavel.UInt16 | Tipo == TipoVariavel.PtrByteArray | Tipo == TipoVariavel.PtrWordArray;
2527
public bool TipoComSinal => Tipo == TipoVariavel.Int8 | Tipo == TipoVariavel.Int16;
28+
public bool TipoPonteiro => Tipo == TipoVariavel.PtrByteArray | Tipo == TipoVariavel.PtrWordArray | Tipo == TipoVariavel.Structure;
2629

2730

2831
// Usado pelos nós que fazem chamada ou manipulam campos de modulos, registrando quais modulos eles referenciaram, para uso da compilação mais tarde
@@ -31,8 +34,23 @@ public void CadastraReferencia(Modulo mod)
3134
if(Modulo != null) Modulo.CadastraReferencia(mod);
3235
}
3336

34-
public Ambiente(Saida saida, List<DirectoryInfo> importacao, List<Modulo> modulos, Trecho trecho, No no)
37+
public Modulo? PesquisaModulo(string nome)
3538
{
39+
var consMod = Modulos.Where(v => v.Nome.ToLower() == nome.ToLower());
40+
if(consMod.Any()) return consMod.First();
41+
return null;
42+
}
43+
44+
public Estrutura? PesquisaEstrutura(string nome)
45+
{
46+
var consEstr = Estruturas.Where(v => v.Nome.ToLower() == nome.ToLower());
47+
if(consEstr.Any()) return consEstr.First();
48+
return null;
49+
}
50+
51+
public Ambiente(Saida saida, List<DirectoryInfo> importacao, List<Modulo> modulos, List<Estrutura> estruturas, Trecho trecho, No no)
52+
{
53+
Estruturas = estruturas;
3654
DiretoriosImportacao = importacao;
3755
Modulos = modulos;
3856
Trecho = trecho;

Analise.cs

Lines changed: 128 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ class Analise
66
public List<Fonte> Fontes { get; set; } = new List<Fonte>();
77
// Armazena os módulos carregados, usado para compilação
88
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>();
911
// Armazena os diretorios para uso do comando Imports
1012
public List<DirectoryInfo> DiretoriosImportacao = new List<DirectoryInfo>();
1113

@@ -50,7 +52,7 @@ private TipoVariavel processaTipo(ref Trechos trechos)
5052
// Processa declaração de variável ou campo do modulo
5153
// Exemplo:
5254
// 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)
5456
{
5557
trechos.ExigeProximo("Esperado o nome da variável após o 'dim'");
5658
trechos.ExigeId("Esperado o nome da variável");
@@ -105,39 +107,40 @@ private DeclaraVariavel processaDim(NivelPublicidade publi, Modulo mod, bool var
105107
}
106108
else if(trechos.EhIdentificador() | trechos.EhTipo(TipoTrecho.Arroba) | trechos.EhTipo(TipoTrecho.Cerquilha))
107109
{
108-
LeiaVariavel.TipoLeitura varTipo = LeiaVariavel.TipoLeitura.Comum;
110+
Acao.TipoDeAcao varTipo = Acao.TipoDeAcao.Leitura;
109111
if(trechos.EhTipo(TipoTrecho.Arroba))
110112
{
111113
trechos.Proximo();
112114
trechos.ExigeId("Esperado o nome da variável");
113-
varTipo = LeiaVariavel.TipoLeitura.Desvio;
115+
varTipo = Acao.TipoDeAcao.LeituraDesvio;
114116
}
115117
if(trechos.EhTipo(TipoTrecho.Cerquilha))
116118
{
117119
trechos.Proximo();
118120
trechos.ExigeId("Esperado o nome da variável");
119-
varTipo = LeiaVariavel.TipoLeitura.Segmento;
121+
varTipo = Acao.TipoDeAcao.LeituraSegmento;
120122
}
121123
var varModulo = mod.Nome;
122-
var varNome = trechos.Atual.Conteudo;
124+
var varNome = new List<string>();
125+
varNome.Add(trechos.Atual.Conteudo);
123126
var varTrecho = trechos.Atual;
124127
trechos.Proximo();
125-
if(trechos.EhTipo(TipoTrecho.Ponto))
128+
while(trechos.EhTipo(TipoTrecho.Ponto))
126129
{
127130
trechos.Proximo();
128131
trechos.ExigeId("Esperado o nome da variável");
129-
varModulo = varNome;
130-
varNome = trechos.Atual.Conteudo;
132+
varNome.Add(trechos.Atual.Conteudo);
131133
trechos.Proximo();
132134
}
135+
Acao acao = new Acao(varTrecho, varNome, varTipo);
136+
ret = acao;
133137
if(trechos.EhTipo(TipoTrecho.AbreParenteses))
134138
{
135-
ChamaRotina chamaRotina = new ChamaRotina(varTrecho, varModulo, varNome);
136-
ret = chamaRotina;
139+
acao.Tipo = Acao.TipoDeAcao.Chamada;
137140
trechos.Proximo();
138141
while(!trechos.EhTipo(TipoTrecho.FechaParenteses))
139142
{
140-
chamaRotina.Argumentos.Add(processaExpressao(mod, rot, ref trechos));
143+
acao.ArgumentosChamada.Add(processaExpressao(mod, rot, ref trechos));
141144
if(trechos.EhTipo(TipoTrecho.Virgula))
142145
{
143146
trechos.Proximo();
@@ -149,10 +152,6 @@ private DeclaraVariavel processaDim(NivelPublicidade publi, Modulo mod, bool var
149152
}
150153
trechos.Proximo();
151154
}
152-
else
153-
{
154-
ret = new LeiaVariavel(varTrecho, varTipo, varModulo, varNome);
155-
}
156155
}
157156
return ret;
158157
}
@@ -257,7 +256,7 @@ private No processaExpressao(Modulo mod, Rotina rot, ref Trechos trechos)
257256
// let variavel = 123
258257
// let @variavel = 123
259258
// 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)
261260
{
262261
if(trechos.EhProximoTipo(TipoTrecho.Arroba) | trechos.EhProximoTipo(TipoTrecho.Cerquilha))
263262
{
@@ -277,24 +276,28 @@ private Atribuicao processaAtribuicao(Modulo mod, Rotina rot, ref Trechos trecho
277276
trechos.ExigeProximo("Esperado continuação do nome da variável");
278277
}
279278
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;
283282
if(trechos.EhTipo(TipoTrecho.Atribuicao))
284283
{
285284
trechos.ExigeTipo(TipoTrecho.Atribuicao, "Esperado '=' após o nome da variável");
286285
trechos.ExigeProximo("Esperado um valor após o '='");
287-
atrib.Valor = processaExpressao(mod, rot, ref trechos);
286+
atrib.ValorGravacao = processaExpressao(mod, rot, ref trechos);
288287
}
289288
else if(trechos.EhOpMatematica("++"))
290289
{
291290
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;
293294
}
294295
else if(trechos.EhOpMatematica("--"))
295296
{
296297
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;
298301
}
299302
else trechos.ExigeTipo(TipoTrecho.Atribuicao, "Esperado '=' ou '++' or '--' após o nome da variável");
300303
return atrib;
@@ -455,35 +458,75 @@ private void nivelRotina(Modulo mod, Rotina rot, List<No> cmds, bool apenasUmCom
455458
trechos.Proximo();
456459
goto reverifica;
457460
}
458-
else if(trechos.EhIdentificador())
461+
else if(trechos.EhIdentificador() | trechos.EhTipo(TipoTrecho.Arroba) | trechos.EhTipo(TipoTrecho.Cerquilha))
459462
{
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))
464481
{
465482
trechos.Proximo();
466483
trechos.ExigeProximo("Esperado continuação do nome da rotina");
467484
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);
470497
}
471-
ChamaRotina chama = new ChamaRotina(chamaTrecho, chamaModulo, chamaRotina);
472-
cmds.Add(chama);
473-
if(trechos.Proximo())
498+
else if(trechos.EhOpMatematica("++"))
474499
{
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)
476516
{
477-
chama.Argumentos.Add(processaExpressao(mod, rot, ref trechos));
478-
if(trechos.EhTipo(TipoTrecho.Virgula))
517+
do
479518
{
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+
}
487530
}
488531

489532
}
@@ -573,7 +616,7 @@ private void nivelModulo(Modulo mod, ref Trechos trechos)
573616

574617
if(trechos.EhIdentificador("dim"))
575618
{
576-
mod.Variaveis.Add(processaDim(publi, mod, true, ref trechos));
619+
mod.Campos.Add(processaDim(publi, mod, true, ref trechos));
577620
}
578621
else if(trechos.EhIdentificador("sub"))
579622
{
@@ -590,6 +633,28 @@ private void nivelModulo(Modulo mod, ref Trechos trechos)
590633
} while(trechos.ProximaLinha());
591634
}
592635

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+
593658
// Processa comandos do nivel raiz do codigo fonte
594659
private void nivelRaiz(ref Trechos trechos)
595660
{
@@ -609,6 +674,19 @@ private void nivelRaiz(ref Trechos trechos)
609674
trechos.ExigeId("end");
610675
trechos.ExigeProximoFimDaLinha("Esperado apenas o 'end', sem nenhum complemento posterior");
611676
}
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+
}
612690
else if(trechos.EhIdentificador("imports"))
613691
{
614692
trechos.Proximo();
@@ -671,24 +749,28 @@ public void Compila(Saida saida)
671749
Ambiente? amb = null;
672750
foreach(var mod in Modulos)
673751
{
674-
amb = amb ?? new Ambiente(saida, DiretoriosImportacao, Modulos, mod.Trecho, mod);
752+
amb = amb ?? new Ambiente(saida, DiretoriosImportacao, Modulos, Estruturas, mod.Trecho, mod);
675753
mod.Inicializa(amb);
676754
}
677755
foreach(var mod in Modulos)
678756
{
679-
amb = amb ?? new Ambiente(saida, DiretoriosImportacao, Modulos, mod.Trecho, mod);
757+
amb = amb ?? new Ambiente(saida, DiretoriosImportacao, Modulos, Estruturas, mod.Trecho, mod);
680758
mod.Otimiza(amb);
681759
}
682760

683761
// Busca e compila o módulo OS da biblioteca System, e todas suas referencias
684762
// Como o modulo OS chama o Program.Main, acaba compilando tudo que o Program usa direta ou indiretamente
685763
foreach(var mod in Modulos.Where(m => m.Nome.ToLower() == "os"))
686764
{
687-
amb = amb ?? new Ambiente(saida, DiretoriosImportacao, Modulos, mod.Trecho, mod);
765+
amb = amb ?? new Ambiente(saida, DiretoriosImportacao, Modulos, Estruturas, mod.Trecho, mod);
688766
var cons = mod.Rotinas.Where(r => r.Nome.ToLower() == "start");
689767
if(!cons.Any()) throw new Erro(mod.Trecho, "Esperado uma rotina 'OS.Start'");
690768
cons.First().IgnorarCabecalhoRodape = true;
769+
amb.Modulo = mod;
770+
amb.Rotina = cons.First();
691771
cons.First().Compila(amb);
772+
amb.Modulo = null;
773+
amb.Rotina = null;
692774
mod.Compila(amb);
693775
CompilaReferencias(mod, amb);
694776
}
File renamed without changes.
File renamed without changes.

Distro/Atual/hcbasic.dll

75.5 KB
Binary file not shown.

Distro/Atual/hcbasic.pdb

34.8 KB
Binary file not shown.

Distro/Exemplos/compilar.bat

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
hcbasic helloworld.hcb helloworld.com Plataforma\8086-DOS

Distro/Exemplos/compilar.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#!/bin/sh
2+
3+
./hcbasic helloworld.hcb helloworld.com Plataforma/8086-DOS

Distro/Exemplos/hellowolrd.hcb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
Imports System
2+
3+
Module Program
4+
Public Sub Main(args as PtrByteArray)
5+
Console.WriteLine "Hello World!!"
6+
End
7+
End

0 commit comments

Comments
 (0)