/// <summary> /// método responsável por analisar a garantia da gramática e semantica do programa /// </summary> public void AnalisadorSintatico() { lexico.AbreArquivo(); //rotulo = 1 -- disable token = lexico.AnalisadorLexico(); if (token.Simbolo == Simbolo.Sprograma) { geradorCodigo.GerarCodigo(Codigo.START,new string[] { }); ObtemTokenLexico(); if (token.Simbolo == Simbolo.Sidentificador) { //insere tabela(token.lexema, nome do programa, "","") -- disable tabelaSimbolos.InserirTabela(new ProgramaSimbolo {Lexema = token.Lexema }); // insere na tabela de simbolos o programa semantico.PilhaRetornoFuncao.Push(token.Clonar()); ObtemTokenLexico(); if (token.Simbolo == Simbolo.Spontovirgula) { AnalisaBloco(); semantico.PilhaRetornoFuncao.Pop(); //gerador de codigo, gera o comando Dalloc int qtdVariaveis = geradorCodigo.PilhaQtdVariaveisAlocadas.Pop(); if (qtdVariaveis != 0) { //gera um dalloc geradorCodigo.BaseVariavel -= qtdVariaveis; // decrementa a base geradorCodigo.GerarCodigo(Codigo.DALLOC, new string[] { geradorCodigo.BaseVariavel.ToString(), qtdVariaveis.ToString() }); } if (token.Simbolo == Simbolo.Sponto) { geradorCodigo.GerarCodigo(Codigo.HLT, new string[] { }); // verifica se acabou arquivo ou é comentário ObtemTokenLexico(); if (token.Simbolo != Simbolo.Ssemtoken) { //erro token a mais throw new ErroException(String.Format("Linha: {0}. Erro Sintático! Código excedente encontrado!", token.Linha),token.Linha); } //gerador do arquivo } else { //erro falta ponto throw new ErroException(String.Format("Linha: {0}. Erro Sintático! \".\" esperado!", token.Linha), token.Linha); } } else { //erro falta ponto virgula throw new ErroException(String.Format("Linha: {0}. Erro Sintático! \";\" esperado!", token.Linha), token.Linha); } } else { //erro falta identificador throw new ErroException(String.Format("Linha: {0}. Erro Sintático! Nome do programa esperado!", token.Linha), token.Linha); } } else { //erro falta: sprograma throw new ErroException(String.Format("Linha: {0}. Erro Sintático! \"programa\" esperado!", token.Linha), token.Linha); } lexico.FechaArquivo(); }
/// <summary> /// metodo responsável por inserir um token ou na pilha de prioridade ou na lista da pós-fixa /// conforme a logica de geração da pós-fixa /// </summary> /// <param name="item"></param> public void InserePosFixa(Token item) { Token novoItem = item.Clonar(); // se for um identificador insere direto na lista if (novoItem.Simbolo == Simbolo.Sidentificador || novoItem.Simbolo == Simbolo.Snumero || novoItem.Simbolo == Simbolo.Sverdadeiro || novoItem.Simbolo == Simbolo.Sfalso) InsereLista(novoItem); else InserePilha(novoItem); }