Essa é uma formalização do algoritmo clássico de remoção de recursão à esquerda de Greibach. O algoritmo é baseado na premissa de que a recursão à esquerda pode ser eliminada de uma gramática livre de contexto (GLC) sem alterar a linguagem gerada pela GLC.
A implementação do algoritmo foi realizada utilizando a linguagem de programação Racket, com as bibliotecas PLT Redex
e RackCheck
. O PLT Redex é uma biblioteca integrada ao Racket que facilita a especificação de sistemas de redução sensíveis ao contexto, enquanto o RackCheck é uma biblioteca de testes baseados em propriedades para Racket. Durante o desenvolvimento, utilizou-se o DrRacket
como ambiente de desenvolvimento integrado (IDE), na versão 8.8
Abra o arquivo validador.rkt
e clique em Run
. Caso deseje modificar o tamanho da gramática, altere os valores das variáveis no arquivo gerador.rkt
:
max-trms
: quantidade máxima de terminaismin-trms
: quantidade mínima de terminaismax-non-trms
: quantidade máxima de não-terminaismin-non-trms
: quantidade mínima de não-terminaismax-rhs
: quantidade máxima de termos no lado direito da regramax-seq
: tamanho máximo de um termo no lado direito da regra
Esses valores são utilizados para gerar gramáticas aleatórias que serão utilizadas nos testes. A quantidade de testes e o tempo limite para execução de cada teste podem ser alterados no arquivo validador.rkt
.
Para executar somente o algoritmo de remoção de recursão à esquerda, abra o arquivo classico.rkt
e insira o código abaixo e insira a gramática que deseja remover a recursão à esquerda e clique em Run
.
Exemplo:
; Alterar o valor de input para a gramática desejada
(define input '(
(S ((B 2) (A 4) (2)))
(C ((A) (7 2)))
(B ((S 2) (B 3)))
(A ((C A) (S 2)))
(B ((A) (7 2)))
))
(define orded-prds (ord-rhs (unify-prds input)))
(traces i--> orded-prds)