yacc & lex
■ このスレッドは過去ログ倉庫に格納されています
yaccとは、"yet another compiler-compiler"(さらにもう一つのコンパイラ-コンパイラ)という意味で、
yaccの開発者である、スティーヴ・ジョンソン氏が当時(1972年頃)に存在していた同種のプログラムの多さを
皮肉った言葉に由来している。yaccはその中で生き残ったごく少数のうちの一つである。
lexはyaccがパーサーを作成するのと同様の方法で字句解析ルーチンを作る。即ち、自分の言語の字句規則の
仕様を正規表現と、その正規表現に一致する文字列が見つかった時に、実行すべきCプログラムにより記述すればよい。
lexとyaccは、我々が既に書いてきた字句解析ルーチンと同一のメカニズムで、共同して働く。 >>15
使わない。
業務システムのコンサル SE だから。
# いまは、ぷー太郎だけど。 率直な話、プログラマじゃなきゃ使い道ないとおもうなぁ。
ふつーの文字列処理で使えるものなのか?
一般人の使うような使い方があったらだれか教えて >>18
個人的なプチコンパイラつくって悦に浸るとき。 意外と便利だが、最近はXMLパーサを利用してしまう…… >>18
lex は、正規表現の複雑なことをするには、sed より便利だよ。
覚えとくと非常に便利。
>>21
lex が必要になることがあまりないな。
たいていは sed で済んじゃうし。
そういえば SJIS to EBIDIK 変換の前処理を
C で書いたけど lex 使えば楽だったかも。 >>21
でも Perl でも十分。
lex が必要になったことは滅多にない。 個人レベルでパーサ作る時はracc使うなあ…
正直、lex&yaccは面倒すぎ。 俺、yacc は使うけど lex の部分は手で書いちゃう。
再帰降下型パーサーで、ちょちょいと書けるような
簡単な文法だと、yacc も使わずに、すべて手で書い
ちゃう。
これって、ひょっとして old type よりもさらに
older ってことですか? 欝だ死脳
いや、yacc も lex も使わず手で書いてしまうってのはよくある。
何でいまだにほとんどのUnixに標準添付なのかと。
いやツールのmakeんときに必要なんだろうけどさ まだだ!まだおわらんよ!
>>27
perlのコンパイルの時も使います yacc & lex 本で良いのどれ? ってもう買っちゃったけど。
C のインタープリタ作りたい。>>0
プログラム板にも何冊か推薦図書がありましたが、ぼくが参考にしたのは
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言語のコメントってプリプロセッサが空白に置換するものだよ。 ■ このスレッドは過去ログ倉庫に格納されています