26 votos

La integración de Bisonte/Flex/Yacc en XCode

Hay una manera sencilla para la integración de Bisonte/Flex/Yacc en XCode?

Quiero escribir mi propio idioma que se va a analizar, el cual interactúa con mi ObjC objetos.

Pero las herramientas sólo tendrá STDIN como entrada, y sólo producirá C código, en lugar de ObjC. Son, básicamente, sólo parecen útiles para herramientas de línea de comandos, de lo contrario, se necesitan enorme dolor para reemplazar la salida cada vez que me regenerar el analizador de código.

18voto

Sherm Pendley Puntos 10822

En pocas palabras, dar a sus archivos de gramática a .ym extensión en lugar de .y. Xcode a continuación, se ejecutará Bisonte con la magia necesaria para apoyar a Objective-C.

Curiosamente, he encontrado esta pregunta porque yo quería hacer lo mismo. Me acordé de un debate al respecto en la Manzana del cacao-dev lista de correo, pero esta pregunta llegó a subir más en mi búsqueda de Google. He encontrado la discusión recordé a pesar de que, en CocoaBuilder - hay una muy amplia ejemplo al final. Espero te sirva de ayuda tanto de nosotros, LOL!

(Edit) mejor que los demonios fuera de mí lo que nadie ha logrado averiguar esto, por cierto - yo todavía no he encontrado ninguna documentación oficial al respecto.

14voto

davehayden Puntos 2892

Xcode no sabe cómo procesar yacc y archivos flex, y automáticamente compilar el código generado los archivos en el proyecto. El truco es averiguar qué extensiones de espera. En Xcode 4, haga clic en el elemento de nivel superior en la lista de origen para obtener la configuración del proyecto. Haga clic en el destino en la siguiente lista, a continuación, Crear Reglas en la vista de tabla de cabecera. Desplácese hacia abajo para "Sistema Lex regla" y "Sistema de Yacc regla", a continuación, sitúe el cursor sobre "archivos de origen" en cada uno de esos para obtener una punta de la herramienta con las extensiones que utiliza para que la regla. (...¿Qué? Que no era obvio?)

Para Lex, es: *.l *.lm *.lmm *.lpp *.lp *.lxx

Para Yacc, es: *.y *.ym *.ymm *.ppj *.yp *.yxx

Si usted tiene cualquier código Objective-C en su lex/yacc archivos, tendrás que usar el .?m extensión de decirle a Xcode para generar una .m archivo; de igual manera .?mm para Objective-C++. (Me imagino .?pp, .?p, y .?xx son todas las C++). Por lo que he visto, esto Sólo Funciona, no hay Makefile es necesario. Si desea mantener la .flexión extensión, puede hacer clic en "Copia de Destino" botón en la Lex regla y hacer una nueva regla para esa extensión.

Ahora, la "diversión" es tratar de integrar yacc en el código. De forma predeterminada, el yyparse() función que hace que la cosa vaya espera de entrada de la ENTRADA estándar a menos que saltar a través de un montón de aros para hacer que funcione de otra manera. Si estás muerto en yacc, hay un montón de información en la web acerca de cómo someterla a sus caprichos. Pero usted podría terminar con menos de teclado abolladuras en su frente, si usted utiliza un moderno analizador de generador como el limón. La sintaxis está basada en yacc, y es LALR(1) (lo que significa) así que todo lo que usted sabe acerca de shift/reduce los conflictos aún se mantiene. Me pareció mucho más fácil de trabajar que el yacc/flex.

Edit: me parece recordar que Xcode no agregar .l archivo a la fase de generación de forma automática, pero sí añadir el .y archivo. Revise sus fases de construcción, haciendo clic en el elemento de nivel superior en el Xcode lista fuente, haga clic en orientación, haga clic en la construcción de las Fases del encabezado de tabla y, a continuación, expanda la Compilación de las Fuentes de la fila. Si su .l archivo no está allí, arrástrelo desde la lista de origen.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X