2011-06-09 20 views
28

¿Existe una manera simple de integrar Bison/Flex/Yacc en XCode?Integración de Bison/Flex/Yacc en el código X

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

Pero las herramientas sólo tomarán STDIN como entrada, y sólo 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.

Respuesta

19

En pocas palabras, otorgue 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. Encontré la discusión que recordé sin embargo, on CocoaBuilder - hay un ejemplo bastante extenso al final. ¡Espero que nos ayude a los dos, LOL!

(Editar) Me encanta cómo alguien se las arregló para descubrir esto, por cierto - I Todavía no he encontrado ninguna documentación oficial sobre él.

+2

'código fuente.yacc' es uno de los tipos de archivos compatibles con Xcode. si abre Info.plist de Xcode, verá la lista de extensiones reconocidas para archivos fuente de Yacc (Bison); 'ym' es uno de ellos. –

+2

Es bueno saberlo, pero eso no es exactamente lo que llamo "documentación". :-) –

+0

Uh está bien, pero ¿qué ocurre si solo quiero usar flex? ¿Flex es compatible con Xcode? Soy un novato, por lo tanto, me pregunto ... – fooledbyprimes

16

Xcode sabe cómo procesar los archivos y yacc flex, y compilará automáticamente los archivos de código generado 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. (?? ... Lo que no era 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 su 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 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 construcción de forma automática, pero lo hizo añadir 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.

Cuestiones relacionadas