[表示 : 全て 最新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

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
正攻法は単に数値のリストとして、リストに含まれる文字コードチェックに
利用を限ってしまうのがいいんじゃないかな?
考えてみるのは面白そうだけど、
仕事となると、むきになってやっても費用対効果がなさそうだし・・・


241 名前:デフォルトの名無しさん mailto:sage [02/09/27 22:01]
ギコBasic新しく作り直してみた

page.freett.com/gikob/gikob0002.zip

242 名前:241 mailto:sage [02/10/01 09:30]
まだギコBasicのスレが残ってるのに気づかなかった・・・スマソ

243 名前:デフォルトの名無しさん [02/10/17 18:25]
ANTLRの使い方を日本語で解説してあるウェブページありませんか?

244 名前:デフォルトの名無しさん [02/10/19 07:54]
ガイツュシ

245 名前:デフォルトの名無しさん [02/10/19 21:12]
STLスレから出張。
これ spirit.sourceforge.net/ どうなん?



246 名前:デフォルトの名無しさん [02/10/19 23:06]
>>245
すげー。びびった。久々に驚嘆したハックだ。

247 名前:デフォルトの名無しさん [02/11/05 22:08]
ふふ

248 名前:デフォルトの名無しさん [02/11/07 02:31]
以下のような構文を作ります。データを定義しているフォーマットです。xmlとかcvsみたいな物です。
ここから木の様に情報を取り出したいと思ったのですが、上手くパーサを作れません。
tokenizerは簡単に出来るのですが、どうすれば良いですか。rubyでやってます。

object hoge
 caption='hogehoge'
 val=0
 object fuga
  caption='fugafuga'
  object aaa
   caption='aaa'
  end
  object bbb
   caption='bbb'
  end
  object ccc
   caption='ccc'
  end
 end
end



249 名前:ねこま mailto:sage [02/11/07 02:39]
インデントレベルだけで解釈できれば簡単そう


250 名前:デフォルトの名無しさん [02/11/07 02:46]
トラバースと逆の手順。
各ノードは子供と親のリンクを持つ。

<でノードを生成、現在処理中のノードへの参照を
親への参照として新規ノードへ設定。
その後で親に子として新規ノードへの参照を設定。
処理中のノードの参照として新規ノードを指させる。

>でシングルタグか開始タグか終了タグかを判断し
親に戻るかどうかを決める。
戻る時には処理中のノードの参照として
親を指させる。

こっちにドキュメントを置いてます。
サンプルソースはC++。
ソース玉は整理してないんで乱雑にメモテキストとか
テストデータが散らかっててちょっと気が引ける。
https://sourceforge.jp/projects/frogger/
こういうドキュメントが欲しいとか
掲示板に投げておけばそのうち対処するかも。






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

前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