Quiero analizar idiomas específicos de dominio definidos por el usuario. Estos lenguajes suelen estar cerca de las notaciones matemáticas (no estoy analizando un lenguaje natural). Los usuarios definen su DSL en una notación BNF, así:
expr ::= LiteralInteger
| ( expr )
| expr + expr
| expr * expr
La entrada como 1 + ( 2 * 3 )
debe aceptarse, mientras que la entrada 1 +
debe rechazarse como incorrecta y la entrada 1 + 2 * 3
debe rechazarse como ambigua.
Una dificultad central aquí es hacer frente a las gramáticas ambiguas de una manera fácil de usar. Restringir la gramática para que no sea ambiguo no es una opción: así es el lenguaje: la idea es que los escritores prefieran omitir paréntesis cuando no son necesarios para evitar la ambigüedad. Mientras una expresión no sea ambigua, necesito analizarla, y si no lo es, debo rechazarla.
Mi analizador debe funcionar en cualquier gramática libre de contexto, incluso las ambiguas, y debe aceptar todas las entradas no ambiguas. Necesito el árbol de análisis para todas las entradas aceptadas. Para una entrada inválida o ambigua, idealmente quiero buenos mensajes de error, pero para comenzar tomaré lo que pueda obtener.
Normalmente invocaré el analizador en entradas relativamente cortas, con la entrada ocasional más larga. Por lo tanto, el algoritmo asintóticamente más rápido puede no ser la mejor opción. Me gustaría optimizar para una distribución de alrededor del 80% de entradas de menos de 20 símbolos de largo, 19% entre 20 y 50 símbolos y 1% de entradas raras más largas. La velocidad de las entradas no válidas no es una preocupación importante. Además, espero una modificación del DSL alrededor de cada 1000 a 100000 entradas; Puedo pasar un par de segundos preprocesando mi gramática, no un par de minutos.
¿Qué algoritmo de análisis debería investigar, dados mis tamaños de entrada típicos? ¿El informe de errores debería ser un factor en mi selección, o debería concentrarme en analizar entradas no ambiguas y posiblemente ejecutar un analizador más lento y completamente separado para proporcionar comentarios de error?
(En el proyecto donde necesitaba eso (hace un tiempo), usé CYK , que no fue demasiado difícil de implementar y funcionó adecuadamente para mis tamaños de entrada, pero no produjo errores muy agradables).
x+y+z
?
+
, por lo que x+y+z
es realmente ambigua, por lo tanto, errónea.