2009-11-26 17 views
9

He trabajado en Flex, Bison hace unos años durante mis estudios de pregrado. Sin embargo, no recuerdo mucho sobre eso ahora. Recientemente, he venido a escuchar sobre ANTLR.¿Cuáles son las desventajas de usar ANTLR en comparación con Flex/Bison?

  • ¿Recomendaría aprender ANTLR o mejor para aplicar Flex/Bison?
  • ¿ANTLR tiene más/menos funciones que Flex/Bison?
+0

Al revés [ventajas-de-antlr-versus-decir-lex-yacc-bison] (http://stackoverflow.com/questions/212900/advantages-of-antlr-versus-say-lex-yacc -bison) – nawfal

+0

Posible duplicado de [Ventajas de Antlr (frente a decir, lex/yacc/bison)] (https://stackoverflow.com/questions/212900/advantages-of-antlr-versus-say-lex-yacc-bison) @nawfal: Sí. – einpoklum

Respuesta

7

ANTLRv3 es LL (k) y se puede configurar para LL (*). Este último en particular es ridículamente fácil de escribir analizadores, ya que esencialmente puede utilizar EBNF como está.

Además, ANTLR genera un código que se parece mucho al analizador de descenso recursivo que escribiría desde cero. Es muy legible y fácil de depurar para ver por qué el análisis no funciona o funciona mal.

La ventaja de Flex/Bison (o de cualquier otro analizador LALR) es que es más rápido.

+0

¿Más rápido? ¿Estás comparando LALR con LL (k) o LL (\ *)? El análisis LL (k) es bastante rápido. El análisis de LL (\ *) es lento debido al retroceso, pero rara vez es necesario usarlo (e incluso cuando lo hace, creo que ANTLR le permite usar LL (\ *) para un subconjunto de su gramática). La única ventaja que tiene LALR es que hay ciertas gramáticas que no se pueden analizar LL (k) que se pueden analizar LALR, pero en la práctica la mayoría de las gramáticas que en realidad querría analizar expresado en una forma que se puede analizar LL (k). –

+2

Sí. LALR es más rápido porque puede usar una máquina de estados finitos impulsada por tablas para eso. Es incomprensible y casi imposible depurar eso una vez que es producido por un generador de analizador sintáctico como Bison, pero también es muy rápido. LL (k) según lo implementado por ANTLR utiliza el análisis de descenso recursivo, que es algo más lento. –

+0

Acabo de probar la herramienta antlrworks y lo siguiente no funcionó: expr: expr '+' expr; porque no permite la recursión a la izquierda. ¿No les parece un poco incómodo? A continuación, debe convertirlo a algo como expr: expr ('+' expr) * es decir, escribirlo como una expresión regular. In flex pude escribir de la manera anterior y lo encontré mucho más natural que este estilo regex. – user855

0

Hemos decidido utilizar ANTLR para algunos de nuestros requisitos de procesamiento de información: análisis de archivos heredados y lenguaje natural. La curva de aprendizaje es abrupta, estamos llegando a la cima y creo que es un enfoque más moderno y versátil para lo que tenemos que hacer. Las desventajas, ya que preguntas, son principalmente la curva de aprendizaje que parece ser inevitable.

+2

Sospecho que la curva de aprendizaje para prácticamente cualquier generador de analizadores es más o menos la misma. Solo toma 5 minutos entender "técnicamente" la frase "Es LALR ..." o "Es LL ..." Se necesitan semanas para asimilar la maquinaria que tiene que usar, para obtener una forma gramática en forma, para aprende a doblar la gramática, ... En igualdad de condiciones, las curvas de aprendizaje son similares, debes elegir el generador de analizadores más poderoso que funcione en tu mundo. –

2

ANTLR tiene una biblioteca de tiempo de ejecución JAR que debe incluir en su proyecto.

Los analizadores sintácticos de descenso recursivo de ANTLR son más fáciles de depurar que los analizadores "de abajo hacia arriba" generados por Flex/Bison, pero las reglas de gramática son ligeramente diferentes.

Si desea un generador de analizadores de estilo Flex/Bison-style (LALR) para Java, consulte JavaCC.

Cuestiones relacionadas