Pergunta

Eu tenho lex utilizado e yacc (mais geralmente bisonte) no passado para vários projetos, geralmente tradutores (como um subconjunto de EDIF transmitidos para um aplicativo EDA). Além disso, eu tive que código de suporte com base em décadas lex / yacc gramáticas datam. Então eu sei o meu caminho em torno das ferramentas, embora eu não sou nenhum perito.

Eu vi comentários positivos sobre Antlr em vários fóruns no passado, e estou curioso para saber o que pode estar faltando. Então, se você já usou ambos, por favor me diga o que é melhor ou mais avançado em Antlr. Meus restrições atuais são de que eu trabalho em uma loja de C ++, e qualquer produto que nós enviamos não irá incluir Java, de modo que os analisadores resultantes teria que seguir essa regra.

Foi útil?

Solução

Atualização / aviso: Esta resposta pode estar desatualizado

!

Uma diferença importante é que ANTLR gera um LL (*) analisador, enquanto YACC e Bison ambos geram analisadores que estão LALR. Esta é uma distinção importante para um número de aplicações, a maioria dos operadores ser óbvio:

expr ::= expr '+' expr
       | expr '-' expr
       | '(' expr ')'
       | NUM ;

ANTLR é inteiramente incapaz de lidar com essa gramática como está. Para usar ANTLR (ou qualquer outro gerador de analisador LL), você precisa converter este gramática para algo que não é deixado-recursiva. No entanto, Bison tem nenhum problema com gramáticas desta forma. Você precisaria declarar '+' e '-' como operadores associativos à esquerda, mas isso não é estritamente necessário para recursão esquerda. Um exemplo melhor seria envio:

expr ::= expr '.' ID '(' actuals ')' ;

actuals ::= actuals ',' expr | expr ;

Observe que tanto o expr e as regras actuals são deixados-recursiva. Isso produz um AST muito mais eficiente quando se trata de tempo para geração de código, pois evita a necessidade de múltiplos registros e derramamento desnecessário (uma árvore de esquerda pode ser desabaram enquanto uma árvore de inclinação direito não pode).

Em termos de gosto pessoal, eu acho que as gramáticas LALR são muito mais fáceis de construir e depurar. A desvantagem é que você tem que lidar com erros tanto enigmáticas como shift-reduzir e (o temido) reduz-reduz. Estes são erros que Bison pega ao gerar o analisador, por isso não afeta a experiência do usuário final, mas pode fazer o processo de desenvolvimento um pouco mais interessante. ANTLR é geralmente considerado para ser mais fácil de usar do que YACC / Bison precisamente por essa razão.

Outras dicas

A diferença mais significativa entre YACC / Bison e ANTLR é o tipo de gramáticas dessas ferramentas pode processar. YACC / Bison gramáticas alça LALR, alças ANTLR LL gramáticas.

Muitas vezes, as pessoas que trabalharam com gramáticas LALR por um longo tempo, vai encontrar a trabalhar com LL gramáticas mais difícil e vice-versa. Isso não significa que as gramáticas ou ferramentas são inerentemente mais difíceis de trabalhar. Qual ferramenta você achar mais fácil de usar a maioria irá descer para a familiaridade com o tipo de gramática.

Quanto vantagens ir, há aspectos em que gramáticas LALR têm vantagens sobre gramáticas LL e há outros aspectos onde gramáticas terá vantagens sobre gramáticas LALR.

YACC / Bison gerar analisadores impulsionado tabela, o que significa a "lógica de processamento" está contida em dados do programa analisador, não tanto no código do analisador. O off pagamento é que mesmo um analisador para uma linguagem muito complexo tem uma relativamente pequena pegada de código. Este foi mais importante nos anos 1960 e 1970 quando o hardware era muito limitado. geradores de analisador impulsionado tabela voltar a essa época e código de pequenas dimensões foi uma exigência principal na época.

ANTLR gera analisador sintático descendente recursivo, o que significa a "lógica de processamento" está contida no código do analisador, pois cada regra de produção da gramática é representada por uma função no código do analisador. O off pagamento é que é mais fácil de entender o que o analisador está fazendo, lendo o seu código. Além disso, analisador sintático descendente recursivo são tipicamente mais rápido do que os veículos de mesa. No entanto, para as línguas muito complexos, a pegada código será maior. Este era um problema nas décadas de 1960 e 1970. Naquela época, só há relativamente pequenas linguagens como Pascal, por exemplo, foram implementadas desta forma devido a limitações de hardware.

analisadores ANTLR gerados são tipicamente na vizinhança de linhas de código de 10.000 e mais. Manuscritas analisador sintático descendente recursivo são muitas vezes no mesmo patamar. compilador Oberon de Wirth é talvez o mais compacto, com cerca de 4000 linhas de código, incluindo a geração de código, mas Oberon é uma língua muito compacto, com apenas cerca de 40 regras de produção.

Como alguém referiu já, uma grande vantagem para ANTLR é a ferramenta IDE gráfica, chamados ANTLRworks. É um completo laboratório de design da gramática e da linguagem. Ele visualiza a sua gramática governa como você digitá-los e, se encontrar quaisquer conflitos que irá mostrar graficamente o que o conflito é eo que ele faz. Ele pode até mesmo refatorar automaticamente e resolver conflitos como-recursão esquerda. Uma vez que você tem uma gramática livre de conflitos, você pode deixar ANTLRworks analisar um arquivo de entrada de sua linguagem e construir uma árvore de análise e AST para você e mostrar a árvore graficamente no IDE. Esta é uma vantagem muito grande, porque pode poupar muitas horas de trabalho: Você vai encontrar erros conceituais em seu projeto de linguagem antes de iniciar a codificação! Eu não encontrei qualquer ferramenta para gramáticas LALR, parece que não há qualquer ferramenta.

Mesmo para as pessoas que não desejam gerar seus analisadores mas o código mão-los, ANTLRworks é uma grande ferramenta para o design linguagem / prototipagem. Muito possivelmente, o melhor dessas ferramentas disponíveis. Infelizmente, isso não ajudá-lo se você quiser analisadores de construção LALR. Mudar de LALR para LL simplesmente para aproveitar ANTLRworks pode muito bem valer a pena, mas para algumas pessoas, a mudança tipos de gramática pode ser uma experiência muito dolorosa. Em outras palavras:. YMMV

casal vantagens A para ANTLR:

  • analisadores de saída pode em várias línguas -. Java não é necessário para executar o analisador gerado
  • Awesome GUI faz gramática depuração fácil (por exemplo, você pode ver o direito do AST gerado na GUI, há ferramentas extra obrigatório)
  • código gerado é realmente legível (que é um dos objetivos de ANTLR) eo fato de que ele gera analisadores LL certamente ajuda a este respeito.
  • definição de terminais é livre de contexto, bem como (em oposição à expressão regular em (f), lex) - permitindo assim, por exemplo, a definição de terminais contendo parênteses adequadamente-fechados

My $ .02

Outra vantagem do ANTRL é que você pode usar ANTLRWORKS , embora eu não posso dizer que esta é uma vantagem rigoroso, pois pode haver ferramentas semelhantes para outros geradores bem.

  • Bison e resultado Flex em um menor consumo de memória, mas você não tem IDE gráfica.
  • ANTLR usa mais memória, mas você tem antlrworks, uma IDE gráfica.

uso de memória Bison / Flex é tipicamente um mbyte ou assim. Contraste isso com antlr - supondo que ele usa 512 bytes de memória para cada token no arquivo que você deseja analisar. 4 milhões de fichas e você está fora de memória virtual em um sistema de 32 bits.

Se o arquivo que você deseja parse é grande, antlr pode ficar sem memória, por isso, se você quer apenas para analisar um arquivo de configuração, seria uma solução viável. Caso contrário, se você quiser analisar um arquivo com muitos dados, tente Bison.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top