X



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

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

lexとyaccは、我々が既に書いてきた字句解析ルーチンと同一のメカニズムで、共同して働く。
0012名無しさん@お腹いっぱい。
垢版 |
NGNG
ヤッケ?
0017えんぢにあ
垢版 |
NGNG
>>15
使わない。
業務システムのコンサル SE だから。
# いまは、ぷー太郎だけど。
0018名無しさん@お腹いっぱい。
垢版 |
NGNG
率直な話、プログラマじゃなきゃ使い道ないとおもうなぁ。
ふつーの文字列処理で使えるものなのか?
一般人の使うような使い方があったらだれか教えて
0022えんぢにあ
垢版 |
NGNG
>>21
lex が必要になることがあまりないな。
たいていは sed で済んじゃうし。

そういえば SJIS to EBIDIK 変換の前処理を
C で書いたけど lex 使えば楽だったかも。
0023棄教者 ◆witdLTi2
垢版 |
NGNG
>>21
でも Perl でも十分。
lex が必要になったことは滅多にない。
0025名無しさん@お腹いっぱい。
垢版 |
NGNG
俺、yacc は使うけど lex の部分は手で書いちゃう。
再帰降下型パーサーで、ちょちょいと書けるような
簡単な文法だと、yacc も使わずに、すべて手で書い
ちゃう。
これって、ひょっとして old type よりもさらに
older ってことですか? 欝だ死脳
0028名無しさん@お腹いっぱい。
垢版 |
NGNG
まだだ!まだおわらんよ!
>>27
perlのコンパイルの時も使います
0029名無しさん@Emacs
垢版 |
NGNG
yacc & lex 本で良いのどれ? ってもう買っちゃったけど。
C のインタープリタ作りたい。>>0
0032萌え萌え ◆MOE73MOE
垢版 |
NGNG
プログラム板にも何冊か推薦図書がありましたが、ぼくが参考にしたのは
yacc/lex プログラムジェネレータ on UNIX 五月女健治 テクノプレス
コンパイラ構成法 原田賢一 共立出版

他にも「コンパイラ」に関する本は何冊かありましたが、むしろ
yacc/lex の使い方よりもコンパイラの理論が中心になっているので、
初心者には取っつきにくいかもしれません。
0033棄教者 ◆KIKYO7cg
垢版 |
NGNG
>>32ハンドル間違えた。
0035名無しさん@お腹いっぱい。
垢版 |
NGNG
>>29
俺は「yaccによるCコンパイラプログラミング」って本が激しくよかったんですが
(lexは扱ってないけど)絶版になったと聞きました。
0037仕様書無しさん
垢版 |
NGNG
lex&yacc入門なら

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

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

でも、この本、まだ売ってんのかな?
004035
垢版 |
NGNG
>>36
本のほうは入手困難ぽ。俺もだいぶ苦労しますた。

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

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

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

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

lex ......... レックス
yacc .... ヤック
flex ....... フレックス
bison ... バイソン
0043名無しさん@お腹いっぱい。
垢版 |
NGNG
れきしかるあならいざじぇねれーた
いぇっとあなざーこんぱいらこんぱいら
ふぁーすとれきしかるあならいざじぇねれーた
のうし
0047名無しさん@お腹いっぱい。
垢版 |
NGNG
誰か、%type に複数の項目をカンマで区切って並べる書き方の載っている
マニュアルか何かを知りませんか?

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

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

V7のyaccをコンパイルして試してみたらカンマでもちゃんと通ります。
0048名無しさん@お腹いっぱい。
垢版 |
NGNG
>>41
覚えたてのころは、ごっちゃになって
レック
ヤックス
とか言ってた
0055名無しさん@お腹いっぱい。
垢版 |
NGNG
flex でルール部を C の変数で動的に生成することって出来ないですかね?
0056クンクン(葬式)
垢版 |
NGNG
>>55
何にでも当てはまるようなオマンコガバガバのルールに対して、
切り出したトークンの値に応じて C の内部で場合分けをして逝くのはどうかしら。。。

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

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

しかしナニをするものなのかとかは
全くシラン。
0062名無しさん@XEmacs
垢版 |
NGNG
>>55

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

flex を実行、 *.c を作成

コンパイル

yylex() を dlopen()

とか?

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

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

しかしlex使うシチュエーションって少ねえなあ。
0069名無しさん@お腹いっぱい。
垢版 |
NGNG
raccのこととかも語ってちょ。
0070名無しさん@お腹いっぱい。
垢版 |
NGNG
アドベンチャーゲームなど用にスクリプトプログラムを作成したいのですが、
そのような目的にyaccやlexって向いていますか?

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

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

0071名無しさん@お腹いっぱい。
垢版 |
NGNG
>>70
スクリプトプログラムを作成するインタプリタプログラムを作るには
むいてるかもしれない。日本語周りは要注意ね。

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

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

この場合、my_yyinput()はどういうタイミングで呼ばれるのでしょうか?
また、bufの値はどこで設定すればよいのでしょうか?
0075名無しさん@Vim%Chalice
垢版 |
05/01/30 03:09:21
 
0082名無しさん@お腹いっぱい。
垢版 |
2006/04/03(月) 12:15:00
flex のyy_push_state() って、FlexLexer ではprotected なのですが
ってことは、.y 側のルールでyy_push_state() を使うのはunsupported でつか?
0084「なぜ敢えて yyなの?」
垢版 |
2006/07/10(月) 19:35:15
lex は yy.lex.c吐くわ、yyナンチャラいう変数/関数をもってるわ
なぜそこで yy? あんた lexさんでしょう?と思ってしまうのですが

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

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

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

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

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

それとも不可能ですか?
0092名無しさん@お腹いっぱい。
垢版 |
2007/06/28(木) 02:59:57
BNFで書けるなら(つまり文脈自由文法なら)yaccで記述出来るし
BNFで書けないならyaccで記述出来ない

そのdefineをBNFで書いて見る事をお奨めする
0093名無しさん@お腹いっぱい。
垢版 |
2007/06/30(土) 14:03:07
ああ、ひょっとして91が作りたかったのは
defineじゃなくてインタプリタの事じゃないだろうか?
もしそうならyaccでは不可能。
だって、yaccはCompiler Compilerだから。
0097名無しさん@お腹いっぱい。
垢版 |
2007/07/01(日) 22:01:53
>>93
マクロ定義ができるコンパイラが作りたかったんじゃね?
0099名無しさん@お腹いっぱい。
垢版 |
2007/07/07(土) 17:12:42
関数定義ができるコンパイラを yacc で記述するにはどうしたらいいですか?
0101WNSyrttCnfyxM
垢版 |
2007/07/19(木) 15:40:27
rAwIsK name is Kostya.My nick is Zold . I want to find friends .ICQ 324600825
0104名無しさん@お腹いっぱい。
垢版 |
2008/10/30(木) 23:58:54
c言語でコメント/*から*/を字句解析できないようにさせるには、
規則部にどういう正規表現をすればいいですか?

/*
・・・・・・
*/
となっています。
0106名無しさん@お腹いっぱい。
垢版 |
2008/10/31(金) 12:09:51
flex だったらそれでいいね。

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

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

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

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

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

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