『コンパイラ・スクリ ..
[2ch|▼Menu]
2:デフォルトの名無しさん
02/05/12 02:05
コンパイラ等を扱ったドキュメント

コンパイラおよびコンパイラコンパイラに関する本
URLリンク(www.ulis.ac.jp)

コンパイラ関連のリンク集
URLリンク(www.ulis.ac.jp)

スクリプティング言語資料室(仮) (リンク)
URLリンク(www.kt.rim.or.jp)

Compiler Construction
URLリンク(rananim.ie.u-ryukyu.ac.jp)

Compiler Construction (1997)
URLリンク(rananim.ie.u-ryukyu.ac.jp)

再帰下降構文解析の手法
URLリンク(member.nifty.ne.jp)

情報システム工学実験 III コンパイラ・コンパイラ
URLリンク(math.cs.kitami-it.ac.jp)

正規表現
URLリンク(hp.vector.co.jp)

コンパイラ研究・開発情報の一集積所
URLリンク(compilers.cs.uec.ac.jp)

計算機能論ホームページ
URLリンク(buri.sfc.keio.ac.jp)


3:デフォルトの名無しさん
02/05/12 02:05
Asm関係

Links and Selected Readings
URLリンク(www.gnu.org)

NASM Manual
URLリンク(www.bekkoame.ne.jp)

インテル(R) Itanium(TM) プロセッサ
URLリンク(www.intel.co.jp)

インテル(R) Pentium(R) 4 プロセッサ関連マニュアル (宝庫です)
URLリンク(www.intel.co.jp)

Streaming SIMD Extensions 2 (SSE2)
URLリンク(developer.intel.com)


4:デフォルトの名無しさん
02/05/12 02:05
Lex(Flex) Yacc(Bison) 構文解析

Turbo Pascal Lex/Yacc
URLリンク(www.musikwissenschaft.uni-mainz.de)

Jim Roskind's LALR(1) C++ Grammar
URLリンク(www.empathy.com)

Flexと Bisonを同時に使う
URLリンク(guppy.eng.kagawa-u.ac.jp)

KITE_ASM (yacc)
URLリンク(www.arch.cs.kumamoto-u.ac.jp)

KITE_ASM (lex)
URLリンク(www.arch.cs.kumamoto-u.ac.jp)

Cygwin
URLリンク(www.cygwin.com)

GNU utilities for Win32
URLリンク(unxutils.sourceforge.net)

5:デフォルトの名無しさん
02/05/12 02:06
ガベコレ

GC FAQ -- draft
URLリンク(www.iecc.com)

A garbage collector for C and C++
URLリンク(www.hpl.hp.com)



6:デフォルトの名無しさん
02/05/12 02:06
処理系,スクリプト

The Odd Stage (吉里吉里というゲームのスクリプト)
URLリンク(www.din.or.jp)

tiny C コンパイラ (C)
URLリンク(watalab.cs.uec.ac.jp)

Portable Object Compiler (Obj-C >> C のトランスレータ?)
URLリンク(users.pandora.be)

自作コンパイラの部屋(PL/1, Pascal等)
URLリンク(www.tokumaru.org)



7:デフォルトの名無しさん
02/05/12 02:08
持つ彼さまー!>1

8:nanashi de fault
02/05/12 02:09
つかれた・・・
たまに、よくわかんないのとか、リンク切れ、
その他重要じゃないのが入ってたんで添削しました。

あと、Intelとか張ったのはおれのしわざです。


では後誰か頼みます。

9:デフォルトの名無しさん
02/05/12 02:19
こっちモナー?
URLリンク(www.intel.co.jp)

10:1
02/05/12 02:21
>>9
すげぇ
つかそれだけ紹介すりゃ良かった・・・


11:デフォルトの名無しさん
02/05/12 04:01
DMonkeyもソース公開されてるけど。スレ違いならスマソ。

URLリンク(gaogao.moemoe.gr.jp)

12:デフォルトの名無しさん
02/05/12 09:40
いつのまにかsourceforgeにあるね、DMonkey
URLリンク(sourceforge.jp)

13:デフォルトの名無しさん
02/05/12 21:51
∩ ∩
(´×`)

14:デフォルトの名無しさん
02/05/12 22:48
>>13
ミッフィー?

15:デフォルトの名無しさん
02/05/12 22:53
∧_∧
(;゚×゚)

16:s
02/05/13 18:27
yaccableなC++はこちら〜〜

URLリンク(www.computing.surrey.ac.uk)

ページ中程のCxxSrc.tgz/CxxSrcNT.tgz

17:デフォルトの名無しさん
02/05/14 03:56
構文解析アルゴリズムって再帰下降使うのとyacc使うの以外にいいのありませんか?
再帰下降使うと似たような関数いっぱい書かないといけなくなるし
gccとかはどんなアルゴリズムなんですか?

18:デフォルトの名無しさん
02/05/14 04:00
>>17
gccのソースを見ろ。
〜〜〜 終了 〜〜〜

19:デフォルトの名無しさん
02/05/14 04:02
LL

20:デフォルトの名無しさん
02/05/14 07:35
gccはyaccだろ。

21:デフォルトの名無しさん
02/05/14 12:30
>>17
優先順位と結合規則とオペレータの関係をテーブル化する方法がある。
正式名称がなんなのかは知らないけど。
関数のポインタを使う。
似たような関数いっぱい書かないといけないのは同じだけど
メンテがし易くなる。それも気持ち程度。

22:デフォルトの名無しさん
02/05/14 18:30
>>21
演算子順位法かな?
基本的にはループ1つで実装できたので、「似たような関数いっぱい」とは
違うかも。

23:デフォルトの名無しさん
02/05/14 18:46
●コンパイラ 原理・技法・ツール 1&2
URLリンク(www.amazon.co.jp)
URLリンク(www.amazon.co.jp)

日本語で読める本では、結局これが一番(だと思ってる)。
バイブルだから・・・としり込みしないで読もう!
この本がコンパイラ本1冊目であっても十分読める(と思う)。


●プログラミング言語処理系 岩波講座 ソフトウェア科学〈5〉 佐々 政孝
URLリンク(www.amazon.co.jp)

2分冊うざい、という人にはこの本。


●コンパイラの構成と最適化 中田 育男
URLリンク(www.amazon.co.jp)

悪くはない(偉そう)。この本は最適化がメイン。

24:デフォルトの名無しさん
02/05/15 00:25
>>23
>●コンパイラ 原理・技法・ツール 1&2
>URLリンク(www.amazon.co.jp)
1巻はオススメしない。
LL(1)とかLR(N)とかはイラン。

25:デフォルトの名無しさん
02/05/15 02:00
(物理的に)手軽に読みたければ

●コンパイラの仕組み 渡邊 坦
URLリンク(www.amazon.co.jp)

という本もある。ただし、サイズの割に値段が手軽じゃない罠

26:デフォルトの名無しさん
02/05/15 06:10
>>17
再帰下降用のパーサー・ジェネレータもあるよん。

27:デフォルトの名無しさん
02/05/15 15:26
ANTLRはどうでしょう?
URLリンク(www.antlr.org)


28:デフォルトの名無しさん
02/05/21 18:51
前にもあった話題のような気がするのですが、、、。
再帰下降(手書き)とyaccでは、どちらが速いルーチンが作れますか?
yaccだという噂ですが、、、。


29:デフォルトの名無しさん
02/05/21 18:54
yacc

30:デフォルトの名無しさん
02/05/21 19:40
>28
どう考えてもyaccでしょ。

31:デフォルトの名無しさん
02/05/21 20:06
同じ言語を生成する文法なら漸近的な計算量は等しいが、普通は
再帰呼び出し/復帰1回より配列読み出しとgotoの方が速いだろ
うな。

ただ、Javaみたいに関数(メソッド)呼び出しが速くて配列操作が
比較的遅い言語だとどうかなあ…

まあ、yaccっていうからCに限るのかな。

32:デフォルトの名無しさん
02/05/21 20:10
LLで表駆動が早め

33:デフォルトの名無しさん
02/05/21 20:13
>>31
javaccとかいうのがあったはず

34:デフォルトの名無しさん
02/05/21 20:20
>>33
JavaCCはLL(k)だね。

35:デフォルトの名無しさん
02/05/21 21:18
>>31
Yet Another Compiler Compilerだから別にCとは限らない。

36:デフォルトの名無しさん
02/05/21 23:20
WindowsでGUIを利用した仮想マシンをつくるときって、
普通マルチスレッドで設計するでしょうか?
もう1つの言語スレでちょっと話題になってたのに、
今は全然違う方向に逝ってるからキケナイ...


37:デフォルトの名無しさん
02/05/21 23:22
>>36
>GUIを利用した仮想マシン
VMなのにGUIに依存するの?
Smalltalk見たいなもの?

38:デフォルトの名無しさん
02/05/21 23:30
>37
いや、スクリプト言語を作りたいんだけど、
言語と作るって言うのもなにかな〜と思って。


39:38
02/05/21 23:33
主旨書き忘れました。
要はHSPみたいなものを作りたいのです。


40:デフォルトの名無しさん
02/05/21 23:38
>>39
もう少し志を高く持とう。

41:38
02/05/21 23:49
志ってイってもなー
コンソール感覚でGUIアプリ作れたらなとか考えてるだけだしなー
大体作ること自体面白そうだし。


42:デフォルトの名無しさん
02/05/21 23:51
>>38

>コンソール感覚でGUIアプリ作れたら
意味がわからん。

43:デフォルトの名無しさん
02/05/21 23:52
>>41
いや、目標(HSP)が引く杉ってこと。

44:38
02/05/22 00:05
>42
>>コンソール感覚でGUIアプリ作れたら
>意味がわからん。
それもそうだ。
たとえば、
list = file_search("C:\My Documents\*.jpg");
foreach(list, itr){
image = image_load(itr);
tile_draw(image, 48, 32);
}
ぐらいの記述量でフォルダ内の画像一覧を表示するアプリが書けるとか。
いや、たとえだけど。

>43
>いや、目標(HSP)が引く杉ってこと。
そうか?
そうか。
うーむ。



45:42
02/05/22 00:12
>>44
記述量を問題にするなら、処理系でなく既存の
言語のクラスライブラリを整えた方がいいんでない?

でも、HSPでクラスライブラリはやだ・・・

46:42
02/05/22 00:14
あ。スクリプトか。
よく見てなかった。スマソ

47:デフォルトの名無しさん
02/05/22 00:14
>>38
LISPは構文解析いらないから楽だよ

48:デフォルトの名無しさん
02/05/22 00:18
>>47
いらないってこたあないだろ。
たしかに構文は簡単だけどさ。

49:デフォルトの名無しさん
02/05/22 00:19
DelphiやVBみたいに貼りつけ→即実行みたいな
環境を作るのってむずかしい?

50:デフォルトの名無しさん
02/05/22 00:21
>>48
最低限の構文は必要かと。
むちゃくちゃ楽なのは確かだけど。
あとはマクロで構文唐。

51:デフォルトの名無しさん
02/05/22 00:31
まあ下手な構文作るよりかはLISPのS式にしとく方がましだな。

52:38
02/05/22 00:31
>>47
構文解析とかは中田(?)氏の本を読んでできるようにはなりました。
再帰下降法だけだけど。

53:デフォルトの名無しさん
02/05/23 03:29
>38
FORTHは?
と言ってみるテスト。


54:MIND
02/05/23 14:09
>>53
処理系を作る人にはやさしいけど、応用系を作る人にはどうかな?
と呟いてしまう今日この頃。

55:デフォルトの名無しさん
02/05/23 14:24
まだyaccがはやいなんていってる馬鹿いるね

56:デフォルトの名無しさん
02/05/23 15:42
>>55
うっさいハゲ

57:デフォルトの名無しさん
02/05/23 16:23
>>55
パーサー担当は君に決定!

58:デフォルトの名無しさん
02/05/23 17:02
LISPで決まり。
ところで、GCの無いLISPって理論的に可能でしょうか。


59:デフォルトの名無しさん
02/05/23 17:06
可能
無限にメモリを消費し続けてください

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!あ〜にゃにゃにゃ〜にゃ〜
02/05/30 01:04
Yaccのソースが見つからないのれす。

65:逝って良しの1
02/05/30 01:15
構文解析器だけは作りたくないです。

66:デフォルトの名無しさん
02/05/30 01:24
>>65
再帰下降なら楽じゃん。

67:デフォルトの名無しさん
02/05/30 03:00
>>64
GNU bison ならすぐ見つかるだろ。

68:デフォルトの名無しさん
02/05/30 04:39
>>64
森氏のkmYaccならVectorで検索すれば有るんじゃない?ソース付きで。
この人のcppとmakeは自分なりに手直しして未だに使わせてもらってる。

69:デフォルトの名無しさん
02/05/30 05:06
どうしても関数の実装ができません。あとcontinueとbreakも。

70:デフォルトの名無しさん
02/05/30 11:08
>69
Cマガの2000年5月号をよめばわかります。

71:64
02/05/30 12:29
>>67
GNUは生理的に嫌なので。すんまへん。

>>68
ウヲ。すごいでつなこの人。ありがとうございます。

72:デフォルトの名無しさん
02/05/31 01:41
>>71
そういうやつは生理的に氏ね!

73:デフォルトの名無しさん
02/05/31 22:45
>>72
GNU のソースが生理的に嫌いだってのは、分からんでもない。あのインデントは
読みたくないよ。(というわけで GNU indent 通して整形してから参照してる俺)

74:デフォルトの名無しさん
02/05/31 23:22
>>73
むしろライセンスの方じゃないの。

75:デフォルトの名無しさん
02/05/31 23:53
>>74
73 の皮肉と諧謔を込めた文意を読み取れ。

76:デフォルトの名無しさん
02/06/01 00:21
75=73

77:デフォルトの名無しさん
02/06/01 04:16
>>68
ちなみにこの人、LSI-Cコンパイラの作者な。
yaccもcppもmakeもその一部。

78:68
02/06/01 13:53
ワシは厨房なんで高度な皮肉も
宗教じみたライセンスも理解できんので
避けてるのです。生理的に。用途違うかな。

>>77
普段LSI-C試食版使ってるので、cppで気づきました。
LSI-Cは一人の天才プログラマが作ったって噂があったけど、
本当だったんですな。あこがれます。

79:真68
02/06/01 16:48
↑どうでもいいけど68書いたの俺な。あんた64じゃない?
>>77
知っている。今はLSI JAPANの取締役らしいな。
bisonのジェネレータが出力するソースは見にくくて吐き気がするが、
kmyaccのは綺麗で分かりやすい。実用にも問題無いし、学習用にもお勧め。
俺はbisonから完全に乗り換えたよ。テーブルの小ささに惚れた。

80:64
02/06/01 19:58
スマソ回線切って首吊ってきます。

81:73
02/06/03 16:39
>>76
はずれ(w

>>78
> 宗教じみたライセンスも理解できんので
GPL は理解しておいて損はないと思うよ。

俺は GPL の趣旨には賛同しないので、自分が公開するソフトのライセンスは
GPL にしない。でも GPL で公開されているソフトには有用なモノも多いし、ライ
センスを理解して使えば GPL に汚染されずに旨い部分だけ頂ける。

(ちなみに個人的には BSD、仕事絡みではクローズドな人です)

82:デフォルトの名無しさん
02/06/03 17:46
>ライセンスを理解して使えば GPL に汚染されずに旨い部分だけ頂ける。
この辺のところを、もう少し詳しく教えて( ゚д゚)ホスィ

83:64
02/06/03 23:01
82に禿尿。readlineとかガリガーリ使っていきたいヨー

84:デフォルトの名無しさん
02/06/04 04:10
LL(1)文法の
Fisrt Follow Directorの計算アルゴリズムが良くわからん。
オーム者コンパイラ(中田育男 8刷 p85)

誰かわかりやすく教えてくれ。

85:.
02/06/04 04:15
URLリンク(www.aa.wakwak.com)

86: 
02/06/05 01:17
>>84
過去ログ。


87:デフォルトの名無しさん
02/06/06 23:29
ageeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee

88:デフォルトの名無しさん
02/06/07 11:22
以前、Cで数十行で書かれた小さいBASICインタプリタを見たことあるん
だけど、検索しても、どうしても見つかりませんでした。
知ってる人いますか?

89:デフォルトの名無しさん
02/06/07 11:28
>>88
7行スレのことか?

90:デフォルトの名無しさん
02/06/07 13:20
>>88
Expert Cに載ってる奴じゃない?
URLリンク(www.ioccc.org)

91:デフォルトの名無しさん
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:デフォルトの名無しさん
02/06/11 02:37
>>92
URLリンク(www.y-adagio.com)

94:デフォルトの名無しさん
02/06/11 02:44
>>92
読んだ時点で判断してるわけないと思うが。
そこは意味解析で判断する部分。
構文解析の段階だと
C();
は「戻型が省略された関数C」とでも解析されるんだろう。
structの定義('}')が終わった段階で、
初めて意味解析が走ると考えたほうが自然。


95:デフォルトの名無しさん
02/06/11 03:48
>>94
struct の } 終わってから解析って、そりゃ構文解析でほとんど何もやってない
に等しい気が……。struct C の段階で「C」を型名としてシンボルテーブルに登
録しておいて

 C (f)();
 → 識別子 '(' 識別子 ')' '(' 識別子 ')' ';'

ぐらいにバラしてスタックに積んでおき、この段階で意味解析に掛けると思う。
構造体の宣言が終わらなくても ';' 単位でばらせば、十分に解析可能だよね。
少なくとも型名やら名前空間やら、必要な情報は事前に出てるわけだし。

(そうでもない?)

96:デフォルトの名無しさん
02/06/11 05:05
'C'まで読み込んだ段階では判定できないから
適当な中間の非終端記号を入れて判定を遅延させて、
十分読み込んだところで判定を確定する、という話じゃないの?

97:96
02/06/11 05:07
>95 と内容被ってた(鬱)

98:92
02/06/12 00:57
とりあえず全部identifierとして読んでおけばいいんですね。
Cの場合、構文解析の段階でtypedefとenumを辞書引きすればよさそう(試してない)
だったので、C++もその延長でいけるかとおもっていたのです。
LALR(2)でならそれでもいけるかな?

99:デフォルトの名無しさん
02/06/12 14:01
>>98
C は型名と変数名は異なる名前空間で定義されるから(型名と重複する変数名
を定義可能)、その方針でやる場合には

 型名を読み込んだ
 → 字句解析側に、次にアルファベット列が来たら identifier を返すように設定

と、構文解析・字句解析での情報のやりとりが必要になるかと。

100:92
02/06/12 23:04
>>99
typedef名だけは型名と変数名の両方に登録されるようなので、
typedef t int;
int t();
なんてのはエラーにしないといけない(?)のでどっちにしても
意味解析でも構文解析じみたことはしなければいけないみたいですね。

101:100
02/06/12 23:05
typedef t int ×
typedef int t ○

102:デフォルトの名無しさん
02/06/16 01:17
最適化するのにポインタって邪魔ですか?

103:デフォルトの名無しさん
02/06/16 01:21
邪魔。

104:デフォルトの名無しさん
02/06/16 01:32
っですよねー。
三項になりましたサンクコ

105:デフォルトの名無しさん
02/06/16 01:40
オブジェクトやメモリを参照することを禁止したポインタなら邪魔にならない。

106:デフォルトの名無しさん
02/06/18 03:52
1+a+2 を逆ポーランドで表現した
1a+2+ というデータだけがここに有るとして、これを
3a+ にうまく変形出来ないだろうか。

107:デフォルトの名無しさん
02/06/18 04:00
>>106
出来る。

108:デフォルトの名無しさん
02/06/19 00:19
>>106
URLリンク(buri.sfc.keio.ac.jp)
の図で言うと * と / が演算子の結合度が同じかつ親子なので、
a を a / d で置き換えてよい。

今考えたんで合ってるかどうか分からんけど。

109:age
02/06/20 01:05
age

110:デフォルトの名無しさん
02/06/21 02:17
保守汁

111:デフォルトの名無しさん
02/06/24 11:39
昨日LAOXのBOOK館でドラゴンブックの邦訳を買ったDQNを目撃した人はいませんか?
それが私です。

ついでにもう一冊、と、
原田賢一『コンパイラ構成法』共立出版、374頁、1999
を買っちゃいました。こちらはDQNの私でもわかりやすく例を挙げて、
C言語ライクの言語を構築する方法を説明してありました。

112:デフォルトの名無しさん
02/06/25 01:16
DQN がドラゴンブック買うかよチクショー。

113:コンパイラ構成法
02/06/25 03:49
おもわず検索してソースだけget。

114:棄教者 ◆witdLTi2
02/06/25 07:47
>>113
あ。ほんとだ。
正誤表とソースがげtできる!
カムサハムニダ。

115:デフォルトの名無しさん
02/06/30 20:21
保守

116:デフォルトの名無しさん
02/07/07 23:12
やっと前スレが埋まったね。

117:質問
02/07/07 23:43
どうしてこのスレはもりあがらないんですか?

118:デフォルトの名無しさん
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:デフォルトの名無しさん
02/07/08 08:35
>>121
いや〜、でも憶えないとコンフリクトの理由が分からなくて困ることとかない?
でも、なにも知らないところからだったら yacc 憶えた後の方が理解が早いので
手順として先に yacc は賛成。


125:デフォルトの名無しさん
02/07/08 10:10
>>121
コンパイラ・コンパイラの段階から自作できるようになって、初めて一人前。

126:デフォルトの名無しさん
02/07/08 10:39
コンパイラ・コンパイラ・コンパイラはどうやって作るんですか?

127: 
02/07/08 11:02
>>126
コンパイラ・コンパイラと一緒。

* (コンパイラ・コンパイラ)・コンパイラ
* (YACC のコンパイラ)・コンパイラ
* (C のコンパイラ)・コンパイラ


128:デフォルトの名無しさん
02/07/08 14:19
>>126
作る必要はありません。

129:デフォルトの名無しさん
02/07/08 16:40
>>126
コンパイラ・コンパイラ・コンパイラの段階から自作できるようになって、初めて神。

130:デフォルトの名無しさん
02/07/09 03:40
[コンパイラ]n ・ コンパイラの段階から自作できるようになって、初めて神。

131:ふわふわ名無しさん
02/07/09 04:16
結局のところ、コンパイラ・コンパイラさえ作れれば神。
証明↓

132:デフォルトの名無しさん
02/07/11 03:28
⊂(ΦωΦ)⊃フフフ・・・・

133:棄教者 ◆witdLTi2
02/07/11 16:15
>>131
テユーカ、一番すごいのはダイレクトにマシンコードを吐き出すコンパイラをハックする人だと思う。

134:デフォルトの名無しさん
02/07/11 18:45
再帰下降ってみんなもう使ってないの?

135:デフォルトの名無しさん
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:
02/07/22 00:38
>>137
「定義したい」とはどういう意味だ?

139:デフォルトの名無しさん
02/07/22 00:38
ブロック終端でのjumpの前の時点でex3を評価すればいいじゃん


140:デフォルトの名無しさん
02/07/22 00:55
>>139
つまりsを読んだ後、ex2の前にjumpする前にex3を評価するってことですよね?
でも前から解析していく際にex3はどのようにしておけばよいのでしょう。
プログラム書くときにex3のところをどうやって書けばいいのかが・・・考えてるんですけど
分からないんです・・・

141:デフォルトの名無しさん
02/07/22 00:59
>>140
ハァ?
それじゃfor()はどうやって実現してるんだよ?

142:
02/07/22 01:12
>>140
もしかして、構文木とか作らずに、字面のまま実行してたりする?

143:デフォルトの名無しさん
02/07/22 01:16
>>142
恥ずかしながらそうです。。。


144:デフォルトの名無しさん
02/07/22 01:18
それじゃ、構造化言語を作るのは無理だろ。

145:デフォルトの名無しさん
02/07/22 01:23
>>144
そうですか。。。
出直してきます。レスくれた方ありがとうございました。

146:よ
02/07/22 01:31
continueに対応できない罠

とかいう問題じゃなかったか…

147:デフォルトの名無しさん
02/07/22 02:24
URLリンク(www.combo.org) これなんかもおもしろそう.


148:デフォルトの名無しさん
02/07/22 03:53
別に構文木を作らなくても、構造化言語のコンパイラは作れる。
というか、作ったことがある。
出力コードの最適化は難いし、jumpの塊になるけど、breakや
continueもちゃんと対応できた。

149:デフォルトの名無しさん
02/07/22 11:00
>>148
> 別に構文木を作らなくても、構造化言語のコンパイラは作れる。
不可能じゃないだろうが、for ループがネストすることを考えると、ジャンプ用の
ラベルの振り方とか面倒そうだ。(それって、結局、構文木を作ってるのと手間
変わらんのでは?)

150:デフォルトの名無しさん
02/07/29 04:09
字句解析をする際に予約語と予約語でない名前とを区別するにはどうするべきなんでしょうか?
つづりを切り出し照合せよなどと本には書いてあったのですが、意味がよく分かりません。
ハッシュ法を使って何とかするのでしょうか?

151:デフォルトの名無しさん
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:デフォルトの名無しさん
02/07/29 10:36
gperfつかっとけ

154:デフォルトの名無しさん
02/07/29 12:13
2本木ってなに?

155:ろうひ男爵
02/07/29 12:22
すまん、2分木の事。
あと、90秒かかったのが5秒になったの間違えです。

156:デフォルトの名無しさん
02/07/30 01:44
2本木なんて初めて聞いたよ

157:ろうひ男爵
02/07/30 04:41
>>156
すまんのう

158:デフォルトの名無しさん
02/07/30 04:48
>>157
ろうひ男爵、いいかんじのひとだね。

159:デフォルトの名無しさん
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:デフォルトの名無しさん
02/07/30 23:56
>>159
まだコードやアルゴリズムを考える段階にないと思われ。

URLリンク(cspt1.ict.ru.ac.za)

ここにコンパイラ作りの基礎を書いた本一冊文のドキュメントがある。
LL文法の範囲内しか扱ってないけれど最初に手を着けるにはこれぐらいでいい。

161:棄教者 ◆witdLTi2
02/07/31 08:42
>>159
Yaccを使いこなせるようになった方が手っ取り早いです。
yacc/lex プログラムジェネレータ on UNIX
五月女健治著
テクノプレス
ISBN4-924998-14-1

162:デフォルトの名無しさん
02/07/31 13:58
>>159
自前で作らなきゃいやなの?

163:159
02/07/31 14:39
>>160
もっと基礎や概念みにつけるべきということですね。
英語はかなり苦手ですが、いい機会なので昼休み等に読んでいこうと思います。

>>161
昨日Yacc/Lex関係の本を探してみたのですが、
Flaxの本しかありませんでした(買いませんでした)
教えていただいた本を探してみようと思います。
(そういえばネットで買えるとこがありましたよね)

>>162
仕事には全く関係ないというか、完全に興味本位です。
あとオブジェクト指向を勉強してたとき感じたのですが、
自分の知らない技術理解すると、今までやってきたことを
違った視点で見れたりするじゃないですか。
そういうのも狙ってます。
(再起下降構文解析とかみててビビビときましたね)

164:デフォルトの名無しさん
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:デフォルトの名無しさん
02/07/31 20:03
>>165
実際にLR表作ってみたら?

167:デフォルトの名無しさん
02/07/31 20:07
>>166
できてるっぽいんですが、goto表をここに貼ってみればいいですか?

168:デフォルトの名無しさん
02/07/31 21:22
貼っていい?

169:デフォルトの名無しさん
02/08/02 00:48
イっていい?

170:高速化
02/08/07 02:49
インテルのコンパイラでコンパイルするだけで高速化しました。
無料体験版があります。
URLリンク(www.xlsoft.com)

171:デフォルトの名無しさん
02/08/07 03:02
ハッシュはどこら辺を参考にすればいいんでしょうかねぇ。

172:デフォルトの名無しさん
02/08/15 00:22
『コンパイラ構成法』を読みながらlex/yaccを勉強しているのですが、
URLリンク(216.239.51.100)
でダウンロード出来るであろうソースコードが相手先サーバーが動いていないか何かで、ダウンロード出来ません。

正誤表はグーグルキャッシュでゲットできたのですが。

ソースコードお持ちの方、どこかのアップローダに上げていただけませんか?


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
02/08/27 17:42
Macは知らないけど、Windowsならyaccあるよ
URLリンク(hp.vector.co.jp)

179:デフォルトの名無しさん
02/08/27 17:49
JavaCCで、構文と構文の隙間を埋めるような
柔軟な構文を定義する方法を教えてください。
Perlでいうところの (.*?) みたいなものが欲しいんです。お願いします。

180:デフォルトの名無しさん
02/08/27 18:07
URLリンク(www.tokumaru.org)

ここのコンパイラソースコードは参考にはならない?

181:ろうひ男爵
02/08/27 18:37
>>177
でしたら、
コンパイラ構成法 原田 賢一 共立出版株式会社 ISBN: 4320029224 6,500円
が一番分かりやすいのですが、yaccとlexが必要です。

コンパイラの仕組み 情報科学こんせぷつ〈8〉 朝倉書店 ; ISBN: 4254127081
も物量的に少ないので読みやすいですが、消化不良のところが出てきます。
しかし、1日から一週間で読めると思います。

あと、インタープリタとコンパイラの違いは大きくないので、
ここのスレッドに色々質問すると良いかもしれません。

どちらにしろ、コンパイラ関連の本は難解な物が多く、
いろいろなアルゴリズムを理解していることが前提となったりするので、
軽くアルゴリズムの本を読んでおいた方がためになりますよ。

アルゴリズムを1冊ですますには、以下の本が良いと思います。
定本Cプログラマのためのアルゴリズムとデータ構造 近藤嘉雪 技術評論社

簡単なアルゴリズムの本は
C言語アルゴリズム+徹底入門 柏原正三 技術評論社
が読みやすいです。

182:デフォルトの名無しさん
02/08/27 18:40
金出す前にこれでも読んどけ。

URLリンク(www.hayalab.cs.ritsumei.ac.jp)

183:Aoki
02/08/27 19:12
実行速度が速いSmalltalkを実装するための技法をいろいろ教えて下さい。

184:デフォルトの名無しさん
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:デフォルトの名無しさん
02/08/27 20:46
<ALL:~[]*>
すみませんこっちでした。

188:184
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:デフォルトの名無しさん
02/08/28 09:24
最近のflexはスレッドセーフなCコードを吐くようになったのか。
%option reentrant


192:デフォルトの名無しさん
02/08/28 10:06
>>182のリンクはいいリンクだ

193:デフォルトの名無しさん
02/08/28 10:13
>>190
パスカルはLL(1)じゃないの?

194:デフォルトの名無しさん
02/08/28 10:58
PascalはLL(1)でもパースできるように設計されているだけであって、
コンパイラがどうしているかは別。

195:棄教者 ◆witdLTi2
02/08/28 13:04
>>182のリンク先にあるコンパイラのソースコードの解説、
これってWEBを使って吐き出されたのかなぁ。

スレとは関係ないのでsage
そういえば TeX とか WEB とか Knuth なスレってあったっけ?

196:デフォルトの名無しさん
02/08/28 13:41
Texスレはなぜかビジネスソフト板で見たような気がする。
Knuthスレはないんじゃないかな?

>>182のリンク先にある
URLリンク(www.hayalab.cs.ritsumei.ac.jp)
の元のコードってどこにあるの?ないぞ

197:デフォルトの名無しさん
02/08/28 16:32
knuthが作ったWEB言語って何?気になるんだけど

198:デフォルトの名無しさん
02/08/28 22:53
>>197
Knuthが提唱した文芸的プログラミングの実装、かな?
ドキュメントの中にソースコードを埋め込む形を取ることで、ソースとドキュメントの
間の不整合や、ドキュメント無きコーディングを避けるっていうものらしい。
コンパイルのためにはドキュメントの中からソースを抜き出してコンパイラに渡す
プログラムが必要になる。
で、Knuth自身が作った、TeXドキュメントからPascalプログラムを抜き出してコンパイルする
システムがWEBシステムの筈。

詳しくは
URLリンク(www.google.com)
でも見れ。

199:デフォルトの名無しさん
02/08/28 22:54
>>195
TeX総合スレ@数学板
スレリンク(math板)

200:棄教者 ◆witdLTi2
02/09/02 13:04
>>111
原田本を今読んでいるところですが、気になった箇所があるので皆さんにお伺いします。
p.164下から11行目
> $p_m$ にアドレス $m+n$ の領域を割り付ける.
とあるのは
> $v_m$ にアドレス $m+n$ の領域を割り付ける.
ではないでしょうか。
ちなみに正誤表
URLリンク(www.hara.cs.keio.ac.jp)
で確認したところ、掲載されていませんでした。
いきなり原田先生にメールして自分が間違っていたら恥ずかしいので、
2CHのハッカーの皆さんに確認してからメールをしようと思います。

201:棄教者 ◆witdLTi2
02/09/02 13:04
テユーカ200get

202:棄教者 ◆witdLTi2
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:デフォルトの名無しさん
02/09/02 16:33
ドイツ語綴り->Nauer
英語綴り->Naur
だったと思う。

204:棄教者 ◆witdLTi2
02/09/02 17:15
グーグルすると
backus naur form で日本語限定だと213件, 言語非限定だと約20700件ヒット。
backus nauer form で日本語限定だと9件, 言語非限定だと253件ヒット。
おまけに「スペリング修正候補 backus <b>naur</b> form」として修正を勧告される。

205:棄教者 ◆witdLTi2
02/09/02 17:16
×backus naur form で日本語限定だと213件
○backus naur form で日本語限定だと215件

206:デフォルトの名無しさん
02/09/03 21:12
インタープリタの仮想機械に興味を持ち、調べています。

調べてみた JVM、CRI、Python はいずれもスタックマシンのようでしたが、レ
ジスタマシンと比較して何かメリットがあるのでしょうか。

207:デフォルトの名無しさん
02/09/03 22:29
Forthハッカーの伝統。
というのは半分冗談だけど、中間コードが簡単/短くできるからじゃないんですか。
コンパイラも作りやすいし。

208:デフォルトの名無しさん
02/09/04 00:53
詳しくは知らんけど、インタープリタの仮想機械では、
レジスタのアクセスがメモリをアクセスするのと同じ。
パイプラインとかハードウェアで実装する場合の利点が
いかせられないからだと思う。

209:
02/09/04 02:05
>>206
仮想マシンで最もコストが高いのが、コードのフェッチとデコード。
スタックマシンなら、コードも短いしオペランドも要らない。

210:デフォルトの名無しさん
02/09/04 11:34
>>207-209
ありがとうございました。

まとめると、ネイティブコードまでコンパイルするのでなければ、レジスタマ
シンでも結局はメモリへのアクセスを行うことになるので、スタックマシンに
対する利点はなく、むしろコードが短くなる分だけスタックマシンの方が速度
的に有利、というところですかね。

211:ろうひ男爵
02/09/04 12:20
>>210
たしかに、
ネイティブコードへ最適化する場合、レジスタマシンの方が有利ですよね。
広域レジスタとローカルレジスタを割り当てたりした方が最適化しやすいですからね。

一方、インタプリタの場合、おっしゃるとおり
レジスタマシンと言っても結局メモリアクセスされるので、
スタックマシンに対するメリットはないですね。
それだったら、簡単に設計でき、
なおかつコードが短くなるスタックマシンの方が有利でしょう。

自分的には出力されたコードがレジスタマシンの方が読みやすいので、
レジスタマシンを使ってます。(インタプリタですが)


212:デフォルトの名無しさん
02/09/04 14:39
つーかJITコンパイル等でチューニングを詰めていくと
結局どっちも速度的に大差ないという話。


213:デフォルトの名無しさん
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:デフォルトの名無しさん
02/09/06 02:16
>>216
詳しくはないけど、良書どうこういうより、
JITについて書かれている本を探すの自体が大変だと思う。
一応、参考URLを貼り付けておく。
shuJIT
URLリンク(www.shudo.net)

218:デフォルトの名無しさん
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型を渡してるんです。
型が合わないからエラーがでると思うのですが、なにか僕が大きな間違いをしてるんでしょうか


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4932日前に更新/200 KB
担当:undef