2011-06-09 13 views
28

Bison/Flex/YaccをXCodeに統合する簡単な方法はありますか?XcodeにBison/Flex/Yaccを統合する

自分の言語を書いて、ObjCオブジェクトとやりとりすることができます。

しかし、ツールはSTDINを入力とし、ObjCの代わりにCコードしか生成しません。基本的には、コマンドラインツールでは便利なように見えますが、そうでない場合は、パーサーコードを再生成するたびに出力をオーバーライドする必要があります。

答えて

19

簡単に言えば、文法ファイルに.yの代わりに.ym拡張子を付けます。 XcodeはObjective-Cをサポートするために必要な魔法を使ってBisonを実行します。

奇妙なことに、私は同じことをしたいので、この質問を見つけました。私はAppleのココア開発者のメーリングリストでそれについての議論を思いついたが、この質問は私のGoogle検索で高くなった。私が思い出した議論は、on CocoaBuilderでした。最後にかなりの例があります。私はそれが私たちの両方、LOLに役立つことを願っています!

(編集)私が誰かがこれを見つけ出す方法を教えてもらえた方法 - 私はまだにそれに関する公式な文書は見つかりませんでした。

+2

'sourcecode。yaccはXcodeでサポートされているファイルタイプの1つです。 XcodeのInfo.plistを開くと、Yacc(Bison)ソースファイルの認識された拡張子のリストが表示されます。 'ym'もその一つです。 –

+2

わかりましたが、それは私が「ドキュメンテーション」と呼ぶものではありません。 :-) –

+0

ええ、フレックスを使いたいのですが?フレックスはXcodeと一緒に箱から出してもらえますか?私は初心者ですので、私は思っています... – fooledbyprimes

16

Xcodeはyaccとflexファイルの処理方法を知り、生成されたコードファイルをプロジェクトに自動的にコンパイルします。そのトリックは、どの拡張子が予期しているかを調べることです。 Xcode 4では、ソースリストの最上位項目をクリックしてプロジェクト設定を取得します。次のリストでターゲットをクリックし、次にテーブルビューヘッダーでビルドルールをクリックします。 「System Lex rule」と「System Yacc rule」までスクロールし、それぞれの「ソースファイル」の上にカーソルを置くと、そのルールに使用する拡張子を含むツールヒントが表示されます。 (...何それは明らかではなかった?)

レックスの場合、それはです:Yaccのために* .L * .LM * .lmm * .lpp * .LP * .lxx

、それはです:* .Y * .ym * .ymm * .ypp * .yp * .yxx

lex/yaccファイルにObjective-Cコードがある場合は、。?m拡張子を使用して生成するようにXcodeに指示する必要があります.mファイル。同様に、Objective-C++では。?mmです。 (私は推測していますか?pp、?p、および?xxはすべてC++です)私が見たことから、これはちょうど動作し、Makefileは必要ありません。 .flex拡張子を保持する場合は、Lexルールの[Copy to Target]ボタンをクリックし、その拡張子の新しいルールを作成します。

「楽しい」部分はyaccをコードに統合しようとしています。デフォルトでは、yyparse()関数はSTDINからの入力を期待しています。それ以外の場合には、たくさんのフープを飛び越えて動作させなければなりません。あなたがyaccを使用して死んでしまった場合、あなたの気まぐれにそれを曲げる方法について、Web上にたくさんの情報があります。しかし、lemonのような最新のパーサージェネレータを使用すると、あなたの額にキーボードのくぼみが少なくなることがあります。シンタックスはyaccのものに基づいており、LALR(1)(それが意味するところは何でも構いません)ので、shift/reduceの競合について知っていることはすべてそのままです。私はyacc/flexよりも扱いがはるかに簡単であることを発見しました。

編集:Xcodeは.lファイルをビルドフェーズに自動的に追加しませんでしたが、.yファイルを追加しました。ビルド段階を確認するには、Xcodeソースリストのトップレベル項目をクリックし、ターゲットをクリックし、ビルド段階表のヘッダーをクリックして、ソースのコンパイル行を展開します。 .lファイルがそこにない場合は、ソースリストからドラッグします。

関連する問題