X



yacc & lex

■ このスレッドは過去ログ倉庫に格納されています
1SystemX
垢版 |
NGNG
yaccとは、"yet another compiler-compiler"(さらにもう一つのコンパイラ-コンパイラ)という意味で、
yaccの開発者である、スティーヴ・ジョンソン氏が当時(1972年頃)に存在していた同種のプログラムの多さを
皮肉った言葉に由来している。yaccはその中で生き残ったごく少数のうちの一つである。

lexはyaccがパーサーを作成するのと同様の方法で字句解析ルーチンを作る。即ち、自分の言語の字句規則の
仕様を正規表現と、その正規表現に一致する文字列が見つかった時に、実行すべきCプログラムにより記述すればよい。

lexとyaccは、我々が既に書いてきた字句解析ルーチンと同一のメカニズムで、共同して働く。
NGNG
>>12
ユッケ食いたいなぁ・・・。
14棄教者 ◆witdLTi2
垢版 |
NGNG
http://pc3.2ch.net/test/read.cgi/tech/1021136715/l50
NGNG
lex どんな時に使ってる?
NGNG
みゆりんってだれ?
NGNG
>>15
使わない。
業務システムのコンサル SE だから。
# いまは、ぷー太郎だけど。
18名無しさん@お腹いっぱい。
垢版 |
NGNG
率直な話、プログラマじゃなきゃ使い道ないとおもうなぁ。
ふつーの文字列処理で使えるものなのか?
一般人の使うような使い方があったらだれか教えて
NGNG
>>18
個人的なプチコンパイラつくって悦に浸るとき。
NGNG
意外と便利だが、最近はXMLパーサを利用してしまう……
NGNG
>>18
lex は、正規表現の複雑なことをするには、sed より便利だよ。
覚えとくと非常に便利。
NGNG
>>21
lex が必要になることがあまりないな。
たいていは sed で済んじゃうし。

そういえば SJIS to EBIDIK 変換の前処理を
C で書いたけど lex 使えば楽だったかも。
23棄教者 ◆witdLTi2
垢版 |
NGNG
>>21
でも Perl でも十分。
lex が必要になったことは滅多にない。
NGNG
個人レベルでパーサ作る時はracc使うなあ…
正直、lex&yaccは面倒すぎ。
NGNG
俺、yacc は使うけど lex の部分は手で書いちゃう。
再帰降下型パーサーで、ちょちょいと書けるような
簡単な文法だと、yacc も使わずに、すべて手で書い
ちゃう。
これって、ひょっとして old type よりもさらに
older ってことですか? 欝だ死脳
NGNG
いや、yacc も lex も使わず手で書いてしまうってのはよくある。
NGNG
何でいまだにほとんどのUnixに標準添付なのかと。








いやツールのmakeんときに必要なんだろうけどさ
28名無しさん@お腹いっぱい。
垢版 |
NGNG
まだだ!まだおわらんよ!
>>27
perlのコンパイルの時も使います
29名無しさん@Emacs
垢版 |
NGNG
yacc & lex 本で良いのどれ? ってもう買っちゃったけど。
C のインタープリタ作りたい。>>0
NGNG
SymphonyXに見えた
NGNG
>>30
あのウソコバソドか
32萌え萌え ◆MOE73MOE
垢版 |
NGNG
プログラム板にも何冊か推薦図書がありましたが、ぼくが参考にしたのは
yacc/lex プログラムジェネレータ on UNIX 五月女健治 テクノプレス
コンパイラ構成法 原田賢一 共立出版

他にも「コンパイラ」に関する本は何冊かありましたが、むしろ
yacc/lex の使い方よりもコンパイラの理論が中心になっているので、
初心者には取っつきにくいかもしれません。
33棄教者 ◆KIKYO7cg
垢版 |
NGNG
>>32ハンドル間違えた。
34棄教者 ◆KIKYO7cg
垢版 |
NGNG
http://www.linux.or.jp/JF/workshop/JF-in-Progress.html
の翻訳進捗状況一覧眺めていたら
Lex-YACC-HOWTO 未訳だってさ。
2CHer で訳さない?
NGNG
>>29
俺は「yaccによるCコンパイラプログラミング」って本が激しくよかったんですが
(lexは扱ってないけど)絶版になったと聞きました。
NGNG
>>萌え萌え
あぁ! それ買ったんですよ。

>>35
そのものズバリなタイトルですね。読みたゐな♪
NGNG
lex&yacc入門なら

「UNIXプログラミング環境」 アスキー

に、素晴らしい章がある。本気でやってみたいんなら、
この章を読むためだけに買ってもいいんじゃないかと思う。
これを読んだ後で、ほかの本を買えばいいんじゃないかな。

でも、この本、まだ売ってんのかな?
NGNG
>>37
それってカーニハンのですか? 本屋で見かけたような・・・。
見付けたらゲットしてみます。
NGNG
>>37
その章だけ学校の図書館でコピーしたよ、昔。
4035
垢版 |
NGNG
>>36
本のほうは入手困難ぽ。俺もだいぶ苦労しますた。

Cマガの99年10月号についてるCDにキモの部分が入ってるそうなんで
(http://www.context.co.jp/~cond/books/ ご参照)
これをなんとか入手するのが早いかもです。

x86向けコードを吐き出す (最適化はあんまりやってないけど)
実物のCコンパイラを題材として分かりやすく説明してくれてるいい本でした。

>>37
残念ながらそっちも絶版ぽ

本気で言語処理系学ぶならやっぱドラゴンブックに挑むのがいいんかねえ。
NGNG
読み方についてなのだが、以下の形でよいのだろうか?

lex ......... レックス
yacc .... ヤック
flex ....... フレックス
bison ... バイソン
NGNG
lex レフ
yacc ヤッシッシー
flex フレフ
bison ビソン
NGNG
れきしかるあならいざじぇねれーた
いぇっとあなざーこんぱいらこんぱいら
ふぁーすとれきしかるあならいざじぇねれーた
のうし
NGNG
炒飯
餃子
レバニラ炒め
天津飯
NGNG
>>41
いいんじゃネーノ?
NGNG
UNIXに関する言葉のカタカナ読みスレッド
http://pc.2ch.net/test/read.cgi/unix/979465046/
47名無しさん@お腹いっぱい。
垢版 |
NGNG
誰か、%type に複数の項目をカンマで区切って並べる書き方の載っている
マニュアルか何かを知りませんか?

bison-1.75 がタコで、ルールの末尾のセミコロンが絶対必要になったのと
複数項目をカンマで区切って並べる書き方を認めなくなったおかげで、
世間に存在する大量の yacc コードがコンパイルできなくなった模様。
作者は「こりゃ仕様だセミコロンつけないヤシが悪いんだゴルァ」と
MLでおっしゃってます。

直してもらおうと思って Single Unix Specification ではどうなって
いるか調べてみたんだけど、ダメらしい。yaccによるyaccの文法定義は
PSD:15の孫引きなんで、世間のマニュアルはみんな右に倣えの予感。

V7のyaccをコンパイルして試してみたらカンマでもちゃんと通ります。
48名無しさん@お腹いっぱい。
垢版 |
NGNG
>>41
覚えたてのころは、ごっちゃになって
レック
ヤックス
とか言ってた
49山崎渉
垢版 |
NGNG
(^^)
NGNG
やっくすのせりかた
NGNG
http://pc2.2ch.net/test/read.cgi/tech/1045139908/
52山崎渉
垢版 |
NGNG
(^^)
53山崎渉
垢版 |
NGNG
(^^)
NGNG
あぼーん
55名無しさん@お腹いっぱい。
垢版 |
NGNG
flex でルール部を C の変数で動的に生成することって出来ないですかね?
NGNG
>>55
何にでも当てはまるようなオマンコガバガバのルールに対して、
切り出したトークンの値に応じて C の内部で場合分けをして逝くのはどうかしら。。。

クククのクーソ。。。
NGNG
あぼーん
58名無しさん@お腹いっぱい。
垢版 |
NGNG
自己晒しage

>>55
flexの内部テーブルをいじればいけるんじゃないすか。
そこまでするなら自分で字句解析したほうが楽な気もします。
59名無しさん@お腹いっぱい。
垢版 |
NGNG
yacc -d とか bison -y が通らないものは
"byacc"つかうとたいてい通る。

しかしナニをするものなのかとかは
全くシラン。
NGNG
あぼーん
61名無しさん@お腹いっぱい。
垢版 |
NGNG
盛り上がんないなあ

>>34
ほらよ
http://www.linux.or.jp/JF/JFdocs/Lex-YACC-HOWTO.txt
NGNG
>>55

ルールを出力、 *.l を作成

flex を実行、 *.c を作成

コンパイル

yylex() を dlopen()

とか?

lex って状態機械作るんですよね。単にテーブルに要素追加すればオケという
ほど簡単でもないと思うんだけど? >>58
63名無しさん@お腹いっぱい。
垢版 |
NGNG
58っす

>>62
そっか、そうだな。

しかしlex使うシチュエーションって少ねえなあ。
NGNG
あぼーん
NGNG
あぼーん
NGNG
設定ファイルの書式もなんだかんだでXMLになりつつあるしなあ。
NGNG
>>63
正規表現ライブラリの代わりとか
NGNG
補修
69名無しさん@お腹いっぱい。
垢版 |
NGNG
raccのこととかも語ってちょ。
70名無しさん@お腹いっぱい。
垢版 |
NGNG
アドベンチャーゲームなど用にスクリプトプログラムを作成したいのですが、
そのような目的にyaccやlexって向いていますか?

yaccやlexについて調べようとおもったのですが、見つけることができませんでした。

開発環境はWindowsですので、bisonとflexというのを入れてみました。

NGNG
>>70
スクリプトプログラムを作成するインタプリタプログラムを作るには
むいてるかもしれない。日本語周りは要注意ね。

Unix板的には
「既存のものを使え」
「既存のもので満足できなければ改造しろ」
と思う。車輪の再発明はもっとも愚かだ
72名無しさん@お腹いっぱい。
垢版 |
NGNG
Lexで標準入力以外(例えば文字列)を取得したい場合、下記のような定義をすると思うんですが、

#undef YY_INPUT
#define YY_INPUT(buf, result, max_size) (result = my_yyinput(buf, max_size))

この場合、my_yyinput()はどういうタイミングで呼ばれるのでしょうか?
また、bufの値はどこで設定すればよいのでしょうか?
NGNG
>>71
私は車輪を再発明して理解しろ。という方が好きです
NGNG
学生やアマチュアはそれで良いんじゃないの
75名無しさん@Vim%Chalice
垢版 |
05/01/30 03:09:21
 
05/01/30 09:05:18
>>71
お前は愚かだ
05/02/01 12:45:38
車輪の再発明は勉強にはなるけど学生のうちに済ませとけ
05/02/01 17:58:32
自分らは普段なにやってるの?車輪磨き?
05/03/05 23:39:09
UNIXプログラミング環境

在庫があるところにはあるらしい
www.boople.com/servlet/AFsearch?&isc=&idn=321429&iqm=2
05/03/07 20:57:01
>>79
普通に買えるみたい。
http://www.junkudo.co.jp/detail2.jsp?ID=0185262822
http://bookweb.kinokuniya.co.jp/guest/cgi-bin/wshosea.cgi?W-NIPS=9850359668
家の近所の本屋でも売ってました。
2006/01/18(水) 02:07:16
からあげ うまうま だよもん
2006/04/03(月) 12:15:00
flex のyy_push_state() って、FlexLexer ではprotected なのですが
ってことは、.y 側のルールでyy_push_state() を使うのはunsupported でつか?
2006/07/05(水) 02:03:44
初めて lex を使ってみました。なんか面白いのねん。
2006/07/10(月) 19:35:15
lex は yy.lex.c吐くわ、yyナンチャラいう変数/関数をもってるわ
なぜそこで yy? あんた lexさんでしょう?と思ってしまうのですが

yyがつくものは yaccへの引渡しを想定していますよという暗示なのん?
なんつ−か、
歴史的な経緯とかyacc/lex開発時のエピソ−ドがあるようなら教えて下しい
もしかして lex is Yet another Yacc だからとかいう話しなのかしらん?

という質問はくだ質逝ったほうが吉?
8584
垢版 |
2006/07/11(火) 13:01:49
<< yy.lex.c
>> lex.yy.c 誤記ですた
2006/07/27(木) 18:31:21
bisonでコンパイルするときに使う記号テーブルって何で必要なんだ?
誰か教えてくれorz

ぐぐっても見つかんない・・・
2006/07/27(木) 18:50:10
>>84
sourceの行番号の受け渡しとか、
協調しないといけないものがあるから。
--stdoutで切り替えられるから問題ないでしょ。
yyin, yyoutとか。

>>86
えーと、'+'とか'-'とかですめばいいけど、
"if"とか"then"とかをtokenとして扱いたいから。
88名無しさん@お腹いっぱい。
垢版 |
2006/07/27(木) 23:20:24
>>86
そんなレベルで bison 使うの?
8986
垢版 |
2006/07/28(金) 00:59:27
使わないといけないらしいです。
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
って感じでいいのかなぁ・・・。
2006/07/28(金) 22:52:12
なんじゃそりゃ
91名無しさん@お腹いっぱい。
垢版 |
2007/06/28(木) 02:50:14
yyac 使って,define に相当するようなコマンドをもつ
コンパイラ or インタプリタを作るには
どうしたらいいのでしょうか.

参考文献を教えて下さると有難いです.

それとも不可能ですか?
2007/06/28(木) 02:59:57
BNFで書けるなら(つまり文脈自由文法なら)yaccで記述出来るし
BNFで書けないならyaccで記述出来ない

そのdefineをBNFで書いて見る事をお奨めする
2007/06/30(土) 14:03:07
ああ、ひょっとして91が作りたかったのは
defineじゃなくてインタプリタの事じゃないだろうか?
もしそうならyaccでは不可能。
だって、yaccはCompiler Compilerだから。
2007/06/30(土) 15:08:19
(´・ω・`)
2007/06/30(土) 20:15:09
>>93
2007/07/01(日) 02:27:18
>>55
97名無しさん@お腹いっぱい。
垢版 |
2007/07/01(日) 22:01:53
>>93
マクロ定義ができるコンパイラが作りたかったんじゃね?
2007/07/02(月) 00:15:22
(´・ω・`)
99名無しさん@お腹いっぱい。
垢版 |
2007/07/07(土) 17:12:42
関数定義ができるコンパイラを yacc で記述するにはどうしたらいいですか?
2007/07/08(日) 10:09:07
100ゲト!
普通が一番だよ
2007/07/19(木) 15:40:27
rAwIsK name is Kostya.My nick is Zold . I want to find friends .ICQ 324600825
2007/07/26(木) 17:55:32
antlr
2008/08/30(土) 23:01:26
BS1にチョムスキー出てた
104名無しさん@お腹いっぱい。
垢版 |
2008/10/30(木) 23:58:54
c言語でコメント/*から*/を字句解析できないようにさせるには、
規則部にどういう正規表現をすればいいですか?

/*
・・・・・・
*/
となっています。
2008/10/31(金) 00:52:06
lex?

flexのFAQに、
How can I match C-style comments?
ってのがあるよ。
2008/10/31(金) 12:09:51
flex だったらそれでいいね。

一般的には、
非欲張り型量指定子 *? が使えるなら /\*.*?\*/ でおk

使えない場合は少々厄介で、
/\*([^*]|\*+[^/*])*\*+/

詳説正規表現の第二版だと 6.6.8.3 にある。
107名無しさん@お腹いっぱい。
垢版 |
2008/11/01(土) 00:04:56
>>105,106
どうもありがとうございました。
大変恐縮なんですが規則部に入れるバージョンで教えてもらえないですか?
"/*"
から始まると思いますが・・・
108名無しさん@お腹いっぱい。
垢版 |
2008/11/01(土) 00:35:06
>>105,106
lex用に直してコンパイルしましたらできました。
"/*"+[^/*]*+"*/
また教えて下さい。
109名無しさん@お腹いっぱい。
垢版 |
2008/11/01(土) 01:56:53
ファイルからプログラムを読み込ませてそのプログラムに出てくる演算子とか
識別子の数を一番下に表示させるようにするにはどうしたらいいですか?
2008/11/01(土) 09:43:16
パーズしろ。
2008/11/01(土) 16:25:17
C言語のコメントってプリプロセッサが空白に置換するものだよ。
2008/11/02(日) 11:08:35
サーバの役割のひとつに
クライアントからの電文をプロトコルにしたがって解析して、処理し、返答を
返すという役割があるかと思います。

パーサジェネレータをつかって、簡単に上記のような枠組みを
実装するようなことはできないでしょうか。

インタプリタをパーサジェネレータを使って実装するような流れはあるのに、
drubyやerlang、アクターモデルなどの実装方法とパーサジェネレータが
なぜか結び付けられていないのが不思議に思われます。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況