Lex / Yacc para C #?

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.

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?

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 progtwigdores parecen encontrar que la syntax básica es bastante útil, y le da mucha flexibilidad / poder si decide usarla.

También mira Antlr , que tiene soporte C #.

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/

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

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.

Coco / R es un generador de comstackdores 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.

http://www.ssw.uni-linz.ac.at/Research/Projects/Coco/

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.

Gardens Point Parser Generator proporciona funcionalidad Yacc / Bison para C #. Puede ser descargado aquí . Un ejemplo útil usando GPPG se proporciona aquí

Como dijo Anton, PowerShell es probablemente el camino a seguir. Si quieres una implementación lex / yacc, Malcolm Crowe tiene un buen conjunto.

Editar: enlace directo a las herramientas del comstackdor

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.