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

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/
こういうドキュメントが欲しいとか
掲示板に投げておけばそのうち対処するかも。

251 名前:デフォルトの名無しさん mailto:sage [02/11/07 02:55]
>>248
rubyじゃできないな。

252 名前:デフォルトの名無しさん [02/11/07 03:22]
手抜き実装で考え方だけ。言語も適当。

loop
  token w = Tokenizer.next();

  if w == 'object' then
    currNode := currNode.pushNewNode( Tokenizer.next());
    continue;
  end if

  if w == 'end' then
    currNode := currNode.parent();
    if currNode is null then break;
    continue;
  end if

  Tokenizer.skip();
  currNode.pushNamedValue( w, Tokenizer.next());
end loop

Node というクラスはツリーのノードを表す。
各ノードは子ノードとして、object か namedValue を持つことができる。
pushNewNode は object 子ノードとして追加して、その新規子ノードを返す。
引数はノードの名前を表す。
pushNamedValue は namedValue 子ノードとして追加する。戻り値はなし。
第一引数は値の名前、第二引数は値の中身。

253 名前:デフォルトの名無しさん [02/11/07 04:33]
今ちょっと色々調べてたんですけど、色々とヒント有り難うございます。
一週間前にはかけらすらないような事趣味でやり始めて分かったんですが構造を持つ
ファイルフォーマットってコンパイラ作成のような視点が必要なんですね。
さすがにインデントでは無理だってすぐ分かりましたが、xmlに近いことは
気づきませんでした。そう言えばxmlと似てますね。

内部データ構造を持つファイルフォーマットのパーサーの解説の一般的なドキュメント
希望>250

254 名前:デフォルトの名無しさん mailto:sage [02/11/07 07:52]
schemeで書くとこんな感じなんだが

(define (hoge-read s)
 (let loop ((x s) (stack '()))
  (if (pair? x)
   (case (car x)
    ((object)
     (loop (cddr x) (cons (list (cadr x) (car x)) stack)))
    ((end)
     (if (null? stack)
      (error "Syntax-error - Corresponding 'object' is required :"
       s))
     (if (pair? (cdr stack))
      (loop (cdr x)
       (cons
        (cons (reverse (car stack)) (cadr stack))
        (cddr stack)))
      (loop (cdr x) (reverse (car stack)))))
    (else
     (loop (cdddr x)
      (cons
       (cons (list (car x) (caddr x)) (car stack))
       (cdr stack)))))
   (if (and (pair? stack) (pair? (car stack)))
    (error "Syntax-error - 'end' is required :" s)
    stack))))



255 名前:デフォルトの名無しさん mailto:sage [02/11/07 07:52]
;テスト
(define hoge-read-test-data '(
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
))

(hoge-read read-tag-test-data)
=>
(object
 hoge
 (caption "hogehoge")
 (val 0)
 (object
  fuga
  (caption "fugafuga")
  (object aaa (caption "aaa"))
  (object bbb (caption "bbb"))
  (object ccc (caption "ccc"))))

256 名前:デフォルトの名無しさん mailto:sage [02/11/07 08:20]
(中身的に変んないけど)Cに変換すると
scmobj_t hoge_read(scmobj_t s) {
 scmobj_t x = s;
 scmobj_t stack = nil;
 tail_recursive_loop:
 if (pairp(x)) {
  if (car(x) == make_symbol("object")) {
   stack = cons(list2(cadr(x),car(x)),stack);
   x = cddr(x);
   goto tail_recursive_loop;
  } else if (car(x) == make_symbol("end")) {
   if (nullp(stack))
    return error("Syntax-error - Corresponding 'object' is required :",s);
   if (pairp(cdr(stack))) {
    x = cdr(x);
    stack = cons(cons(reverse(car(stack)),cadr(stack)),cddr(stack));
    goto tail_recursive_loop;
   } else {
    x = cdr(x);
    stack = reverse(car(stack));
    goto tail_recursive_loop;
   }
  } else {
   stack = cons(cons(list2(car(x),caddr(x)),car(stack)),cdr(stack));
   x = cdddr(x);
   goto tail_recursive_loop;
  }
 } else if (pairp(stack) && pairp(car(stack)))
  return error("Syntax-error - 'end' is required :",s);
 return stack;
}


257 名前:デフォルトの名無しさん mailto:sage [02/11/14 06:59]
>>245
Expression Templateをはじめ各種のテンプレート・メタ・プログラミングは
知ってたけどPaser Generatorにまで行きつくとは。 
 カ コ イ イ ! !
テンプレートらしく解析対象の列の要素型がパラメタ指定できるのもカコイイ!
(char, w_charに始まってユーザー作成のクラスまで)
字句解析器も含んでるしね。

当方Java(正確にはバイトコード)のPartial Evaluationを実装中なのだが、
Javaに演算子多重定義が導入されていれば、
合わせ技で同じようなことが狙えたのになァ。惜しい。
(メソッド呼び出し式で書けば良いわけだが、カッコ良さが大いに減る。)

258 名前:デフォルトの名無しさん [02/11/17 16:17]
>>257
でも、あんまり真剣な用途には使えないよね。

実行時にパーザ生成するんだったら、文字列で文法与えても良いな。

259 名前:祐一ゴン [02/11/17 19:39]
やぁ、ぼく押金さん(*´∀`*)ノ
中学の時からポカリの粉を麻薬と思って鼻から吸ってたけどヽ(`Д´)ノ ウワァァン!!全然トリップできないや!最近初めてその事実を知ったよ
今部屋をテラフォーミングしたら鼠の干からびた死体が出てきたよ、あまり旨くなかったよ


260 名前:デフォルトの名無しさん [02/11/18 04:16]
パスカルとベーシックってどっちが作りやすいですか?

261 名前::−) mailto:sage [02/11/18 07:12]
pascal→delfy
ベーシック→HSP

HSPはタダの開発環境です。デルフィは10万円くらい?

262 名前:デフォルトの名無しさん [02/11/18 11:55]
たとえば、関数呼び出し
a(b(c(d())));
ってのをなんらかの中間コードにしてあって、
これを1パスでコード生成できるの?
(最適化はどうでもいい)

a();
のコード生成はできるけど、
a(b());
のようにネストするとできなくなって困ってます。

263 名前:デフォルトの名無しさん mailto:sage [02/11/18 12:01]
>>262
ちょっとは考えろ
つーか、お前の言う中間コードって何のためにあるのさ

264 名前:デフォルトの名無しさん mailto:sage [02/11/18 13:15]
>>262
> ってのをなんらかの中間コードにしてあって、
> これを1パスでコード生成できるの?

「これ」というのが「中間コード」を指しているのなら、
どのような「中間コード」なのか示してもらわないと。

) を検出したタイミングでコード生成すりゃいいだけの
話なんだけど。



265 名前:デフォルトの名無しさん [02/11/18 17:40]
バイトコードバイトコード!

266 名前:デフォルトの名無しさん [02/11/19 00:50]
>>261
デルファイじゃないのか?Delphi
嘘教えるなよ

267 名前:デフォルトの名無しさん mailto:sage [02/11/19 01:10]
>>261はどうみても無知だろ

268 名前:デフォルトの名無しさん [02/11/19 03:22]
>>260はコンパイラ作るならbasicかpascalどっちを作ったほうがいいかって
いってるんだろ。どっちだろう、俺はベーシック知らないからなんとも
いえん。

269 名前:デフォルトの名無しさん mailto:sage [02/11/19 03:26]
コンパイラならPascalだろうが、
インタプリタならBasicの方が楽だろう。
昔のBasicインタプリタは4KBくらいだった。

270 名前:デフォルトの名無しさん [02/11/19 03:59]
ベーシックインタプリタのコードってないの?

271 名前:デフォルトの名無しさん mailto:sage [02/11/19 05:11]
>>271
ほれ
ttp://homepage2.nifty.com/rohizuka/ka/pa_003_a.htm

272 名前:デフォルトの名無しさん mailto:sage [02/11/19 11:09]
>>260-270
…この21世紀になんでその2択に拘るんだw。

273 名前:257 mailto:sage [02/11/19 11:13]
>>258
使えないかねぇ…。この辺の技術には期待したいトコロなんだけどなぁ。
私も使ってみたわけではないので大丈夫と言い切れるもんではないんだが。

実行時というか、コンパイル時にテンプレートの展開動作を利用して
パーザが作られるようなんだが。

274 名前:デフォルトの名無しさん mailto:sage [02/11/21 13:10]
>>270
ギコBASICは参考にならないですか?



275 名前:デフォルトの名無しさん mailto:sage [02/11/21 14:05]
この辺は?
member.nifty.ne.jp/nakamula/recurs.htm

276 名前:デフォルトの名無しさん [02/12/03 17:38]
bisonが吐き出したコードってなんでVC++でコンパイル通らないんだ?
激しく鬱…

bison++/flex++に乗り換えるかのぉ。ドキュメント少なすぎだが・・・






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

前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