Qual é a diferença entre Flex / Lex e Yacc / Bison?

122

Qual é a diferença entre Flex & Lex e Yacc & Bison. Eu procurei na Internet descontroladamente e não encontrei nenhuma resposta sólida.

Posso instalar o Lex e o Yacc puro no Ubuntu ou posso instalar apenas o flex e o bison. Estou confuso.

  • Lex ou Yacc ainda está sendo mantido por alguém?
  • Todos eles são gratuitos?
  • Se Lex não é gratuito, por que o tenho instalado na minha distribuição Ubuntu?

    lex --version
    lex 2.5.35
    
Dumb Questioner
fonte
3
Não há versão lex 2.5.35 - você está correndo Flex versão 2.5.35, ele só se identifica como 'lex' se você invocá-la como 'lex'
Chris Dodd

Respostas:

81

Existem algumas diferenças entre Lex e Flex, mas é necessário abusar de Lex para encontrar problemas com o Flex. (Eu tenho um programa que abusa de Lex e, portanto, não funciona com o Flex.) Isso é principalmente na área de procura de entrada; em Lex, você pode fornecer seu próprio código de entrada e modificar o fluxo de caracteres; O Flex não permite que você faça isso.

Yacc e Bison são bastante compatíveis, embora Bison tenha alguns truques extras que ele pode fazer.

Você provavelmente não consegue encontrar cópias legítimas (das versões original e AT&T) de Lex e Yacc para instalar no Ubuntu. Eu não diria necessariamente que é impossível, mas não estou ciente disso. Flex e Bison estão prontamente disponíveis e são equivalentes para a maioria dos propósitos. Você também pode encontrar vários programas alternativos e aproximadamente equivalentes no mundo do BSD.

Lex e Yacc são mantidos pelas licenças Unix SVRx - empresas como IBM (AIX), HP (HP-UX) e Sun (Solaris) têm versões modificadas de Lex e Yacc sob seu comando. A MKS também fornece MKS Lex e MKS Yacc; no entanto, o Yacc tem pelo menos algumas extensões não padrão.

Flex e Bison são gratuitos. (AT&T) Lex e Yacc não são.

Jonathan Leffler
fonte
4
As informações sobre o Yacc estão incorretas. Berkeley possui um Yacc, que está presente e disponível sob a licença BSD em todos os sistemas operacionais BSD de código aberto. Fiz um voto negativo nesta conta, mas se a resposta for corrigida com rapidez suficiente, removerei o voto negativo.
227 Daniel C. Sobral
2
@ Daniel: AFAIK, AT&T Yacc não pode ser obtida em Berkeley - o que você recebe de Berkeley é o Berkeley Yacc. Vou esclarecer a resposta para refletir isso.
27611 Jonathan Leffler
1
No flex, você certamente pode alternar os buffers de entrada sem problemas (eu fiz isso uma vez para lidar essencialmente #include). Meu livro da O'Reilly sobre lex & yacc (não disponível aqui, desculpe) disse que isso só era possível no lex através de hacks repugnantes.
vonbrand
33

Bison é a implementação / extensão GNU do Yacc, Flex é o sucessor de Lex. Em qualquer um dos casos, é bom (e recomendado) usar o bison / flex.

Jan Jungnickel
fonte
1
Além disso, o byacc, a implementação do yacc em Berkeley, está amplamente disponível (eu o vejo na minha lista de repositórios Debian).
187 Michael Ekstrand
1
flex é chamado assim porque é (foi?) muito mais rápido que lex. Ele tem várias extensões e os arquivos gerados não são parecidos (ou seja, hacks feios no lex não funcionam com flex e vice-versa).
vonbrand
11

Na maioria dos sistemas (todos?) Linux, "Lex" é na verdade um link simbólico para flexionar. Basicamente, é apenas um nome diferente da versão gratuita.

ndr
fonte
1
No meu sistema (Arch Linux), os dois binários não se comportam da mesma maneira. Provavelmente, um recurso de compatibilidade lex.
Danilo Bargen #
10

O YACC está disponível sob licenças de código aberto do Plan 9 e do Open Solaris. Além disso, também existe o YACC de Berkeley, que é compatível com o YACC original, mas não compartilha o código-fonte. O YACC de Berkeley pode ser encontrado em qualquer sistema operacional BSD de código aberto.

Daniel C. Sobral
fonte
2

Bisonte em uma parte do projeto GNU. O yacc é usado como um utilitário no Berkeley Software Distribution (BSD). Embora seja compatível com o yacc, mas Lex e Yacc são coisa do passado. Hoje, o Flex e o bisonte são amplamente utilizados.

Avani Ranade
fonte