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
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文法の範囲内しか扱ってないけれど最初に手を着けるにはこれぐらいでいい。
161 名前:棄教者 ◆witdLTi2 mailto:sage [02/07/31 08:42] >>159 Yaccを使いこなせるようになった方が手っ取り早いです。 yacc/lex プログラムジェネレータ on UNIX 五月女健治著 テクノプレス ISBN4-924998-14-1
162 名前:デフォルトの名無しさん mailto:sage [02/07/31 13:58] >>159 自前で作らなきゃいやなの?
163 名前:159 mailto:sage [02/07/31 14:39] >>160 もっと基礎や概念みにつけるべきということですね。 英語はかなり苦手ですが、いい機会なので昼休み等に読んでいこうと思います。 >>161 昨日Yacc/Lex関係の本を探してみたのですが、 Flaxの本しかありませんでした(買いませんでした) 教えていただいた本を探してみようと思います。 (そういえばネットで買えるとこがありましたよね) >>162 仕事には全く関係ないというか、完全に興味本位です。 あとオブジェクト指向を勉強してたとき感じたのですが、 自分の知らない技術理解すると、今までやってきたことを 違った視点で見れたりするじゃないですか。 そういうのも狙ってます。 (再起下降構文解析とかみててビビビときましたね)
164 名前:デフォルトの名無しさん mailto:sage [02/07/31 14:48] >>161 LL の方が エラー回復が楽 先読みするトークン数を容易に増やせる って利点もあるから、俺は両方やることを推奨したい。ま、お勉強としては 手書きのパーサーも悪くないっしょ。
165 名前:デフォルトの名無しさん [02/07/31 20:00] 下の文法のパーサをつくれたらLALR(2)パーサジェネレータを名乗っていいですか? //term a b c //non-term START: E; E: C a a| D a b; C: A; D: B; A: a; B: a;
166 名前:デフォルトの名無しさん mailto:sage [02/07/31 20:03] >>165 実際にLR表作ってみたら?
167 名前:デフォルトの名無しさん mailto:sage [02/07/31 20:07] >>166 できてるっぽいんですが、goto表をここに貼ってみればいいですか?
168 名前:デフォルトの名無しさん [02/07/31 21:22] 貼っていい?
169 名前:デフォルトの名無しさん mailto:sage [02/08/02 00:48] イっていい?
170 名前:高速化 [02/08/07 02:49] インテルのコンパイラでコンパイルするだけで高速化しました。 無料体験版があります。 www.xlsoft.com/jp/products/vtune/perftool.htm
171 名前:デフォルトの名無しさん [02/08/07 03:02] ハッシュはどこら辺を参考にすればいいんでしょうかねぇ。
172 名前:デフォルトの名無しさん [02/08/15 00:22] 『コンパイラ構成法』を読みながらlex/yaccを勉強しているのですが、 ttp://216.239.51.100/search?q=cache:lYpgKL5fV34C:www.hara.cs.keio.ac.jp/kCompiler/+%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9%E6%A7%8B%E6%88%90%E6%B3%95+%E6%AD%A3%E8%AA%A4%E8%A1%A8&hl=ja&lr=lang_ja&ie=UTF-8 でダウンロード出来るであろうソースコードが相手先サーバーが動いていないか何かで、ダウンロード出来ません。 正誤表はグーグルキャッシュでゲットできたのですが。 ソースコードお持ちの方、どこかのアップローダに上げていただけませんか?
173 名前:棄教者 ◆witdLTi2 [02/08/15 15:30] >>172 いま、鯖がdjみたいですね。 このまえはぼくもダウソできたので。 しばらくしたらもう一度渡来してみたらどうよ。 この本は親切で分かりやすい本です。おすすめです。 わからないところや面白い本はドラゴンブックで補充するとさらに良いでしょう。
174 名前:ろうひ男爵 [02/08/17 05:29] >>171 '0'-'9' を 0-9 '@' を 10 'A'-'Z' を 11-36 '_' を 37 'a'-'z' を 38-63 それ以外を 0 にする文字変換テーブルを作り(chartbl[256])、 ハッシュ表(hashtbl[256])を256だとすると、 hashtbl[chartbl['最初の文字']+chartbl['真ん中の文字']+hashtbk['最後から2番目の文字']+chartbl['最後の文字']] でハッシュ値が収得できるよ。
175 名前:デフォルトの名無しさん [02/08/27 16:01] インタープリターの勉強したいんですが、どこかに参考コードとか、 いい本ありませんか?
176 名前:ろうひ男爵 [02/08/27 16:38] どういった用途に使います?>>175 中間言語に落として、ゲームやツールに組み込む単純なスクリプト言語なら、 LL(1)が良いと思います。 それ以上に簡単な物の方がよいのでしたら、 構文解析もほとんど考えなくても良い言語にしたら簡単なんじゃないのでしょうか? 使用用途にもよりますが、以下ぐらいなら簡単に作れるのではないでしょうか? 命令を組み込みの物だけにする、 関数を使えなくする、構造化も出来なくする(手続き言語の古いMS-BASICみたいにする) 変数は$マークから始まるとか、特殊記号にする 算術計算式などを、別扱いにするか、専用の命令を作り、ADDとかにしする。 それでも、バックパッチぐらいは必要ですけど。 LLなら、そこまで難しくはないけど、 yaccとlexを使い、LALRって方法でも簡単に出来ますよ。
177 名前:デフォルトの名無しさん [02/08/27 16:53] >>176 用途というか、PerlやHSPを使ってるうちに、どうやってコンパイラや スクリプトが動くんだろうと思って、すごく簡単なものでもいいから作れたら 勉強がてらやるのもおもしろいかなーと漠然と思ったんです。 コンパイラに関してはぜんぜん知らなかったので、すこしWEBを見て LL(k),LR(k)について勉強しましたが、言ってる事は理解できても それをどうやってコードにしようと悩んでしまって。なにかコードがあれば みながら勉強することができるのですが・・・言語はJAVAかCかPERLか、VB くらいしか使えないので、どれかでやろうと思っています。 何かインタープリター系の本でコードが載っていて、いい本かなにかありますか? お願いします。ちなみにUNIX系使えないのでYACCとかできません・・・
178 名前: ◆JAPH9PWA mailto:sage [02/08/27 17:42] Macは知らないけど、Windowsならyaccあるよ hp.vector.co.jp/authors/VA010446/toolbox1/
179 名前:デフォルトの名無しさん [02/08/27 17:49] JavaCCで、構文と構文の隙間を埋めるような 柔軟な構文を定義する方法を教えてください。 Perlでいうところの (.*?) みたいなものが欲しいんです。お願いします。
180 名前:デフォルトの名無しさん [02/08/27 18:07] www.tokumaru.org/index.htm ここのコンパイラソースコードは参考にはならない?
181 名前:ろうひ男爵 [02/08/27 18:37] >>177 でしたら、 コンパイラ構成法 原田 賢一 共立出版株式会社 ISBN: 4320029224 6,500円 が一番分かりやすいのですが、yaccとlexが必要です。 コンパイラの仕組み 情報科学こんせぷつ〈8〉 朝倉書店 ; ISBN: 4254127081 も物量的に少ないので読みやすいですが、消化不良のところが出てきます。 しかし、1日から一週間で読めると思います。 あと、インタープリタとコンパイラの違いは大きくないので、 ここのスレッドに色々質問すると良いかもしれません。 どちらにしろ、コンパイラ関連の本は難解な物が多く、 いろいろなアルゴリズムを理解していることが前提となったりするので、 軽くアルゴリズムの本を読んでおいた方がためになりますよ。 アルゴリズムを1冊ですますには、以下の本が良いと思います。 定本Cプログラマのためのアルゴリズムとデータ構造 近藤嘉雪 技術評論社 簡単なアルゴリズムの本は C言語アルゴリズム+徹底入門 柏原正三 技術評論社 が読みやすいです。
182 名前:デフォルトの名無しさん mailto:sage [02/08/27 18:40] 金出す前にこれでも読んどけ。 www.hayalab.cs.ritsumei.ac.jp/~hayashi/materials/textbook.html
183 名前:Aoki [02/08/27 19:12] 実行速度が速いSmalltalkを実装するための技法をいろいろ教えて下さい。
184 名前:デフォルトの名無しさん mailto:sage [02/08/27 20:03] >>179 JavaCCは少し使ったことがあるんで、答えられるようなら答えますけど、 Perlは知らないんで、質問の意図がわからないです。
185 名前:179 [02/08/27 20:28] <ALL:~[]> /* Perlの(.*)相当だと思うのですが… */ void this () : {} { ( "{" this() "}" )+ )|(s = getAll() { println(s) } ) } が、期待通りの動作をしてくれません。 左の構文を優先させたいのです。お願いします。
186 名前:179 [02/08/27 20:35] 具体的には、(asdf()asdf((asdf)asdf)) みたいなのをパーズしたいと思ってます。 asdfの部分は、それが構文そのものを含む時以外は、 全ての文字を処理したいのです。
187 名前:デフォルトの名無しさん mailto:sage [02/08/27 20:46] <ALL:~[]*> すみませんこっちでした。
188 名前:184 mailto:sage [02/08/27 21:43] まだようわからんけど、{asdf{}asdf{{asdf}asdf}}が無理やりパースできるようにしてみた。 解釈が間違えてたらごめん。 TOKEN : { <ALL: (~["{","}"])+> } void Input() : {} { foo() } void foo() : { String s; } { ( LOOKAHEAD(2) "{" ( foo() )* "}" )+ | (s = getAll() { System.out.println(s); } ) } String getAll() : { Token t; } { t = <ALL> { return t.image; } }
189 名前:179 [02/08/27 21:58] ありがとうございます。参考にします。
190 名前:デフォルトの名無しさん [02/08/28 05:15] パスカルやCはLL?LR?どっちを使ってるの?最近のはやいコンパイラは みんなLRかな?
191 名前:デフォルトの名無しさん mailto:sage [02/08/28 09:24] 最近のflexはスレッドセーフなCコードを吐くようになったのか。 %option reentrant
192 名前:デフォルトの名無しさん [02/08/28 10:06] >>182 のリンクはいいリンクだ
193 名前:デフォルトの名無しさん mailto:sage [02/08/28 10:13] >>190 パスカルはLL(1)じゃないの?
194 名前:デフォルトの名無しさん mailto:sage [02/08/28 10:58] PascalはLL(1)でもパースできるように設計されているだけであって、 コンパイラがどうしているかは別。
195 名前:棄教者 ◆witdLTi2 mailto:sage [02/08/28 13:04] >>182 のリンク先にあるコンパイラのソースコードの解説、 これってWEBを使って吐き出されたのかなぁ。 スレとは関係ないのでsage そういえば TeX とか WEB とか Knuth なスレってあったっけ?
196 名前:デフォルトの名無しさん [02/08/28 13:41] Texスレはなぜかビジネスソフト板で見たような気がする。 Knuthスレはないんじゃないかな? >>182 のリンク先にある www.hayalab.cs.ritsumei.ac.jp/~hayashi/materials/SCF.pdf の元のコードってどこにあるの?ないぞ
197 名前:デフォルトの名無しさん [02/08/28 16:32] knuthが作ったWEB言語って何?気になるんだけど
198 名前:デフォルトの名無しさん mailto:sage [02/08/28 22:53] >>197 Knuthが提唱した文芸的プログラミングの実装、かな? ドキュメントの中にソースコードを埋め込む形を取ることで、ソースとドキュメントの 間の不整合や、ドキュメント無きコーディングを避けるっていうものらしい。 コンパイルのためにはドキュメントの中からソースを抜き出してコンパイラに渡す プログラムが必要になる。 で、Knuth自身が作った、TeXドキュメントからPascalプログラムを抜き出してコンパイルする システムがWEBシステムの筈。 詳しくは www.google.com/search?hl=ja&ie=UTF-8&oe=utf-8&q=Knuth+WEB&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=lang_ja でも見れ。
199 名前:デフォルトの名無しさん mailto:sage [02/08/28 22:54] >>195 TeX総合スレ@数学板 science.2ch.net/test/read.cgi/math/1026634481/
200 名前:棄教者 ◆witdLTi2 [02/09/02 13:04] >>111 原田本を今読んでいるところですが、気になった箇所があるので皆さんにお伺いします。 p.164下から11行目 > $p_m$ にアドレス $m+n$ の領域を割り付ける. とあるのは > $v_m$ にアドレス $m+n$ の領域を割り付ける. ではないでしょうか。 ちなみに正誤表 www.hara.cs.keio.ac.jp/kCompiler/Errata/Errata.html で確認したところ、掲載されていませんでした。 いきなり原田先生にメールして自分が間違っていたら恥ずかしいので、 2CHのハッカーの皆さんに確認してからメールをしようと思います。
201 名前:棄教者 ◆witdLTi2 [02/09/02 13:04] テユーカ200get
202 名前:棄教者 ◆witdLTi2 mailto:sage [02/09/02 16:12] >>182 p.15 の BNF の説明 > Backus Nauer Form Backus Nauer Form (BNF) では、.... って the Jargon File には Backus-Naur Form / Backus Normal Form って書いてあるんですけど。。。 Nauer って who?
203 名前:デフォルトの名無しさん mailto:sage [02/09/02 16:33] ドイツ語綴り->Nauer 英語綴り->Naur だったと思う。
204 名前:棄教者 ◆witdLTi2 mailto:sage [02/09/02 17:15] グーグルすると backus naur form で日本語限定だと213件, 言語非限定だと約20700件ヒット。 backus nauer form で日本語限定だと9件, 言語非限定だと253件ヒット。 おまけに「スペリング修正候補 backus <b>naur</b> form」として修正を勧告される。
205 名前:棄教者 ◆witdLTi2 mailto:sage [02/09/02 17:16] ×backus naur form で日本語限定だと213件 ○backus naur form で日本語限定だと215件
206 名前:デフォルトの名無しさん [02/09/03 21:12] インタープリタの仮想機械に興味を持ち、調べています。 調べてみた JVM、CRI、Python はいずれもスタックマシンのようでしたが、レ ジスタマシンと比較して何かメリットがあるのでしょうか。
207 名前:デフォルトの名無しさん mailto:sage [02/09/03 22:29] Forthハッカーの伝統。 というのは半分冗談だけど、中間コードが簡単/短くできるからじゃないんですか。 コンパイラも作りやすいし。
208 名前:デフォルトの名無しさん mailto:sage [02/09/04 00:53] 詳しくは知らんけど、インタープリタの仮想機械では、 レジスタのアクセスがメモリをアクセスするのと同じ。 パイプラインとかハードウェアで実装する場合の利点が いかせられないからだと思う。
209 名前: mailto:sage [02/09/04 02:05] >>206 仮想マシンで最もコストが高いのが、コードのフェッチとデコード。 スタックマシンなら、コードも短いしオペランドも要らない。
210 名前:デフォルトの名無しさん mailto:sage [02/09/04 11:34] >>207-209 ありがとうございました。 まとめると、ネイティブコードまでコンパイルするのでなければ、レジスタマ シンでも結局はメモリへのアクセスを行うことになるので、スタックマシンに 対する利点はなく、むしろコードが短くなる分だけスタックマシンの方が速度 的に有利、というところですかね。
211 名前:ろうひ男爵 [02/09/04 12:20] >>210 たしかに、 ネイティブコードへ最適化する場合、レジスタマシンの方が有利ですよね。 広域レジスタとローカルレジスタを割り当てたりした方が最適化しやすいですからね。 一方、インタプリタの場合、おっしゃるとおり レジスタマシンと言っても結局メモリアクセスされるので、 スタックマシンに対するメリットはないですね。 それだったら、簡単に設計でき、 なおかつコードが短くなるスタックマシンの方が有利でしょう。 自分的には出力されたコードがレジスタマシンの方が読みやすいので、 レジスタマシンを使ってます。(インタプリタですが)
212 名前:デフォルトの名無しさん mailto:sage [02/09/04 14:39] つーかJITコンパイル等でチューニングを詰めていくと 結局どっちも速度的に大差ないという話。
213 名前:デフォルトの名無しさん mailto:sage [02/09/04 21:04] スタックの一部をレジスタにマップする最適化は比較的簡単だから ネイティブコードでも結構速くなる。 ネイティブコードのみをがりがりチューニングしたければ、中間コードは 3つ組や4つ組がわかりやすいかも。
214 名前:デフォルトの名無しさん [02/09/05 10:00] インタープリタの初歩なら、石田晴久訳のUNIXプログラミング環境の 後半のhocを一通りやってみるのが近道じゃないかな。
215 名前:デフォルトの名無しさん [02/09/05 14:22] スタックマシンでのコンパイルがよくわからない〜
216 名前:デフォルトの名無しさん [02/09/06 01:30] ちとスレ違いですが、JITの勉強にお勧めの良書教えてくれませんか?
217 名前:デフォルトの名無しさん mailto:sage [02/09/06 02:16] >>216 詳しくはないけど、良書どうこういうより、 JITについて書かれている本を探すの自体が大変だと思う。 一応、参考URLを貼り付けておく。 shuJIT www.shudo.net/jit/index-j.html
218 名前:デフォルトの名無しさん mailto:sage [02/09/07 15:01] コンパイラの理論と実現ではC--という小さなCの処理系を作ってるけど それのソースコードがわけわからんとです。 構文木の構造体が struct TREE{ int val; struct TREE *left; struct TREE *right; } で、 maketree(int a,TREE *b,TREE *c)という関数で構文木を作るんですが、 あるところでmaketree関数のパラメータのbにint型を渡してるんです。 型が合わないからエラーがでると思うのですが、なにか僕が大きな間違いをしてるんでしょうか
219 名前:デフォルトの名無しさん mailto:sage [02/09/07 19:27] >>218 sizeof(int) == sizeof(void*) を仮定していて、 int の即値を格納しようとしているとか?
220 名前:218 mailto:sage [02/09/08 11:15] >>219 構文木関係の部分だけ抜き出してコンパイルしてみると、 BCCではエラーがでました(TREE *型にint型は渡せない。と言っておられました)、 clは警告文だけでした。それにちゃんと動きました。 うーむ、やはり即値を渡しているのか。。。
221 名前:デフォルトの名無しさん mailto:sage [02/09/09 17:06] >>218 宣言してない関数の戻り値をそのまま渡してるとか? それかNULL代わりに0渡してるんじゃない? こんなんだったらどっちでも昔の名残だね。
222 名前:218 mailto:sage [02/09/09 21:26] >>221 なにしろANSIで定められる前のCなので古めかしいところは多いです たとえば、 func(a,b){ int a; int b; } とか。。。 それと、bには字句解析で得たリテラルを渡してるようです (TREE *)にキャストしてやることで問題は回避できました。
223 名前:デフォルトの名無しさん mailto:sage [02/09/11 23:39] >>222 それを書くなら、こうだろう。 func(a, b) int a; int b; { ... } > それと、bには字句解析で得たリテラルを渡してるようです 正攻法としては union 使うように書き換えちゃえ、かな。
224 名前:デフォルトの名無しさん mailto:sage [02/09/21 12:17] LALR(K)パーサジェネレータのお勧めってありますか? googleでlalr(k)てしたところいくつか見つかったのですが。
225 名前:デフォルトの名無しさん mailto:sage [02/09/21 13:28] >>224 yacc以外でってこと? といっても他はyaccの他言語用ぐらいしかしらないけど。
226 名前:デフォルトの名無しさん mailto:sage [02/09/21 14:09] >>225 いやそうでなく k >= 2 という意味でお願いします。
227 名前:デフォルトの名無しさん [02/09/22 19:47] www.cminusminus.org/ これはよいです。
228 名前:デフォルトの名無しさん [02/09/25 09:46] >>227 面白そうですね 簡単に説明してもらえませんか?
229 名前: mailto:sage [02/09/25 10:05] >>228 自分で読む気はないのか?
230 名前:デフォルトの名無しさん mailto:sage [02/09/25 11:26] Cより低級な、簡単なアセンブラとしてのC--ってことでは?
231 名前:デフォルトの名無しさん [02/09/25 21:44] 氷魚さんの作ったやつ?
232 名前:デフォルトの名無しさん mailto:sage [02/09/25 22:01] >>231 だれそれ?電波固定?
233 名前:デフォルトの名無しさん [02/09/25 22:09] コンパイラとかじゃなく、ファイルを読む道具としてyacc&lexを 使っているのですが、入力した数値で要素数が定義されてるよう な場合どうしたらよいでしょうか? 要素数 - 要素... 4 4 4 2 2 5 0 1 0 2 3 2 0 3 という形式です。 int_array : /* empty */ | integer | int_array integer ; では、全部一気に読んでしまうので・・・。(低レベルでスマン・・・。)
234 名前:デフォルトの名無しさん mailto:sage [02/09/26 03:13] >>233 int_array : /* empty */ | one integer | two integer integer | three integer integer integer (略) ; とするとか… イヤスギ
235 名前:デフォルトの名無しさん mailto:sage [02/09/26 03:43] int_list: /* カラ */ | integer | int_list integer ; int_array: integer int_list ; ダメか?
236 名前:棄教者 ◆KIKYO7cg mailto:sage [02/09/26 08:48] -----------------yacc------------ %token NUM %% lines : /* empty */ | line lines ; line : index elements '\n' ; index : number ; elements : /* empty */ | number elements ; number : NUM ; %% ------------------lex------------- [0-9]+ { yylval = atoi( yytext ); return NUM; } [ \t] { /* 空白は捨てる */ } でどうよ。
237 名前:233 [02/09/27 01:01] レス下さった方々ありがとうございます。 >>234 ちょっと無理です・・・。^^; >>235 最初の要素は良いのですが残りはすべてint_list integerに一致して しまうようです。 >>236 233の例では行けると思いますが、実はこの形式を出力するツールは 一つではなくて、それらの間で改行の位置というのは統一されていな いのです。というわけで、できれば改行フリーでなんとかしたいと 思ってるのですが・・・。 うーん、そもそも読み込んだ値を利用したり、繰り返しの回数を制限 するのはyaccで定義できる構文の概念を逸脱しているんでしょうか・ ・・。 今回はyaccの使用はやめてlexだけに留めるべきかもしれませ んね。(その辺ご存知の方いましたら後学のため教えていただきたい です。)
238 名前:デフォルトの名無しさん mailto:sage [02/09/27 01:04] >>237 atoiでいいじゃん。 「何回繰り返す」とかはセマンティクスの部類に入るから、 yacc使うのはお門違い。
239 名前:デフォルトの名無しさん mailto:sage [02/09/27 01:09] >>237 ドラゴンブックにはそういうの(個数の検査とか)は構文では解決でけん と書いてあった気がします。
240 名前:デフォルトの名無しさん mailto:sage [02/09/27 01:19] >>233 正攻法は単に数値のリストとして、リストに含まれる文字コードチェックに 利用を限ってしまうのがいいんじゃないかな? 考えてみるのは面白そうだけど、 仕事となると、むきになってやっても費用対効果がなさそうだし・・・