objective-c xcode parsing yacc bison

objective c - Integrando Bison/Flex/Yacc en XCode



objective-c parsing (3)

¿Hay una manera simple de integrar Bison / Flex / Yacc en XCode?

Quiero escribir mi propio lenguaje para analizar, que interactúa con mis objetos ObjC.

Pero las herramientas solo tomarán STDIN como entrada, y solo producirán código C, en lugar de ObjC. Básicamente, solo parecen útiles para las herramientas de línea de comandos, de lo contrario, necesitan un gran esfuerzo para anular el resultado cada vez que regenere el código del analizador.


En pocas palabras, brinde a sus archivos de gramática una extensión .ym en lugar de .y. Xcode luego ejecutará Bison con la magia necesaria para soportar Objective-C.

Curiosamente, encontré esta pregunta porque quería hacer lo mismo. Recordé una discusión sobre el tema en la lista de correo de cacao-dev de Apple, pero esta pregunta subió más en mi búsqueda en Google. Sin embargo, encontré la discusión que recordé en CocoaBuilder : hay un ejemplo bastante extenso al final. ¡Espero que nos ayude a los dos, LOL!

(Edit) Me supera como nadie se las arregló para descubrir esto, por cierto, todavía no he encontrado ninguna documentación oficial al respecto.



Xcode sí sabe cómo procesar archivos yacc y flex, y compilará automáticamente los archivos de códigos generados en su proyecto. El truco está en descubrir qué extensiones espera. En Xcode 4, haga clic en el elemento de nivel superior en la lista fuente para obtener la configuración del proyecto. Haga clic en su destino en la siguiente lista, luego compile Reglas en el encabezado de la vista de tabla. Desplácese hacia abajo hasta "Regla Lex del sistema" y "Regla Yacc del sistema", luego desplace el cursor sobre "archivos fuente" en cada uno de ellos para obtener una información sobre herramientas con las extensiones que usa para esa regla. (... ¿Qué? ¿Eso no fue obvio?)

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

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

Si tiene un código Objective-C en sus archivos lex / yacc, necesitará usar la extensión .m para decirle a Xcode que genere un archivo .m; del mismo modo,.? mm para Objective-C ++. (Supongo que.? Pp,.? P, y.? Xx son todos C ++.) Por lo que he visto, esto solo funciona, no se necesita Makefile. Si desea mantener la extensión .flex, puede hacer clic en el botón "Copiar al destino" en la regla de Lex y crear una nueva regla para esa extensión.

Ahora la parte "divertida" está tratando de integrar yacc en tu código. Por defecto, la función yyparse () que hace funcionar todo espera la entrada de STDIN a menos que salte a través de un grupo de aros para que funcione de otra manera. Si no está seguro de usar yacc, hay mucha información en la web sobre cómo doblarlo según sus caprichos. Pero puede terminar con menos abolladuras en el teclado en su frente si usa un generador de analizador moderno como el lemon . La sintaxis se basa en yacc''s, y es LALR (1) (lo que sea que eso signifique) por lo que todo lo que usted sabe acerca de los conflictos de cambio / reducción todavía se cumple. Me resultó mucho más fácil trabajar que con yacc / flex.

Editar: me parece recordar que Xcode no agregó el archivo .l a la fase de compilación automáticamente, pero agregó el archivo .y. Compruebe sus fases de compilación haciendo clic en el elemento de nivel superior en la lista de fuentes de Xcode, haga clic en su destino, haga clic en el encabezado de la tabla Generar fases y luego expanda la fila Compilar orígenes. Si su archivo .l no está allí, arrástrelo desde la lista de origen.