2009-04-27 11 views
5

Tengo un conjunto de definiciones de funciones escritas en un lenguaje tipo C con algunas palabras clave adicionales que se pueden poner antes de algunos argumentos (de la misma manera que "sin firmar" o "registrar", por ejemplo) y necesito analizar estas líneas, así como algunos stubs de función y generar código C real de ellos.¿La forma más efectiva de analizar las cadenas de definición tipo C?

  • ¿Es correcto que Flex/Yacc sea la forma más adecuada de hacerlo?

  • ¿Será más lento que escribir un script de Shell o Python usando expresiones regulares (que puede ser muy complicado, supongo, si el número de palabras clave adicionales aumenta y sus efectos serían diferentes) siempre que no tenga cero experiencia con analizadores/analizadores sintácticos (aunque sé cómo LALR hace su trabajo)

  • ¿Hay algún buen material en Lex/Yacc que cubra problemas similares? Todos los documentos que pude encontrar usan el mismo ejemplo primitivo de una calculadora de "juguete".

Cualquier ayuda será apreciada.

Respuesta

3

ANTLR se usa comúnmente (como Lex \ Yacc).

antlr, otra herramienta para Language reconocimiento, es una herramienta de lenguaje que proporciona un marco para la construcción de reconocedores, intérpretes, compiladores, y traductores de descripciones gramaticales que contienen acciones en un variedad de idiomas de destino.

+2

su visión es un poco restrictiva, creo ... – LB40

+0

@Mitch Wheat: Creo que se está refiriendo a su comentario sobre ANTLR que superó Lex \ Yacc. –

+0

ANTLR no ha "reemplazado" a Lex/Yacc. Ha demostrado ser una alternativa viable. El análisis LALR no está muerto por una posibilidad remota. –

1

Eso depende completamente de su definición de "efectivo". Si tiene todo el tiempo del mundo, el analizador más rápido sería un analizador de extracción escrito a mano. Tardan mucho tiempo en depurarse y desarrollarse, pero hoy en día, ningún generador de analizadores supera el código escrito a mano en términos de rendimiento en tiempo de ejecución.

Si desea algo que pueda analizar una C válida en una semana más o menos, utilice un generador de analizador. El código será lo suficientemente rápido y la mayoría de los generadores de analizadores vienen con una gramática para C que puede usar como punto de partida (evitando el 90% de los errores comunes).

Tenga en cuenta que las expresiones regulares no son adecuadas para analizar estructuras recursivas. Este enfoque sería más lento que usar un generador y más propenso a errores que un analizador de extracción escrito a mano.

+0

y el último 10% le tomará otro año debido a la sensibilidad de contexto de C. Pregúnteles a los chicos de GNU. –

3

También está el Lemon Parser, que presenta una gramática menos restrictiva. La desventaja es que estás casado con limón, reescribiendo la gramática de un analizador sintáctico con otra cosa cuando descubres algunas limitaciones. El lado positivo es realmente fácil de usar ... y autónomo. Puede dejarlo en el árbol y no preocuparse por verificar la presencia de otros.

SQLite3 lo usa, al igual que muchos otros proyectos populares. No digo usarlo porque SQLite lo hace, pero tal vez intentarlo si el tiempo lo permite.

1

realidad, depende de la complejidad es su idioma y si es realmente cerca de C o no ...

Aún así, se puede usar la lex como primer paso, incluso para expresión regular ....

Me gustaría ir por lex + menhir y o'caml ....

pero cualquier combinación de flexión/yacc estaría bien ..

El principal problema con el bisonte regular (la implementación GNU de yacc) se deriva de la tipificación C .. usted tiene que describir toda su árbol (y todo el funciones de manipulación) ... Usar o'caml sería realmente más fácil ...

-1

Por lo que quiere hacer, nuestra DMS Software Reengineering Toolkit es probablemente una solución muy efectiva.

DMS está diseñado específicamente para admitir analizadores de clientes/generadores de códigos del tipo que está discutiendo. Proporciona instalaciones muy sólidas para definir analizadores/analizadores de lenguaje arbitrarios (probados en más de 30 idiomas reales, incluidos varios dialectos completos de C, C++, Java, C# y COBOL).

DMS automatiza la construcción de AST (por lo que no tiene que hacer otra cosa que obtener la gramática adecuada para tener un AST utilizable), permite la construcción de análisis personalizados de la inspección exactamente especificada que indicó, puede construir nuevos AST específicos para C que representan el código que desea generar, y escupirlos como texto fuente C compilable. Las definiciones preexistentes de C para DMS pueden ser dobladas para cubrir su lenguaje tipo C.

+2

Eso suena como un enchufe/promoción desvergonzado para el producto que tiene que desembolsar un montón de dinero en efectivo ... gracioso, usted ha mencionado exactamente lo mismo aquí ... http://stackoverflow.com/questions/526797/ good-tools-for-creating-acc-parser-analyzer Este es un lugar para programar preguntas, no promocionar software comercial .... – t0mm13b

+0

La pregunta era, "¿Cuál es la mejor manera de hacer esto?". Las respuestas deben incluir razonablemente software que ayude, comercial o no. Y sí, soy parcial, desde que concibió esta respuesta hace más de 15 años para responder exactamente a este tipo de preguntas. –

Cuestiones relacionadas