Intégration de Bison / Flex/Yacc dans XCode

Existe-t-il un moyen simple d'intégrer Bison/Flex/Yacc dans XCode?

je veux écrire mon propre langage à analyser, qui interagit avec mes objets ObjC.

mais les outils ne prendront que STDIN comme entrée, et ne produiront que du code C, au lieu D'ObjC. Ils ne semblent être utiles que pour les outils en ligne de commande, sinon ils ont besoin d'une douleur énorme pour surpasser la sortie chaque fois que je régénère le code de l'analyseur.

28
demandé sur David 2011-06-09 21:19:43

3 réponses

en bref, donnez vos fichiers grammaticaux A.ym extension au lieu de .Y. Xcode lancera alors Bison avec la magie nécessaire pour soutenir L'objectif-C.

curieusement, j'ai trouvé cette question parce que je voulais faire la même chose. Je me suis souvenu d'une discussion à ce sujet sur la liste de diffusion d'Apple cocoa-dev, mais cette question est venue plus haut dans ma recherche Google. J'ai trouvé la discussion que j'ai oublier, cependant, on CocoaBuilder

(Edit) Bat le diable hors de moi comment on a jamais réussi à le savoir, par la manière - je Je n'ai trouvé aucun document officiel à ce sujet.

19
répondu Sherm Pendley 2011-06-11 06:09:09

Xcode sait traiter les fichiers Yacc et flex, et compilera automatiquement les fichiers de code générés dans votre projet. Le truc est de trouver quelles extensions il attend. Dans Xcode 4, Cliquez sur l'élément de premier niveau de la liste des sources pour obtenir les paramètres du projet. Cliquez sur votre cible dans la liste suivante, puis construisez les règles dans l'en-tête de vue de table. Faites défiler vers le bas jusqu'à "System Lex rule" et "System Yacc rule", puis passez le curseur sur "source files" dans chacun de ceux pour obtenir un bout d'outil avec les extensions qu'il utilise pour cette règle. (...Quoi? Ce n'était pas évident?)

pour Lex, c'est: *.l *.lm *.lmm *.lpp *.lp *.lxx

pour Yacc, c'est: *.y *.ym *.ymm *.ppj *.yp *.yxx

si vous avez un code Objectif-C dans vos fichiers lex/yacc, vous devrez utiliser le .?m extension pour dire à Xcode de générer un .m fichier; de même, .?mm pour objectif-C++. (Je suis dans le doute .?pp. ,?p, et .?xx sont tous C++. D'après ce que j'ai vu, ça marche, pas besoin de Makefile. Si vous voulez pour garder le .flex extension, vous pouvez cliquer sur le bouton" Copier vers la cible " dans la règle Lex et créer une nouvelle règle pour cette extension.

maintenant la partie " fun " essaye d'intégrer yacc dans votre code. Par défaut, la fonction yyparse() qui rend la chose entière aller attend l'entrée de STDIN à moins que vous sautiez à travers un tas de cerceaux pour la faire fonctionner autrement. Si vous êtes déterminé à utiliser yacc, il y a beaucoup d'informations sur le web sur la façon de le plier à vos caprices. Mais vous pourriez finir avec moins de bosses de clavier sur votre front si vous utilisez un générateur d'analyseur moderne comme citron. La syntaxe est basée sur yacc, et C'est LALR(1) (peu importe ce que cela signifie) donc tout ce que vous savez sur les conflits shift/reduce tient toujours. Je l'ai trouvé beaucoup plus facile à travailler que yacc/flex.

Edit: il me semble que Xcode ne pas ajouter de l' .l fichier à la phase de construction automatiquement, mais il a ajouté le .y fichier. Vérifiez vos phases de construction en cliquant sur L'élément de haut niveau dans le Xcode liste des sources, cliquez sur votre cible, cliquez sur l'en-tête de la table des phases de compilation, puis développez la ligne compiler Sources. Si votre .l fichier n'est pas là, faites-le glisser dans la liste des sources.

16
répondu davehayden 2012-02-24 18:39:10