Lex/Yacc para C#?
(12)
En realidad, tal vez no sea Lex / Yacc completo. Estoy implementando una interfaz de comando e intérprete para administrar una aplicación web. Estoy buscando algo que tome una definición de gramática y la convierta en un analizador que invoca directamente métodos en mi objeto. Similar a cómo ASP.NET MVC puede averiguar qué método de controlador invocar y cómo implementar los argumentos.
Por lo tanto, si el usuario escribe "create foo" en mi símbolo del sistema, debe invocar un método de forma transparente:
private void Create(string id) { /* ... */ }
Ah, y si pudiera generar texto de ayuda a partir de (por ejemplo) atributos en esos métodos de controlador, eso también sería increíble.
Aún así, el CTP anticipado no se puede usar en aplicaciones de producción, pero puede interesarle Oslo / MGrammar: http://msdn.microsoft.com/en-us/oslo/
Coco / R es un generador de compiladores con una implementación .NET. Podrías intentarlo, pero no estoy seguro de si conseguir que una biblioteca así funcione sería más rápido que escribir tu propio tokenizador.
Como dijo Anton, PowerShell es probablemente el camino a seguir. Si quieres una implementación lex / yacc, Malcolm Crowe tiene un buen conjunto.
Si no teme el software alfa y desea una alternativa a Lex / Yacc para crear sus propios idiomas, puede buscar en Oslo . Le recomendaría que se siente a través de las grabaciones de sesión de las sesiones TL27 y TL31 del PDC de los últimos años . TL31 aborda directamente la creación de idiomas específicos de dominio utilizando Oslo.
Sugeriría csflex - C # port of flex - el generador de escáner Unix más famoso.
Creo que lex / yacc ya están en uno de los SDK (es decir, RTM). Ya sea Windows o .NET Framework SDK.
También mira Antlr , que tiene soporte C #.
No estoy seguro de que Lex / Yacc sea de alguna ayuda. Solo necesitarás un tokenizador básico y un intérprete que son más rápidos de escribir a mano. Si todavía está en la ruta de análisis, vea Irony .
Como nota al margen: ¿ha considerado PowerShell y sus comandos?
Solo para el registro, la implementación del analizador léxer y LALR en C # para C #:
http://code.google.com/p/naive-language-tools/
¡Debería ser similar en uso a Lex / Yacc, sin embargo esas herramientas (NLT) no son generadores! Por lo tanto, olvídate de la velocidad.
Jison está recibiendo mucha tracción recientemente. Es un puerto de Bison para javascript. Debido a su naturaleza extremadamente simple, he portado la plantilla de análisis / lexing de jison a php, y ahora a C #. Todavía es muy nuevo, pero si tienes la oportunidad, échale un vistazo aquí: https://github.com/robertleeplummerjr/jison/tree/master/ports/csharp/Jison
He hecho un par de proyectos pequeños con GPLEX / GPPG, que son reimplementaciones bastante directas de LEX / YACC en C #. No he usado ninguna de las otras herramientas anteriores, así que no puedo compararlas, pero funcionaron bien.
GPPG se puede encontrar aquí y GPLEX aquí .
Habiendo dicho eso, estoy de acuerdo, una solución completa de LEX / YACC probablemente sea excesiva para su problema. Sugeriría generar un conjunto de enlaces usando IronPython: se conecta fácilmente con el código .NET, los no programadores parecen encontrar que la sintaxis básica es bastante útil, y le da mucha flexibilidad / poder si decide usarla.