[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 06/07 23:41 / Filesize : 200 KB / Number-of Response : 866
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

『コンパイラ・スクリプトエンジン』 相談室 2



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

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文法の範囲内しか扱ってないけれど最初に手を着けるにはこれぐらいでいい。



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
でダウンロード出来るであろうソースコードが相手先サーバーが動いていないか何かで、ダウンロード出来ません。

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

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







[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<200KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef