Análise da gramática LL1. Mais um gerador de analisador de cima para baixo.

A calculadora verifica a correção da gramática LL1, analisa um texto utilizando a gramática, exibe os conjuntos FIRST, FOLLOW e FIRST PLUS, analisando a árvore além de fornecer o código de análise PLANETCALC.

Esta página existe graças aos esforços das seguintes pessoas:

Anton

Julia Gomes

Criado: 2021-05-28 19:41:46, Ultima atualização: 2021-05-28 19:41:46
Creative Commons Attribution/Share-Alike License 3.0 (Unported)

Este conteúdo é licenciado de acordo com a Licença Creative Commons de Atribuição/CompartilhaIgual 3.0 (Unported). Isso significa que você pode redistribuir ou modificar livremente este conteúdo sob as mesmas condições de licença e precisa atribuir ao autor original colocando um hyperlink para este trabalho no seu site. Além disto, favor não modificar qualquer referência ao trabalho original (caso houver) que estiverem contidas neste conteúdo.

A calculadora a seguir gera o código do analisador pela gramática fornecida na forma EBNF. Nós utilizamos a gramática clássica de expressão matemática como exemplo.

O resultado pode ser usado para criar o analisador LL(1) usando a biblioteca PCP disponível neste site.
Exemplo de código:

var parser = novo PCP.parser
( [/* coloque o código gerado aqui */] );
//cria árvore de análise
var tree = parser.parse( texto ); 
//resultado de travessia
tree.visit( {
/* defina travesia personalizada
funções aqui com nomes
de acordo com sua gramática 
(nomes nt1 e nt2 estão escolhidos
aqui apenas para fins ilustrativos);*/
   "nt1": função ( v ) {
        // use para obter o valor da expressão: 
       //  v.getValue()
    }
   ,"nt2": função ( v ) {
        // use para travessia de crianças: 
       //  v.visit( childvisitor );
    }
});

Alguns detalhes sobre a sintaxe EBNF e o uso desta calculadora estão abaixo da calculadora.

PLANETCALC, Gerador de analisador LL1

Gerador de analisador LL1

Gramática BNF estendida na forma ISO/IEC 14977 : 1996(E).
Nomes de regras divididos por vírgula, que devem ser removidos.
O arquivo é muito grande; pode ocorrer lentidão do navegador durante o carregamento e a criação.
Código do analisador PLANETCALC
 
O arquivo é muito grande; pode ocorrer lentidão do navegador durante o carregamento e a criação.
Resultado de análise de expressão
 

Formalismo de Backus-Naur Estendido (EBNF)

O EBNF possui muitas vantagens em comparação ao BNF simples:

  • A regra EBNF pode conter algumas linhas de texto. O final da regra é marcado por ponto e vírgula (;).

    caractere terminal
    = letra
    | dígito decimal
    | símbolo de concatenação
    | símbolo definidor
    | símbolo separador de definição
    | símbolo de fim de comentário
    | símbolo do grupo final
    | símbolo de opção final
    | símbolo de repetição final
    | símbolo de exceção
    | primeiro símbolo de citação
    | símbolo de repetição
    | segundo símbolo de citação
    | símbolo de sequência especial
    | símbolo de comentário inicial
    | símbolo de grupo de início
    | símbolo de opção de início
    | iniciar de repetição inicial
    | símbolo terminador
    | outro caractere;

  • Os símbolos não terminais não devem ser marcados por colchetes angulares (mas todos os símbolos terminais devem estar entre aspas simples ou duplas).

    dígito decimal = ’0’ | ’1’ | ’2’ | ’3’ | ’4’ | ’5’ | ’6’ | ’7’| ’8’ | ’9’;

  • O EBNF possui uma sintaxe especial para fecho de Kleene - qualquer expressão entre colchetes pode ser repetida zero ou mais vezes:

    sintaxe= regra de sintaxe, {regra de sintaxe};

  • As exceções podem ser definidas utilizando um sinal de menos. Por exemplo, o seguinte trecho do padrão EBNF define qualquer símbolo, exceto uma aspa simples:

primeiro caractere terminal= caractere terminal - primeiro símbolo de aspas;

A descrição completa do EBNF pode ser encontrada no padrão ISO/IEC 14977.

Extensões padrão EBNF

Algumas extensões padrão EBNF são implementadas na calculadora acima. Como uma sequência especial, você pode usar uma expressão regular ou código de símbolo hexadecimal. Por exemplo, para uma nova linha, você pode utilizar a seguinte regra, definida por dois símbolos hexadecimais:

lineend= ?0xd?,?0xa?;

Por exemplo, a regra a seguir baseada em expressão regular pode ser usada para correspondência de símbolos não imprimíveis:

sp=?/\s+/?;

Análise gramatical

A calculadora realiza uma análise gramatical simples. Ela detecta os seguintes erros e condições inaceitáveis:

  • Erros de sintaxe gramatical
  • Regra de raiz ausente
  • Averiguação de regra de raiz única
  • Recursão à esquerda
  • Condição de análise livre de back-track

Escaneamento e análise combinados

Na teoria clássica do compilador, existe uma etapa de varredura que produz tokens do stream de entrada. Durante a varredura, todos os símbolos desnecessários, por exemplo, os não imprimíveis e os comentários são separados dos tokens, que futuramente são utilizados na etapa de análise. Geralmente, os scanners são baseados em expressões regulares. Esta calculadora faz a varredura e a análise da mesma maneira, usando apenas uma gramática. Normalmente, se você definir uma única gramática para varredura e análise, a gramática se irá se tornar muito complexa. Para simplificar a gramática, permitimos dividir a gramática inteira em várias partes, cada uma com sua própria regra de raiz. A caixa de entrada Remover regras define as regras a serem removidas durante as etapas de análise preliminar (varredura). Para ver um exemplo de gramática com duas etapas de análise e tokens a serem removidos na etapa de análise preliminar, clique no link a seguir:

Exemplo de gramática em duas etapas

Literatura:

URL copiado para a área de transferência
PLANETCALC, Análise da gramática LL1. Mais um gerador de analisador de cima para baixo.

Comentários