2010-05-20 58 views
8

Estoy tratando de hacer un metalenguaje para escribir código de marcado (como xml y html) que se puede incrustar directamente en el código C/C++. Este es un ejemplo sencillo escrito en esta lengua, lo llamo WDI (Interfaz Web Development):Cómo construir eficientemente un intérprete (lexer + analizador) en C?

/* 
    * Simple wdi/html sample source code 
    */ 
#include <mySite> 

string name = "myName"; 
string toCapital(string str); 

html 
{ 
    head { 
    title { mySiteTitle; } 
    link(rel="stylesheet", href="style.css"); 
    } 
    body(id="default") { 
    // Page content wrapper 
    div(id="wrapper", class="some_class") { 
    h1 { "Hello, " + toCapital(name) + "!"; } 

    // Lists post 
    ul(id="post_list") { 
    for(post in posts) { 
     li { a(href=post.getID()) { post.tilte; } } 
    } 
    } 
    } 
    } 
} 

Básicamente se trata de una fuente en C con una interfaz fácil de usar para html. Como puede ver, el estilo tradicional basado en etiquetas se sustituye por el estilo C, con bloques delimitados por llaves. Necesito construir un intérprete para traducir este código a html y luego insertarlo en C, para que pueda ser compilado. La parte C permanece intacta. Dentro de la fuente de wdi no es necesario usar impresiones, cada declaración de retorno se usará para la salida (en la función printf). La salida del programa será código html limpio.

Así, por ejemplo, un 1 etiqueta de encabezado se transformaría así:

h1 { "Hello, " + toCapital(name) + "!"; } 
// would become: 
printf("<h1>Hello, %s!</h1>", toCapital(name)); 

Mi objetivo principal es crear un intérprete para traducir fuente WDI a html así:

tag(attributes) {content} =><tag attributes>content</tag>

En segundo lugar, el código html devuelto por el intérprete debe insertarse en el código C con printfs. Las variables y funciones que ocurren dentro de wdi también deben clasificarse para usarlas como parámetros printf (el caso de toCapital (nombre) en la fuente de muestra).

Estoy buscando la forma eficiente (quiero crear un analizador rápido) para crear un lector y analizador para wdi. Ya probé flex y bison, pero no estoy seguro de si son las mejores herramientas. ¿Hay alguna buena alternativa? ¿Cuál es la mejor manera de crear dicho intérprete? ¿Puede aconsejar alguna breve literatura sobre este tema?

+5

imho, flex y bison son probablemente las mejores herramientas para el trabajo. – ereOn

+0

¿Realmente no está pidiendo un compilador WDI-> C? No parece que quiera ejecutar directamente el código WDI, sino convertirlo a C y luego alimentar el código C a un compilador de C. –

+0

¡Eso es! WDI debería convertirse a C. Pero creo que la implementación sería similar, por lo que también me gustaría crear solo un intérprete para html solo para uso y pruebas. – Rizo

Respuesta

1

Si realmente lo dice en serio, lo que quiere hacer es modificar un analizador de C existente. El Edison Design Group C Front End podría ser una opción, aunque realmente quiere ser solo un frontal C (C++).

Otra opción es nuestra DMS Software Reengineering Toolkit. DMS se puede obtener con un C Front End que contiene un analizador completo de C conducido completamente desde una gramática.

DMS proporciona soporte directo para construir dialectos de idiomas, y lo que quiere hacer es construir un dialecto de C, por lo que sería compatible con su objetivo.DMS también proporciona una gran cantidad de maquinaria para la construcción de traductores, por lo que sería bastante fácil traducir su dialecto a un código C real y emitirlo.

1

¿Puedo sugerir este tutorial: http://www.icemanind.com

Hay un tutorial para que lo pueda escribir su propia máquina virtual, con un ensamblador e intérprete

3

bisonte/flex o yacc/lex es la forma tradicional para hacerlo. En mi humilde opinión, no hay nada mejor para la tarea en cuestión.

Tenga en cuenta que la tarea no se puede hacer con un lenguaje normal (por ejemplo, regex, script de Perl simple, etc.), por lo que realmente necesita un analizador.

Mejor hacerlo bien. Lo más probable es que un analizador generado por yacc/bison sea mucho más limpio (y más rápido) que algunos analizadores sintácticos descendentes recursivos hechos a mano.

+0

Si va a analizar C (o una extensión de la misma, como las OP quiere), encontrará que bison/yacc/LALR (1) no maneja esto muy bien. Los analizadores de compiladores de C son en su mayoría hacks terribles donde la maquinaria de análisis se enreda con la resolución de nombres. Consulte http://stackoverflow.com/questions/243383/why-c-cannot-be-parsed-with-a-lr1-parser/1004737#1004737 para obtener más detalles. –

1

Boost spirit puede ser mejor que bison/flex para tales fines.

+0

¿Alguna vez lo ha usado? ¿Qué tal el rendimiento? ¿Es bueno comparado con flex y bison? Ya he empezado a usar flex y bisonte, así que tengo que asegurarme de que vale la pena moverse para impulsar el espíritu. – Rizo

+0

el rendimiento es realmente bueno. Los tiempos de compilación son lentos. –

Cuestiones relacionadas