1 名前:nanashi de fault [02/05/12 02:05] 前スレ1より >yaccやlexの使い方やら言語仕様やらの話題。 前スレ 【コンパイラ・スクリプトエンジン】相談室 pc.2ch.net/test/read.cgi/tech/981672957/ 前スレアーカイブ(かちゅ用) www.1me.jp/hp/prg_c-s_lab 前スレに張られたリンク + x >>2-6
60 名前:デフォルトの名無しさん [02/05/27 05:40] 保守age
61 名前:デフォルトの名無しさん [02/05/29 01:31] 保守しる!
62 名前:デフォルトの名無しさん [02/05/29 23:47] もりあがらないね
63 名前:デフォルトの名無しさん [02/05/29 23:49] どうやって中間言語に翻訳しなおすのですか?
64 名前:HELP!あ〜にゃにゃにゃ〜にゃ〜 mailto:あげる [02/05/30 01:04] Yaccのソースが見つからないのれす。
65 名前:逝って良しの1 [02/05/30 01:15] 構文解析器だけは作りたくないです。
66 名前:デフォルトの名無しさん mailto:sage [02/05/30 01:24] >>65 再帰下降なら楽じゃん。
67 名前:デフォルトの名無しさん [02/05/30 03:00] >>64 GNU bison ならすぐ見つかるだろ。
68 名前:デフォルトの名無しさん mailto:sage [02/05/30 04:39] >>64 森氏のkmYaccならVectorで検索すれば有るんじゃない?ソース付きで。 この人のcppとmakeは自分なりに手直しして未だに使わせてもらってる。
69 名前:デフォルトの名無しさん [02/05/30 05:06] どうしても関数の実装ができません。あとcontinueとbreakも。
70 名前:デフォルトの名無しさん mailto:sage [02/05/30 11:08] >69 Cマガの2000年5月号をよめばわかります。
71 名前:64 mailto:sage [02/05/30 12:29] >>67 GNUは生理的に嫌なので。すんまへん。 >>68 ウヲ。すごいでつなこの人。ありがとうございます。
72 名前:デフォルトの名無しさん mailto:sage [02/05/31 01:41] >>71 そういうやつは生理的に氏ね!
73 名前:デフォルトの名無しさん mailto:sage [02/05/31 22:45] >>72 GNU のソースが生理的に嫌いだってのは、分からんでもない。あのインデントは 読みたくないよ。(というわけで GNU indent 通して整形してから参照してる俺)
74 名前:デフォルトの名無しさん mailto:sage [02/05/31 23:22] >>73 むしろライセンスの方じゃないの。
75 名前:デフォルトの名無しさん mailto:sage [02/05/31 23:53] >>74 73 の皮肉と諧謔を込めた文意を読み取れ。
76 名前:デフォルトの名無しさん mailto:sage [02/06/01 00:21] 75=73
77 名前:デフォルトの名無しさん mailto:sage [02/06/01 04:16] >>68 ちなみにこの人、LSI-Cコンパイラの作者な。 yaccもcppもmakeもその一部。
78 名前:68 mailto:ssage [02/06/01 13:53] ワシは厨房なんで高度な皮肉も 宗教じみたライセンスも理解できんので 避けてるのです。生理的に。用途違うかな。 >>77 普段LSI-C試食版使ってるので、cppで気づきました。 LSI-Cは一人の天才プログラマが作ったって噂があったけど、 本当だったんですな。あこがれます。
79 名前:真68 mailto:sage [02/06/01 16:48] ↑どうでもいいけど68書いたの俺な。あんた64じゃない? >>77 知っている。今はLSI JAPANの取締役らしいな。 bisonのジェネレータが出力するソースは見にくくて吐き気がするが、 kmyaccのは綺麗で分かりやすい。実用にも問題無いし、学習用にもお勧め。 俺はbisonから完全に乗り換えたよ。テーブルの小ささに惚れた。
80 名前:64 mailto:sage [02/06/01 19:58] スマソ回線切って首吊ってきます。
81 名前:73 mailto:sage [02/06/03 16:39] >>76 はずれ(w >>78 > 宗教じみたライセンスも理解できんので GPL は理解しておいて損はないと思うよ。 俺は GPL の趣旨には賛同しないので、自分が公開するソフトのライセンスは GPL にしない。でも GPL で公開されているソフトには有用なモノも多いし、ライ センスを理解して使えば GPL に汚染されずに旨い部分だけ頂ける。 (ちなみに個人的には BSD、仕事絡みではクローズドな人です)
82 名前:デフォルトの名無しさん mailto:sage [02/06/03 17:46] >ライセンスを理解して使えば GPL に汚染されずに旨い部分だけ頂ける。 この辺のところを、もう少し詳しく教えて( ゚д゚)ホスィ
83 名前:64 mailto:sage [02/06/03 23:01] 82に禿尿。readlineとかガリガーリ使っていきたいヨー
84 名前:デフォルトの名無しさん mailto: [02/06/04 04:10] LL(1)文法の Fisrt Follow Directorの計算アルゴリズムが良くわからん。 オーム者コンパイラ(中田育男 8刷 p85) 誰かわかりやすく教えてくれ。
85 名前:. [02/06/04 04:15] www.aa.wakwak.com/~ayaka/cgi-bin/privatetalk/sank.pl
86 名前: [02/06/05 01:17] >>84 過去ログ。
87 名前:デフォルトの名無しさん [02/06/06 23:29] ageeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
88 名前:デフォルトの名無しさん [02/06/07 11:22] 以前、Cで数十行で書かれた小さいBASICインタプリタを見たことあるん だけど、検索しても、どうしても見つかりませんでした。 知ってる人いますか?
89 名前:デフォルトの名無しさん mailto:sage [02/06/07 11:28] >>88 7行スレのことか?
90 名前:デフォルトの名無しさん mailto:sage [02/06/07 13:20] >>88 Expert Cに載ってる奴じゃない? www.ioccc.org/1990/dds.c
91 名前:デフォルトの名無しさん mailto:sage [02/06/10 16:08] >90 これ、VC6でコンパイル通らないんだけど、何だったらできる?
92 名前:デフォルトの名無しさん [02/06/11 00:42] C++の構文解析、 struct C { C (f)(); /*Cを返す関数f*/ C(); /*コンストラクタ*/ }; というので、{}のなかの 'C' まで読んだ時点でそれがclass-nameかdeclaratorかどうやって判断しているの? ひとつだけの先読みではわからないですよね。LALR(1)とかいうのとはちがうのですか?
93 名前:デフォルトの名無しさん mailto:sage [02/06/11 02:37] >>92 www.y-adagio.com/public/reports/mh_inst/1996/19.doc.htm
94 名前:デフォルトの名無しさん mailto:sage [02/06/11 02:44] >>92 読んだ時点で判断してるわけないと思うが。 そこは意味解析で判断する部分。 構文解析の段階だと C(); は「戻型が省略された関数C」とでも解析されるんだろう。 structの定義('}')が終わった段階で、 初めて意味解析が走ると考えたほうが自然。
95 名前:デフォルトの名無しさん mailto:sage [02/06/11 03:48] >>94 struct の } 終わってから解析って、そりゃ構文解析でほとんど何もやってない に等しい気が……。struct C の段階で「C」を型名としてシンボルテーブルに登 録しておいて C (f)(); → 識別子 '(' 識別子 ')' '(' 識別子 ')' ';' ぐらいにバラしてスタックに積んでおき、この段階で意味解析に掛けると思う。 構造体の宣言が終わらなくても ';' 単位でばらせば、十分に解析可能だよね。 少なくとも型名やら名前空間やら、必要な情報は事前に出てるわけだし。 (そうでもない?)
96 名前:デフォルトの名無しさん mailto:sage [02/06/11 05:05] 'C'まで読み込んだ段階では判定できないから 適当な中間の非終端記号を入れて判定を遅延させて、 十分読み込んだところで判定を確定する、という話じゃないの?
97 名前:96 mailto:sage [02/06/11 05:07] >95 と内容被ってた(鬱)
98 名前:92 mailto:sage [02/06/12 00:57] とりあえず全部identifierとして読んでおけばいいんですね。 Cの場合、構文解析の段階でtypedefとenumを辞書引きすればよさそう(試してない) だったので、C++もその延長でいけるかとおもっていたのです。 LALR(2)でならそれでもいけるかな?
99 名前:デフォルトの名無しさん mailto:sage [02/06/12 14:01] >>98 C は型名と変数名は異なる名前空間で定義されるから(型名と重複する変数名 を定義可能)、その方針でやる場合には 型名を読み込んだ → 字句解析側に、次にアルファベット列が来たら identifier を返すように設定 と、構文解析・字句解析での情報のやりとりが必要になるかと。
100 名前:92 mailto:sage [02/06/12 23:04] >>99 typedef名だけは型名と変数名の両方に登録されるようなので、 typedef t int; int t(); なんてのはエラーにしないといけない(?)のでどっちにしても 意味解析でも構文解析じみたことはしなければいけないみたいですね。
101 名前:100 mailto:sage [02/06/12 23:05] typedef t int × typedef int t ○
102 名前:デフォルトの名無しさん [02/06/16 01:17] 最適化するのにポインタって邪魔ですか?
103 名前:デフォルトの名無しさん mailto:sage [02/06/16 01:21] 邪魔。
104 名前:デフォルトの名無しさん mailto:sage [02/06/16 01:32] っですよねー。 三項になりましたサンクコ
105 名前:デフォルトの名無しさん mailto:sage [02/06/16 01:40] オブジェクトやメモリを参照することを禁止したポインタなら邪魔にならない。
106 名前:デフォルトの名無しさん [02/06/18 03:52] 1+a+2 を逆ポーランドで表現した 1a+2+ というデータだけがここに有るとして、これを 3a+ にうまく変形出来ないだろうか。
107 名前:デフォルトの名無しさん mailto:sage [02/06/18 04:00] >>106 出来る。
108 名前:デフォルトの名無しさん mailto:sage [02/06/19 00:19] >>106 buri.sfc.keio.ac.jp/~yosuke/keisan-kino-ron/koubungi.gif の図で言うと * と / が演算子の結合度が同じかつ親子なので、 a を a / d で置き換えてよい。 今考えたんで合ってるかどうか分からんけど。
109 名前:age mailto:age [02/06/20 01:05] age
110 名前:デフォルトの名無しさん [02/06/21 02:17] 保守汁
111 名前:デフォルトの名無しさん mailto:sage [02/06/24 11:39] 昨日LAOXのBOOK館でドラゴンブックの邦訳を買ったDQNを目撃した人はいませんか? それが私です。 ついでにもう一冊、と、 原田賢一『コンパイラ構成法』共立出版、374頁、1999 を買っちゃいました。こちらはDQNの私でもわかりやすく例を挙げて、 C言語ライクの言語を構築する方法を説明してありました。
112 名前:デフォルトの名無しさん mailto:sage [02/06/25 01:16] DQN がドラゴンブック買うかよチクショー。
113 名前:コンパイラ構成法 mailto:sage [02/06/25 03:49] おもわず検索してソースだけget。
114 名前:棄教者 ◆witdLTi2 mailto:sage [02/06/25 07:47] >>113 あ。ほんとだ。 正誤表とソースがげtできる! カムサハムニダ。
115 名前:デフォルトの名無しさん [02/06/30 20:21] 保守
116 名前:デフォルトの名無しさん mailto:sage [02/07/07 23:12] やっと前スレが埋まったね。
117 名前:質問 [02/07/07 23:43] どうしてこのスレはもりあがらないんですか?
118 名前:デフォルトの名無しさん mailto:age [02/07/07 23:49] kmyaccとflexを組み合わせて使うことは可能なんですか?
119 名前:デフォルトの名無しさん [02/07/08 00:24] 生理的に可能
120 名前:デフォルトの名無しさん [02/07/08 00:31] ありがとう カムサハムニダ
121 名前:デフォルトの名無しさん [02/07/08 01:12] ちうか、今の時代、構文解析なぞを勉強するのはあまり意味がない 気もするのだが... まだLALRとかが発明される前なら研究の 対象にはなっただろうが、今はyaccが使えればいいじゃん、と思う。
122 名前:デフォルトの名無しさん [02/07/08 01:13] antlrの使い方がわかればなおよい。 と言ってる俺はyaccしか使えません首吊ってきます
123 名前:棄教者 ◆witdLTi2 [02/07/08 08:21] >>121 yaccの文法はわかっても即コンパイラ・スクリプトが書けるとは限らないという罠。
124 名前:デフォルトの名無しさん mailto:sage [02/07/08 08:35] >>121 いや〜、でも憶えないとコンフリクトの理由が分からなくて困ることとかない? でも、なにも知らないところからだったら yacc 憶えた後の方が理解が早いので 手順として先に yacc は賛成。
125 名前:デフォルトの名無しさん mailto:sage [02/07/08 10:10] >>121 コンパイラ・コンパイラの段階から自作できるようになって、初めて一人前。
126 名前:デフォルトの名無しさん mailto:sage [02/07/08 10:39] コンパイラ・コンパイラ・コンパイラはどうやって作るんですか?
127 名前: mailto:sage [02/07/08 11:02] >>126 コンパイラ・コンパイラと一緒。 * (コンパイラ・コンパイラ)・コンパイラ * (YACC のコンパイラ)・コンパイラ * (C のコンパイラ)・コンパイラ
128 名前:デフォルトの名無しさん mailto:sage [02/07/08 14:19] >>126 作る必要はありません。
129 名前:デフォルトの名無しさん mailto:sage [02/07/08 16:40] >>126 コンパイラ・コンパイラ・コンパイラの段階から自作できるようになって、初めて神。
130 名前:デフォルトの名無しさん mailto:sage [02/07/09 03:40] [コンパイラ]n ・ コンパイラの段階から自作できるようになって、初めて神。
131 名前:ふわふわ名無しさん mailto:sage [02/07/09 04:16] 結局のところ、コンパイラ・コンパイラさえ作れれば神。 証明↓
132 名前:デフォルトの名無しさん mailto:sage [02/07/11 03:28] ⊂(ΦωΦ)⊃フフフ・・・・
133 名前:棄教者 ◆witdLTi2 mailto:sage [02/07/11 16:15] >>131 テユーカ、一番すごいのはダイレクトにマシンコードを吐き出すコンパイラをハックする人だと思う。
134 名前:デフォルトの名無しさん mailto:sage [02/07/11 18:45] 再帰下降ってみんなもう使ってないの?
135 名前:デフォルトの名無しさん mailto:sage [02/07/11 20:44] >>134 JavaCCが、再帰下降のパーサを生成する。 WebGainが音信不通なんでどうなることやら。
136 名前:デフォルトの名無しさん [02/07/17 00:05] 昔のインタフェースの特集記事に色々とあったな
137 名前:デフォルトの名無しさん [02/07/22 00:34] while文を使ってfor文を定義したいのですが、 for(ex1;ex2;ex3){s;} は ex1; while(ex2){ s; ex3; } と書こうと考えますた。 なんですが、前から順番に構文解析していく場合 sを先に評価してex3を評価するなんてことをどうやって実現するのでしょうか? ジャンプ命令を使ったりしてどうにかするのでしょうか? 教えてください。
138 名前: mailto:sage [02/07/22 00:38] >>137 「定義したい」とはどういう意味だ?
139 名前:デフォルトの名無しさん mailto:sage [02/07/22 00:38] ブロック終端でのjumpの前の時点でex3を評価すればいいじゃん
140 名前:デフォルトの名無しさん [02/07/22 00:55] >>139 つまりsを読んだ後、ex2の前にjumpする前にex3を評価するってことですよね? でも前から解析していく際にex3はどのようにしておけばよいのでしょう。 プログラム書くときにex3のところをどうやって書けばいいのかが・・・考えてるんですけど 分からないんです・・・
141 名前:デフォルトの名無しさん mailto:sage [02/07/22 00:59] >>140 ハァ? それじゃfor()はどうやって実現してるんだよ?
142 名前: mailto:sage [02/07/22 01:12] >>140 もしかして、構文木とか作らずに、字面のまま実行してたりする?
143 名前:デフォルトの名無しさん [02/07/22 01:16] >>142 恥ずかしながらそうです。。。
144 名前:デフォルトの名無しさん mailto:sage [02/07/22 01:18] それじゃ、構造化言語を作るのは無理だろ。
145 名前:デフォルトの名無しさん [02/07/22 01:23] >>144 そうですか。。。 出直してきます。レスくれた方ありがとうございました。
146 名前:よ mailto:sage [02/07/22 01:31] continueに対応できない罠 とかいう問題じゃなかったか…
147 名前:デフォルトの名無しさん [02/07/22 02:24] www.combo.org/ これなんかもおもしろそう.
148 名前:デフォルトの名無しさん mailto:sage [02/07/22 03:53] 別に構文木を作らなくても、構造化言語のコンパイラは作れる。 というか、作ったことがある。 出力コードの最適化は難いし、jumpの塊になるけど、breakや continueもちゃんと対応できた。
149 名前:デフォルトの名無しさん mailto:sage [02/07/22 11:00] >>148 > 別に構文木を作らなくても、構造化言語のコンパイラは作れる。 不可能じゃないだろうが、for ループがネストすることを考えると、ジャンプ用の ラベルの振り方とか面倒そうだ。(それって、結局、構文木を作ってるのと手間 変わらんのでは?)
150 名前:デフォルトの名無しさん [02/07/29 04:09] 字句解析をする際に予約語と予約語でない名前とを区別するにはどうするべきなんでしょうか? つづりを切り出し照合せよなどと本には書いてあったのですが、意味がよく分かりません。 ハッシュ法を使って何とかするのでしょうか?
151 名前:デフォルトの名無しさん mailto:sage [02/07/29 05:24] >>150 とりあえず単語切り出すところまではできてるとして、後は static const char *keywords[] = { "if", "else", "while", ..., NULL }; int is_keyword(const char *s) { int i; for (i = 0; keywords[i] != NULL; ++i) if (strcmp(s, keywords[i]) == 0) return 1; return 0; } とか。キーワード数が増えたら、ベタな線形検索やめてハッシュや二分木を 使った方が良いかもしれんが、たかだか数十程度なら気にしなくて良い。
152 名前:ろうひ男爵 [02/07/29 09:44] >>150 c言語+asmのマクロを展開するプログラムを作って、 当初は普通の検索(線形検索)で90秒かかった処理が、 ハッシュ(チェイン法)を使って15秒になったよ。 でも、そのときの登録語数が3万単語位なので、 cコンパイラ部分だけで使うくらいの語数(変数合わせて千単語ぐらい)だと、 それほど性能の差は無いと思うよ。 ちなみに、2本木の方が実装は難しいかも。
153 名前:デフォルトの名無しさん mailto:sage [02/07/29 10:36] gperfつかっとけ
154 名前:デフォルトの名無しさん mailto:sage [02/07/29 12:13] 2本木ってなに?
155 名前:ろうひ男爵 [02/07/29 12:22] すまん、2分木の事。 あと、90秒かかったのが5秒になったの間違えです。
156 名前:デフォルトの名無しさん mailto:sage [02/07/30 01:44] 2本木なんて初めて聞いたよ
157 名前:ろうひ男爵 [02/07/30 04:41] >>156 すまんのう
158 名前:デフォルトの名無しさん mailto:sage [02/07/30 04:48] >>157 ろうひ男爵、いいかんじのひとだね。
159 名前:デフォルトの名無しさん mailto:sage [02/07/30 23:38] 後学のため自前でスクリプトコンパイラを作ってみようと思い、 再起下降構文解析とかBNFとかLAL(1)等の解説されているページをみてまわっています。 a -> a b b -> c c -> X このような一直線な処理は簡単にできる気がするのですが、 a -> a b|c b -> X c -> Y のようにorが入るとたちまちパニックです。 上記の場合bの処理でfalseが帰った場合、 取得したトークンをスタック等に積んでおいて、 cでそのスタックを参照するというような仕組みになるんでしょうか? それとももっとエレガントな仕組みがあるのでしょうか? 実は全くトンチンカンな事いっちゃってるんでしょうか? つべこべ言わずYaccで仕組み覚えろモルァ!でしょうか?
160 名前:デフォルトの名無しさん mailto:sage [02/07/30 23:56] >>159 まだコードやアルゴリズムを考える段階にないと思われ。 cspt1.ict.ru.ac.za/compilers/ ここにコンパイラ作りの基礎を書いた本一冊文のドキュメントがある。 LL文法の範囲内しか扱ってないけれど最初に手を着けるにはこれぐらいでいい。