Giter VIP home page Giter VIP logo

portugol-nucleo's Issues

Divisão por 0 no tipo real

Quando é realizado uma divisão por zero com o tipo real, não está sendo gerado um erro de execução. O que acontece é que o resultado da operação é "infinity".
substituir esse comportamento por uma pausa na execução e aviso de erro, similar ao que acontece na divisão por zero com números inteiros.

Semântico permite utilizar uma variável como se fosse uma função

O analisador semântico permite utilizar um nome de variável como se fosse uma função.
O erro não é detectado durante a análise semântica, mas dá erro durante a execução do algoritmo.
Segue abaixo o algoritmo utilizado para identificar o erro:

programa
{
    funcao inicio(cadeia parametros[])
    {
        inteiro soma = 24

        soma(2, 3)
    }
}

O erro gerado durante a execução é: "java.lang.ClassCastException: br.univali.portugol.nucleo.simbolos.Variavel cannot be cast to br.univali.portugol.nucleo.simbolos.Funcao".

Problema no retorene durante a interpretação e nullpointe durante depuração

segue código que o Raabe identificou o problema.

programa {

funcao desenha(caracter x[]){

   para(inteiro i = 0; i < 5; i++)
    {
        escreva (x[i], branco(3) )
    }
}

funcao branco (inteiro n){
    para(inteiro i = 0; i < n; i++){
      escreva (" ")
    }
}

funcao inteiro fat (inteiro n){
    inteiro r
    se (n <= 1){ 
        retorne (1)
    }
    senao{
      r = n * fat (n-1)
      retorne (r)
    }
}

funcao inicio(){
    caracter x[5] = {'a','n','d','r','e'}
    //desenha (x)
escreva (fat(4))


}

}

Bug na depuração normal

Durante a depuração normal, alguma instruções estão sendo puladas, pois não estão sendo elegidas para depuração pelo detector de nós de parada.

Na depuração detalhada eles são detectados corretamente.

No código abaixo, o 2º escreva dentro do 'se' é pulado sempre.
O 1º escreva após o 'se' também e pulado.

programa
{
    funcao inicio() 
    {
        //escreva(fatorial(5))
        
        inteiro a       
        a = 0

        para (a = 0; a <= 10; a++)
        {
            escreva("\n", a)
        
            se (a == 5)
            {
                pare
            }

            escreva("Não passa aqui")
        }

        escreva("Pula esse")
        escreva("Passa esse")
    }

    funcao inteiro fatorial(inteiro n) 
    {
        se ( n <= 1)
            retorne 1
        senao 
        {
            retorne n * fatorial(n-1)   
        }
    }
    
}

Bug na passagem de parâmetros da função no interpretador

Ao chamar uma função, o parâmetro vem com o valor errado se houver um símbolo local com o mesmo nome do parâmetro

programa
{
    funcao inicio()
    {
        inteiro a = 50
        
        teste(a)
    }

    funcao teste(inteiro a)
    {
                //Deveria imprimir 50, mas está imprimindo 0
        escreva(a)
    }
}

não indica erro semântico atribuição em array

ex:
programa
{
funcao inicio(cadeia parametros[])
{
inteiro a[] = {1,2,3,4}
a = 2
teste(a)
}

funcao vazio teste(inteiro variavel[])
{
    escreva(variavel[1])    
}

}

o programa executa mas não imprime

Se o programa for interrompido durante a depuração de uma função recursiva, dá pau

// Este exemplo demostra um fatorial gerado recursivamente.
// O exemplo pede ao usuário um valor e ao fim é exibido o fatorial deste número.
programa
{

// Função recursiva que calcula o fatorial do número passado
funcao inteiro fatorial(inteiro numero){
se(numero == 1){
retorne 1
}
retorne numero*fatorial(numero-1)
}
funcao inicio()
{
inteiro valor
escreva("Digite um número inteiro para saber o fatorial dele: ")
leia(valor)
escreva("O fatorial do número digitado é: ",fatorial(valor)) // chama a função recursiva e exibe o valor final
}
}

Add suporte a operações com numeros binarios

<< Bitwise left shift

Bitwise right shift
& Bitwise AND
^ Bitwise XOR
| Bitwise OR
<<= Atribuição com bitwise left shift
= Atribuição com bitwise right shift
&= Atribuição com bitwise AND
^= Atribuição com bitwise XOR
|= Atribuição com bitwise OR

valores hexa passam a ser considerados como inteiros.
ex:
inteiro teste = 0xAf01

Incluir métodos "Continuar" e "Retomar" no depurador

No depurador, implementar um método/funcionalidade para permitir que o usuário pule todos os passos da depuração a partir do ponto de parada atual, e assim finalize a execução do algoritmo.

Supondo que o algoritmo abaixo estivesse sendo depurado, e que o depurador estivesse na segunda instrução, ao acionar este método, o algoritmo terminaria a execução, imprimindo todos os dados na saída.

programa
{
    funcao inicio()
    {
        escreva("\n", 1)
        escreva("\n", 2)
        escreva("\n", 3)
        escreva("\n", 4)
        escreva("\n", 5)
    }
}

De forma semelhante, pode haver um método para retomar a depuração passo a passo quando o depurador estiver no estado "Continuar".

Por exemplo, ao depurar o programa abaixo, suponha que o usuário informou o valor 1.000.000 para variável e depois chamou o método continuar no depurador.

Ao fazer isso, o programa passaria a executar as instruções dentro do laço sem interagir novamente com o usuário, até que a condição do laço fosse satisfeita.

No entanto, ao chamar o método retomar do depurador, o depurador pararia na instrução que está sendo executada atualmente permitindo que o usuário continuasse depurando passo a passo a partir desta instrução.

programa
{
    funcao inicio()
    {
        inteiro a = 0, b = 0
 
        leia(b)

        enquanto (a <= b)
        {
             escreva(a, "\n")
             a = a + 1
        }
    }
}

Semântico deixa passar variável não declarada no "retorne".

A análise semântica não está sendo realizada corretamente nos retornos de função.
Ao executar o algoritmo abaixo é gerada uma exceção no Java.
O semântico deveria ter acusado a variável "b" como não declarada.

programa
{
    funcao inicio(cadeia parametros[])
    {
        inteiro a = 23

        escreva(incrementa(a))
    }

    funcao inteiro incrementa(inteiro a)
    {
        a = a + 1       

        retorne b
    }
}

Stacktrace:

Erro: java.lang.NullPointerException
at br.univali.portugol.nucleo.execucao.Interpretador.obterValorVariavel(Interpretador.java:1484)
at br.univali.portugol.nucleo.execucao.Interpretador.obterValorReferencia(Interpretador.java:1288)
at br.univali.portugol.nucleo.execucao.Interpretador.obterValorExpressao(Interpretador.java:584)
at br.univali.portugol.nucleo.execucao.Interpretador.interpretarBloco(Interpretador.java:378)
at br.univali.portugol.nucleo.execucao.Interpretador.interpretarListaBlocos(Interpretador.java:347)
at br.univali.portugol.nucleo.execucao.Interpretador.obterValorFuncao(Interpretador.java:1532)
at br.univali.portugol.nucleo.execucao.Interpretador.obterValorReferencia(Interpretador.java:1335)
at br.univali.portugol.nucleo.execucao.Interpretador.obterValorExpressao(Interpretador.java:584)
at br.univali.portugol.nucleo.execucao.Interpretador.escreva(Interpretador.java:1392)
at br.univali.portugol.nucleo.execucao.Interpretador.obterValorReferencia(Interpretador.java:1305)
at br.univali.portugol.nucleo.execucao.Interpretador.obterValorExpressao(Interpretador.java:584)
at br.univali.portugol.nucleo.execucao.Interpretador.interpretarBloco(Interpretador.java:404)
at br.univali.portugol.nucleo.execucao.Interpretador.interpretarListaBlocos(Interpretador.java:347)
at br.univali.portugol.nucleo.execucao.Interpretador.interpretarFuncaoPrincipal(Interpretador.java:316)
at br.univali.portugol.nucleo.execucao.Interpretador.interpretar(Interpretador.java:104)
at br.univali.portugol.nucleo.Programa$1.run(Programa.java:109)
at java.lang.Thread.run(Thread.java:662)

Travamento após consertar erro de sintaxe

depois de usar caracteres especiais como: ç á ê , ; em locais indevidos na segunda execução já com os caracteres removidos o Portugol-Nucleo para de responder.

Parada extra no debug do laço para

Ao realizar a depuração detalhada no laço para, é feito o highlight na condição antes de realizar o highlight na declaração, essa primeira parada não deveria acontecer.

mudança na declaracao de vetor e matriz

funcao inicio()
{
inteiro vet1[5]
//inteiro vet2[5] = {1,2,3,4,5} <-- eliminar essa construção
inteiro vet3[] = {9,8,7,6,5}

    //permitir o seguinte caso:
    inteiro tamanho
    leia(tamanho)
    real vetor[tamanho]

}

Bug na declaração de parâmetros das funções

Ao declarar diferentes funções ("a" e "b") com os mesmos nomes de parâmetros, o semântico acusa que os parâmetros da função "b" já foram declarados, pois a função "a" possui os mesmo nomes de parâmetros.

Ex.:

programa
{
    funcao inicio()
    {   
        escreva(multiplica(5, 10))
        
        escreva(divide(2, 1))
    }

    funcao real multiplica(real k, real f)
    {
        retorne k * f
    }

    funcao real divide(inteiro k, inteiro f)
    {
        
    }
}

Erro ao passar um vetor por parâmetro a uma função.

Quando é mandada a variável, aparece um erro dizendo que a variável que no caso é um vetor está sendo usado como uma variável simples.

Algoritmo que gera o erro:

programa
{
funcao inicio(cadeia parametros[])
{
inteiro a[] = {1,2,3,4}
teste(a)
}

funcao vazio teste(inteiro variavel[])
{
escreva(variavel[1])
}
}

terminar bibliotecas.

falta vericar as funcoes que o andre escreveu em uma folha que esta com o noschang.

Obrigar inicialização das variáveis

Retirar a inicialização das variáveis com zero, ou então impedir o uso delas quando não foram inicializadas.
Os alunos estão começando a usar o C e estão sempre esquecendo de inicializar as variáveis

- Os objects dentro da matriz são nós da árvore e não valores

programa
{
inclua biblioteca Teste --> util
funcao inicio()
{
inteiro a[2][2] = {{1, 2}, {3, 4}}

util.teste(a)
}
}

package br.univali.portugol.nucleo.bibliotecas;

import br.univali.portugol.nucleo.bibliotecas.base.Biblioteca;
import br.univali.portugol.nucleo.bibliotecas.base.ReferenciaMatriz;
import br.univali.portugol.nucleo.bibliotecas.base.TipoBiblioteca;
import br.univali.portugol.nucleo.bibliotecas.base.anotacoes.Autor;
import br.univali.portugol.nucleo.bibliotecas.base.anotacoes.DocumentacaoBiblioteca;
import br.univali.portugol.nucleo.bibliotecas.base.anotacoes.DocumentacaoFuncao;
import br.univali.portugol.nucleo.bibliotecas.base.anotacoes.DocumentacaoParametro;
import br.univali.portugol.nucleo.bibliotecas.base.anotacoes.PropriedadesBiblioteca;
import br.univali.portugol.nucleo.mensagens.ErroExecucao;
import java.util.Random;

@PropriedadesBiblioteca(tipo = TipoBiblioteca.COMPARTILHADA)
@DocumentacaoBiblioteca
(
descricao = "Esta biblioteca contém diversas funções utilitárias",
versao = "1.0"
)
public final class Teste extends Biblioteca
{
private Random random = new Random(System.currentTimeMillis());

@DocumentacaoFuncao
(
    descricao = "Descobre o número de elementos existentes em um vetor",
    parametros = 
    {
        @DocumentacaoParametro(nome = "vetor", descricao = "o vetor em questão")
    },
    retorno = "O número de elementos existentes no vetor",
    autores = 
    {
        @Autor(nome = "Luiz Fernando Noschang", email = "[email protected]")
    }
)
public void teste(ReferenciaMatriz<Integer> matriz) throws ErroExecucao
{
    System.out.println(matriz.obterValor(0, 0) + 1);
}

}

Número real com vírgula entrega mensagem ruim

construções como: 2,5 - 3,78 apresentam a mensagem padrão do erro MissignTokenException. Melhorar a mensagem para algo parecido com: "valores reais devem utilizar o caracter . como separador decimal".

Travamento após a correção de erro e execução

Investigar travamento. Uma das suspeitas é o mecanismo threads utilizado para chamar as funções do núcleo dentro do Portugol Studio.

Um travamento constante possuí a seguinte característica:

1 - O código possui erros,
2 - Corrige-se os erros e rapidamente clique em play
3 - repita os passos com rapidez e algum momento a IDE travará;

outro cenário que chama atenção é:
1 - Códigos que possuem avisos do semântico. (sublinhado amarelo)

Engolindo stack overflow

programa
{
funcao inicio()
{
teste(1,'a')
}
funcao inteiro teste(inteiro a, caracter test)
{
teste(1,'a')
}
}

Loop infinito no leia

A função leia não avisa que o dado informado pelo usuário é do tipo incorreto e pede novamente o valor fazendo com que o leia permaneça executando, isso prejudica a usabilidade.

Bug na inicialização de variáveis

Se a inicialização da variável for uma chamada de função, o semântico acusa a variável como ão inicializada.

Ex.:

programa
{
    funcao inicio()
    {
                // Não funciona!
        real teste = 2 * multiplica(10.0, 5.0)

               // Funciona !
               //real teste = 2.0

        escreva(teste)
    }

    funcao real multiplica(real k, real f)
    {
        retorne k * f
    }
}

Erro na inicialização do vetor

Ao executar o seguinte algoritmo:

programa
{
    funcao inicio(cadeia parametros[])
    {
        inteiro vetor[5] = {50, 40, 30, 20, 10}

        para (inteiro i = 0; i < tamanho(vetor); i++)
        {
//          escreva("Digite um valor: ")
//          leia(vetor[i])
        }
        para (inteiro i = 0; i < tamanho(vetor); i++)
            escreva("Vetor[", i, "] = ", vetor[i], "\n")
    }
}

A primeira execução exibe os valores 50, 40, 30, 20, 10.
A segunda execução exibe os valores 0, 0, 0, 0, 0.

const não está funcionando da forma adequada.

No código abaixo o analisador semantico permiti declarar uma constante sem inicializa-la e permite alterar seu valor.

programa
{
    funcao inicio(cadeia parametros[])
    {
        const inteiro a 
        a = 20
        escreva(a)
    }
}

Laço "para" exige o primeiro parametro

Construções do comando para sem o primeiro parâmetro deveriam ser validas.

Exemplo de construção com erro:

inteiro c = 10
para( ; c > 0; c--){
escreva(c)
}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.