Skip to content

Commit 5bbb919

Browse files
Diversas correções e melhorias dos ultimos dias para versao 0.9.6 - Pre Lançamento
1 parent 427f584 commit 5bbb919

File tree

84 files changed

+4490
-1419
lines changed

Some content is hidden

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

84 files changed

+4490
-1419
lines changed

Ambiente.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ class Ambiente
22
{
33
// Aqui armazena variaveis de ambiente usadas por todas as etapas da compilação
44

5+
public bool DentroDeUmTryCatch { get; set; } = false;
56
public byte TamanhoStringPilha { get; set; } = 128;
67
public byte TamanhoStringEstatica { get; set; } = 255;
78

@@ -11,6 +12,8 @@ class Ambiente
1112
public List<Modulo> Modulos { get; set; }
1213
// Todos as Estruturas carregados
1314
public List<Estrutura> Estruturas { get; set; }
15+
// Todos os erros possíveis
16+
public List<RegistroDeErro> Erros { get; set; }
1417
// Modulo atual durante o processamento
1518
public Modulo? Modulo { get; set; } = null;
1619
// Rotina atual durante o processamento
@@ -55,8 +58,9 @@ public void CadastraReferencia(Modulo mod)
5558
return null;
5659
}
5760

58-
public Ambiente(Saida saida, List<DirectoryInfo> importacao, List<Modulo> modulos, List<Estrutura> estruturas, Trecho trecho, No no)
61+
public Ambiente(Saida saida, List<DirectoryInfo> importacao, List<RegistroDeErro> erros, List<Modulo> modulos, List<Estrutura> estruturas, Trecho trecho, No no)
5962
{
63+
Erros = erros;
6064
Estruturas = estruturas;
6165
DiretoriosImportacao = importacao;
6266
Modulos = modulos;

Analise.cs

Lines changed: 70 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ class Analise
22
{
33
// Variaveis de uso comum do analisador
44

5+
6+
// Registro de erros possiveis no codigo fonte
7+
public List<RegistroDeErro> Erros { get; set; } = new List<RegistroDeErro>();
58
// Armazena os códigos fontes analisados
69
public List<Fonte> Fontes { get; set; } = new List<Fonte>();
710
// Armazena os módulos carregados, usado para compilação
@@ -27,9 +30,9 @@ public Analise(List<DirectoryInfo> dirs)
2730
// Processa tipo de uma variável
2831
// Usado quando se declara o tipo da variável, por exemplo:
2932
// Dim variavel as TIPO
30-
private TipoVariavel processaTipo(ref Trechos trechos)
33+
public static TipoVariavel ProcessaTipo(string tipo)
3134
{
32-
switch(trechos.Atual.Conteudo.ToLower())
35+
switch(tipo)
3336
{
3437
case "int8":
3538
return TipoVariavel.Int16;
@@ -51,11 +54,15 @@ private TipoVariavel processaTipo(ref Trechos trechos)
5154
return TipoVariavel.Structure;
5255
}
5356
}
57+
private TipoVariavel processaTipo(ref Trechos trechos)
58+
{
59+
return ProcessaTipo(trechos.Atual.Conteudo.ToLower());
60+
}
5461

5562
// Processa declaração de variável ou campo do modulo
5663
// Exemplo:
5764
// 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)
5966
{
6067
trechos.ExigeProximo("Esperado o nome da variável após o 'dim'");
6168
trechos.ExigeId("Esperado o nome da variável");
@@ -76,6 +83,7 @@ private DeclaraVariavel processaDim(NivelPublicidade publi, Estrutura mod, bool
7683
TipoVariavel tipoRetorno = TipoVariavel.UInt16;
7784
string tipoRetornoNome = "uint16";
7885
DeclaraVariavel dim = new DeclaraVariavel(dimTrecho, mod, varDoModulo, publi, dimTipo, dimTipoNome, dimColecao, dimColecaoTam);
86+
dim.EstruturaEstaticaApenasPonteiro = apenasPonteiro;
7987
if(dimTipo == TipoVariavel.Func | dimTipo == TipoVariavel.Action)
8088
{
8189
trechos.ExigeTipo(TipoTrecho.AbreParenteses, $"Esperado '(' após '{dimTipoNome}'");
@@ -450,12 +458,12 @@ private void nivelRotina(Modulo mod, Rotina rot, List<No> cmds, bool apenasUmCom
450458
do
451459
{
452460
reverifica:
453-
if(trechos.EhIdentificador("end") | trechos.EhIdentificador("else")) break;
461+
if(trechos.EhIdentificador("end") | trechos.EhIdentificador("else") | trechos.EhIdentificador("catch")) break;
454462

455463

456464
if(trechos.EhIdentificador("dim"))
457465
{
458-
rot.Variaveis.Add(processaDim(NivelPublicidade.Local, mod, false, ref trechos));
466+
rot.Variaveis.Add(processaDim(NivelPublicidade.Local, mod, false, false, ref trechos));
459467
}
460468
else if(trechos.EhIdentificador("let"))
461469
{
@@ -491,9 +499,37 @@ private void nivelRotina(Modulo mod, Rotina rot, List<No> cmds, bool apenasUmCom
491499
cmds.Add(new VaPara(trechos.Atual));
492500
trechos.Proximo();
493501
}
494-
else if(trechos.EhIdentificador("invoke"))
502+
else if(trechos.EhIdentificador("throw"))
495503
{
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();
497533
}
498534
else if(trechos.EhIdentificador() & trechos.EhProximoTipo(TipoTrecho.DoisPontos))
499535
{
@@ -650,9 +686,10 @@ private Rotina processaSubFunction(Modulo mod, NivelPublicidade publi, bool reto
650686
// end
651687
private void nivelModulo(Modulo mod, ref Trechos trechos)
652688
{
653-
NivelPublicidade publi = NivelPublicidade.Privado;
654689
do
655690
{
691+
NivelPublicidade publi = NivelPublicidade.Privado;
692+
bool apenasPonteiro = false;
656693
if(trechos.EhIdentificador("end")) break;
657694
publi = NivelPublicidade.Privado;
658695
if(trechos.EhIdentificador("public"))
@@ -665,21 +702,29 @@ private void nivelModulo(Modulo mod, ref Trechos trechos)
665702
publi = NivelPublicidade.Privado;
666703
trechos.Proximo();
667704
}
705+
if(trechos.EhIdentificador("pointer"))
706+
{
707+
apenasPonteiro = true;
708+
trechos.Proximo();
709+
}
668710

669711
if(trechos.EhIdentificador("dim"))
670712
{
671-
mod.Campos.Add(processaDim(publi, mod, true, ref trechos));
713+
mod.Campos.Add(processaDim(publi, mod, true, apenasPonteiro, ref trechos));
672714
}
673715
else if(trechos.EhIdentificador("sub"))
674716
{
717+
if(apenasPonteiro) trechos.Erro("Marcador Pointer não é compatível com rotinas");
675718
mod.Rotinas.Add(processaSubFunction(mod, publi, false, ref trechos));
676719
}
677720
else if(trechos.EhIdentificador("function"))
678721
{
722+
if(apenasPonteiro) trechos.Erro("Marcador Pointer não é compatível com rotinas");
679723
mod.Rotinas.Add(processaSubFunction(mod, publi, true, ref trechos));
680724
}
681725
else if(!trechos.FimDaLinha)
682726
{
727+
if(apenasPonteiro) trechos.Erro("Esperado alguma declaração de variável");
683728
trechos.Erro("Comando desconhecido");
684729
}
685730
} while(trechos.ProximaLinha());
@@ -698,7 +743,7 @@ private void nivelEstrutura(Estrutura estrutura, ref Trechos trechos)
698743

699744
if(trechos.EhIdentificador("dim"))
700745
{
701-
estrutura.Campos.Add(processaDim(NivelPublicidade.Publico, estrutura, true, ref trechos));
746+
estrutura.Campos.Add(processaDim(NivelPublicidade.Publico, estrutura, true, false, ref trechos));
702747
}
703748
else if(!trechos.FimDaLinha)
704749
{
@@ -739,6 +784,19 @@ private void nivelRaiz(ref Trechos trechos)
739784
trechos.ExigeProximoFimDaLinha("Esperado apenas o 'end', sem nenhum complemento posterior");
740785

741786
}
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+
}
742800
else if(trechos.EhIdentificador("imports"))
743801
{
744802
trechos.Proximo();
@@ -813,7 +871,7 @@ private void CompilaReferencias(Modulo mod, Ambiente amb)
813871
// Compila codigo fonte
814872
public void Compila(Saida saida)
815873
{
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());;
817875

818876

819877
foreach (var estru in Estruturas)
@@ -854,5 +912,6 @@ public void Compila(Saida saida)
854912
amb.Saida.EmiteItemRealocacao(realoc);
855913
}
856914
amb.Saida.EmiteItemRealocacao(new Realocacao(TipoDeRealocacao.FimLista, 0, "0", 0));
915+
amb.Saida.EmiteRotulo("END");
857916
}
858917
}

Distro/Atual/hcbasic.dll

9.5 KB
Binary file not shown.

Distro/Atual/hcbasic.pdb

3.27 KB
Binary file not shown.

Distro/Exemplos/helloworld.hcb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,17 @@ Imports System
33
Module Program
44
Public Sub Main(args as PtrByteArray)
55
Console.WriteLine "Hello World!!"
6+
Try
7+
Dim teste1 as UInt16
8+
Dim teste2 as UInt16
9+
teste1 = 0
10+
teste2 = 10 / teste1
11+
Catch DivByZeroError
12+
Console.WriteLine "Teste de erro por divisão por zero"
13+
Console.Write "Arquivo: "
14+
Console.WriteLine ErrorFile()
15+
Console.Write "Linha..: "
16+
Console.WriteUInt16 ErrorLine()
17+
End
618
End
719
End

0 commit comments

Comments
 (0)