yacc & lex
■ このスレッドは過去ログ倉庫に格納されています
yaccとは、"yet another compiler-compiler"(さらにもう一つのコンパイラ-コンパイラ)という意味で、 yaccの開発者である、スティーヴ・ジョンソン氏が当時(1972年頃)に存在していた同種のプログラムの多さを 皮肉った言葉に由来している。yaccはその中で生き残ったごく少数のうちの一つである。 lexはyaccがパーサーを作成するのと同様の方法で字句解析ルーチンを作る。即ち、自分の言語の字句規則の 仕様を正規表現と、その正規表現に一致する文字列が見つかった時に、実行すべきCプログラムにより記述すればよい。 lexとyaccは、我々が既に書いてきた字句解析ルーチンと同一のメカニズムで、共同して働く。 プログラム板にも何冊か推薦図書がありましたが、ぼくが参考にしたのは yacc/lex プログラムジェネレータ on UNIX 五月女健治 テクノプレス コンパイラ構成法 原田賢一 共立出版 他にも「コンパイラ」に関する本は何冊かありましたが、むしろ yacc/lex の使い方よりもコンパイラの理論が中心になっているので、 初心者には取っつきにくいかもしれません。 >>29 俺は「yaccによるCコンパイラプログラミング」って本が激しくよかったんですが (lexは扱ってないけど)絶版になったと聞きました。 >>萌え萌え あぁ! それ買ったんですよ。 >>35 そのものズバリなタイトルですね。読みたゐな♪ lex&yacc入門なら 「UNIXプログラミング環境」 アスキー に、素晴らしい章がある。本気でやってみたいんなら、 この章を読むためだけに買ってもいいんじゃないかと思う。 これを読んだ後で、ほかの本を買えばいいんじゃないかな。 でも、この本、まだ売ってんのかな? >>37 それってカーニハンのですか? 本屋で見かけたような・・・。 見付けたらゲットしてみます。 >>37 その章だけ学校の図書館でコピーしたよ、昔。 >>36 本のほうは入手困難ぽ。俺もだいぶ苦労しますた。 Cマガの99年10月号についてるCDにキモの部分が入ってるそうなんで (http://www.context.co.jp/ ~cond/books/ ご参照) これをなんとか入手するのが早いかもです。 x86向けコードを吐き出す (最適化はあんまりやってないけど) 実物のCコンパイラを題材として分かりやすく説明してくれてるいい本でした。 >>37 残念ながらそっちも絶版ぽ 本気で言語処理系学ぶならやっぱドラゴンブックに挑むのがいいんかねえ。 読み方についてなのだが、以下の形でよいのだろうか? lex ......... レックス yacc .... ヤック flex ....... フレックス bison ... バイソン lex レフ yacc ヤッシッシー flex フレフ bison ビソン れきしかるあならいざじぇねれーた いぇっとあなざーこんぱいらこんぱいら ふぁーすとれきしかるあならいざじぇねれーた のうし 誰か、%type に複数の項目をカンマで区切って並べる書き方の載っている マニュアルか何かを知りませんか? bison-1.75 がタコで、ルールの末尾のセミコロンが絶対必要になったのと 複数項目をカンマで区切って並べる書き方を認めなくなったおかげで、 世間に存在する大量の yacc コードがコンパイルできなくなった模様。 作者は「こりゃ仕様だセミコロンつけないヤシが悪いんだゴルァ」と MLでおっしゃってます。 直してもらおうと思って Single Unix Specification ではどうなって いるか調べてみたんだけど、ダメらしい。yaccによるyaccの文法定義は PSD:15の孫引きなんで、世間のマニュアルはみんな右に倣えの予感。 V7のyaccをコンパイルして試してみたらカンマでもちゃんと通ります。 >>41 覚えたてのころは、ごっちゃになって レック ヤックス とか言ってた flex でルール部を C の変数で動的に生成することって出来ないですかね? >>55 何にでも当てはまるようなオマンコガバガバのルールに対して、 切り出したトークンの値に応じて C の内部で場合分けをして逝くのはどうかしら。。。 クククのクーソ。。。 自己晒しage >>55 flexの内部テーブルをいじればいけるんじゃないすか。 そこまでするなら自分で字句解析したほうが楽な気もします。 yacc -d とか bison -y が通らないものは "byacc"つかうとたいてい通る。 しかしナニをするものなのかとかは 全くシラン。 >>55 ルールを出力、 *.l を作成 ↓ flex を実行、 *.c を作成 ↓ コンパイル ↓ yylex() を dlopen() とか? lex って状態機械作るんですよね。単にテーブルに要素追加すればオケという ほど簡単でもないと思うんだけど? >>58 58っす >>62 そっか、そうだな。 しかしlex使うシチュエーションって少ねえなあ。 設定ファイルの書式もなんだかんだでXMLになりつつあるしなあ。 アドベンチャーゲームなど用にスクリプトプログラムを作成したいのですが、 そのような目的にyaccやlexって向いていますか? yaccやlexについて調べようとおもったのですが、見つけることができませんでした。 開発環境はWindowsですので、bisonとflexというのを入れてみました。 >>70 スクリプトプログラムを作成するインタプリタプログラムを作るには むいてるかもしれない。日本語周りは要注意ね。 Unix板的には 「既存のものを使え」 「既存のもので満足できなければ改造しろ」 と思う。車輪の再発明はもっとも愚かだ Lexで標準入力以外(例えば文字列)を取得したい場合、下記のような定義をすると思うんですが、 #undef YY_INPUT #define YY_INPUT(buf, result, max_size) (result = my_yyinput(buf, max_size)) この場合、my_yyinput()はどういうタイミングで呼ばれるのでしょうか? また、bufの値はどこで設定すればよいのでしょうか? >>71 私は車輪を再発明して理解しろ。という方が好きです 車輪の再発明は勉強にはなるけど学生のうちに済ませとけ UNIXプログラミング環境 在庫があるところにはあるらしい www.boople.com/servlet/AFsearch?&isc=&idn=321429&iqm=2 flex のyy_push_state() って、FlexLexer ではprotected なのですが ってことは、.y 側のルールでyy_push_state() を使うのはunsupported でつか? 初めて lex を使ってみました。なんか面白いのねん。 lex は yy.lex.c吐くわ、yyナンチャラいう変数/関数をもってるわ なぜそこで yy? あんた lexさんでしょう?と思ってしまうのですが yyがつくものは yaccへの引渡しを想定していますよという暗示なのん? なんつ−か、 歴史的な経緯とかyacc/lex開発時のエピソ−ドがあるようなら教えて下しい もしかして lex is Yet another Yacc だからとかいう話しなのかしらん? という質問はくだ質逝ったほうが吉? << yy.lex.c >> lex.yy.c 誤記ですた bisonでコンパイルするときに使う記号テーブルって何で必要なんだ? 誰か教えてくれorz ぐぐっても見つかんない・・・ >>84 sourceの行番号の受け渡しとか、 協調しないといけないものがあるから。 --stdoutで切り替えられるから問題ないでしょ。 yyin, yyoutとか。 >>86 えーと、'+'とか'-'とかですめばいいけど、 "if"とか"then"とかをtokenとして扱いたいから。 使わないといけないらしいです。 http://www.kuzbass.ru/docs/unixprogenv/src/hoc4/ これでy=1+5*yを計算したときにどうなるかって言う課題が出て プリントを復習中ですけど、明日までに間に合いそうに無いので 困り果ててますorz constpush:1 constpush:5 varpush:x eval mul add varpush:y assign pop STOP って感じでいいのかなぁ・・・。 yyac 使って,define に相当するようなコマンドをもつ コンパイラ or インタプリタを作るには どうしたらいいのでしょうか. 参考文献を教えて下さると有難いです. それとも不可能ですか? BNFで書けるなら(つまり文脈自由文法なら)yaccで記述出来るし BNFで書けないならyaccで記述出来ない そのdefineをBNFで書いて見る事をお奨めする ああ、ひょっとして91が作りたかったのは defineじゃなくてインタプリタの事じゃないだろうか? もしそうならyaccでは不可能。 だって、yaccはCompiler Compilerだから。 >>93 マクロ定義ができるコンパイラが作りたかったんじゃね? 関数定義ができるコンパイラを yacc で記述するにはどうしたらいいですか? rAwIsK name is Kostya.My nick is Zold . I want to find friends .ICQ 324600825 c言語でコメント/*から*/を字句解析できないようにさせるには、 規則部にどういう正規表現をすればいいですか? /* ・・・・・・ */ となっています。 lex? flexのFAQに、 How can I match C-style comments? ってのがあるよ。 flex だったらそれでいいね。 一般的には、 非欲張り型量指定子 *? が使えるなら /\*.*?\*/ でおk 使えない場合は少々厄介で、 /\*([^*]|\*+[^/*])*\*+/ 詳説正規表現の第二版だと 6.6.8.3 にある。 >>105 ,106 どうもありがとうございました。 大変恐縮なんですが規則部に入れるバージョンで教えてもらえないですか? "/*" から始まると思いますが・・・ >>105 ,106 lex用に直してコンパイルしましたらできました。 "/*"+[^/*]*+"*/ また教えて下さい。 ファイルからプログラムを読み込ませてそのプログラムに出てくる演算子とか 識別子の数を一番下に表示させるようにするにはどうしたらいいですか? C言語のコメントってプリプロセッサが空白に置換するものだよ。 サーバの役割のひとつに クライアントからの電文をプロトコルにしたがって解析して、処理し、返答を 返すという役割があるかと思います。 パーサジェネレータをつかって、簡単に上記のような枠組みを 実装するようなことはできないでしょうか。 インタプリタをパーサジェネレータを使って実装するような流れはあるのに、 drubyやerlang、アクターモデルなどの実装方法とパーサジェネレータが なぜか結び付けられていないのが不思議に思われます。 >>112 つ ASN.1 ←>>112 の言う方向の最後の試み つ object serialization ←もうそれはOOの方でやっちゃいますわ パーサジェネレータだけ知ってて状態機械知らないの? 本格的な構文解析が必要な通信プロトコルを設計するのがそもそも間違いですから >>109 おまえ信大の学生だろ。それは簡単だよ。 コメントを読み飛ばすのは108を書けばOK 学生か 図書館にyaccの解説本の1冊ぐらいあるだろ >>112 昔 Webアプリのプロトタイプを開発していた時に 画面遷移処理を yacc で直接的に実装した事があるよ。 入力トークンをクライアントからの要求電文に、 状態を画面(HTML)に対応させた。 Mosaic と CERN httpd の時代。 状態1: <要求a> { 要求処理と<応答x>の返信 } 状態2 | <要求b> { 要求処理と<応答y>の返信 } 状態3 ; できないのか?とか不思議?と思うのなら、自分で試すのが一番。 できれば Estelle あたりを参考に専用の言語を設計し、 Stateパターンのコードを生成する処理系を実装してみてもいい。 from 状態1 when <要求a> to 状態2 action 要求処理と<応答x>の返信 end; when <要求b> to 状態3 action 要求処理と<応答x>の返信 end; そして、これらパーサジェネレータ志向アプローチの利点と欠点は何か、 今、なぜ普及していないのか(or これから普及していくのか)を考えよう。 cc y.tab.c -ll -o abc Undefined symbols: "_yylex", referenced from: _yyparse in ccMGRLwg.o ld: symbol(s) not found collect2: ld returned 1 exit status エラーが取れない… lexはなんとかいけたのにyaccはさっぱりだ _yylexがない、っていうんだから、yylex()を定義すればいいんじゃないの? なんとか121はこえたのでパースエラーと戦ってくる >>122 ありがとう Cのラベルみたいなもの 任意の文字列 最後に特殊文字(:とか) はlex側でなくてyacc側で認識させるものなの? labelname ':' とyaccで扱うのが普通じゃないか? ケースバイケースだと思うけど。 C 言語の場合、 a ? b : c; の一部という場合があるので、<識別子> ":" を、lex で無条件に <ラベル> にするわけにはいかない。 >>91 >>93 いやyacc, lexを使ってインタープリターは作れる。 GUIのテストをするための、カーソル移動、マウスクリックの シミュレートをするプログラムを作ったことがあり、 インタラクティブに画面上の移動、パスの記録などを できるようにしたことがある。 マニュアルをよく読めば見当がつくはず。yylexだっけ、インプットストリームの 切り替え部分に気をつければずっと読み込みをしながら、 一行コマンドラインの処理をしつつ、エラーの処理もyaccで行なって インタープリターはつくれますよ。 (あ、一行でコマンドが終わるとするとかなり楽になる。 セミコロンみたいな シンボルが来るまで終わらないというのはちょっと うれしくない。一行でコマンドが終わって、どうしても必要なら行末の バックスラッシュで継続行とかするのがよい。) インタープリターで対話的に作ったスクリプトを、再度編集しなおして 標準入力から放り込めば、GUIプログラムのパッケージの テストができるというものでした。 命令文2つを1つに変換したい statmnt1 argX argY statmnt2 argY を statmntA argX argY にしたい。 argYが一致しない場合は statmnt1 → statmntA2 statmnt2 → statmntB にしたい。しかしうまい書き方が思いつかない 質問です。 http://www.w3.org/TR/CSS21/grammar.html このページでYACCの文法が載ってますが、拡張されているのでそのまま 使えません。この中で、 expr : term [ operator? term ]* はどうやってYACC文法で書けばいいでしょうか? 一般にA*は、 X = X = A | X A?は、 X = X = A と定義したXで置き換えられる。 ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる