1 名前:デフォルトの名無しさん mailto:sage [2005/05/06(金) 08:28:29 ] プログラミング言語処理系の開発に興味のある人達のスレッドです。 字句解析・構文解析から,データフロー解析,ループ並列化,タスク並列化,SSA変換, CPS変換,レジスタ割付,命令スケジューリング,ソフトウェアパイプライン等各種最適化, それにVM,GC,JIT,リンク時最適化,動的バイナリ変換などなど。 意味論に関する話題も歓迎です。 前スレ 1 pc.2ch.net/tech/kako/981/981672957.html 2 pc2.2ch.net/test/read.cgi/tech/1021136715/ 3 pc5.2ch.net/test/read.cgi/tech/1070089173/ 4 pc5.2ch.net/test/read.cgi/tech/1100097050/ 5 pc8.2ch.net/test/read.cgi/tech/1106129164/ (前スレ) 関連リンクは多分 >>2-10 あたり
294 名前:デフォルトの名無しさん mailto:sage [2005/05/24(火) 20:43:05 ] >>293 つかスタックマシンのコードをx86へ分解してるだけだと思うよ。 コードジェネレータで頭ひねらずに済むから処理系を作ってる途中では有用だろうし。
295 名前:デフォルトの名無しさん mailto:sage [2005/05/24(火) 21:49:05 ] >>290 とりあえず mov eax, i は lea eax, i だとして、 それぞれのコードを1億回ループするのを適当に計ると へぼ: 1613771636 VC++: 1119915436 クロック掛かる。1.6GHz に換算すると へぼ: 1.0秒 VC++: 0.7秒 程度の違いだな。
296 名前:デフォルトの名無しさん mailto:sage [2005/05/24(火) 21:50:51 ] >>295 失礼。 mov eax, i でよかった。
297 名前:デフォルトの名無しさん mailto:sage [2005/05/24(火) 22:08:35 ] >>295 クロック数って そんなに正確に測れるんですか? シミュレーション? CPU のマニュアルから計算したやつ?
298 名前:デフォルトの名無しさん mailto:sage [2005/05/24(火) 22:17:21 ] sieveではスカラ最適化はほとんど利かないと思う。 しかし1億で30秒は遅い気もするが…>290でループ変数が レジスタに載ってないあたりを見ると、元ソースの問題かな。
299 名前:デフォルトの名無しさん mailto:sage [2005/05/24(火) 22:29:07 ] >>297 発想が逆だ
300 名前:デフォルトの名無しさん [2005/05/24(火) 22:29:21 ] ヘボ言語のソースがみたい。 (ふるいのソース、処理系そのもののソースじゃなくて)
301 名前:デフォルトの名無しさん mailto:sage [2005/05/24(火) 22:48:54 ] >>300 array sieve[1000000] i = 0 init: sieve[i] = 1 i = i + 1 if i <= 1000000 then jump init i = 2 loop1: if sieve[i] = 0 then jump skip j = i + i loop2: sieve[j] = 0 j = j + i if j <= 1000000 then jump loop2 skip: i = i + 1 if i <= 1000 then jump loop1 i = 2 fin: primes = primes + sieve[i] i = i + 1 if i <= 1000000 then jump fin 1000*1000; "未満の素数が"; primes; "個あります\n"
302 名前:デフォルトの名無しさん mailto:sage [2005/05/24(火) 22:50:36 ] うわインデントが array sieve[1000000] i = 0 init: sieve[i] = 1 i = i + 1 if i <= 1000000 then jump init i = 2 loop1: if sieve[i] = 0 then jump skip j = i + i loop2: sieve[j] = 0 j = j + i if j <= 1000000 then jump loop2 skip: i = i + 1 if i <= 1000 then jump loop1 i = 2 fin: primes = primes + sieve[i] i = i + 1 if i <= 1000000 then jump fin 1000*1000; "未満の素数が"; primes; "個あります\n"
303 名前:デフォルトの名無しさん mailto:sage [2005/05/24(火) 22:58:42 ] どうでもいいが、primesが初期化されてないような希ガス。 初出の変数は0?
304 名前:デフォルトの名無しさん mailto:sage [2005/05/24(火) 23:01:49 ] うす labelに使われてない変数は初出時に0
305 名前:デフォルトの名無しさん mailto:sage [2005/05/25(水) 01:00:41 ] あれかね、今時のCPUはx86のコードを内部的にRISCな命令に変換したりするから (efficeonならなおさらだ)、その段階でスタック操作がレジスタに割り当てられて、 内部的には似たようなコードで実行されてたりするのかね。 だとしたらすげー。
306 名前:デフォルトの名無しさん mailto:sage [2005/05/25(水) 01:39:20 ] いま、Athlon XPで試したら 速度全くといっていいほど変わらない 信じられない Pen4ではどうなるのか知りたいなあ
307 名前:デフォルトの名無しさん mailto:sage [2005/05/25(水) 12:07:51 ] factやfibでも同じような速度なの? だとしたらマイクロオペコードすげー。
308 名前:デフォルトの名無しさん mailto:sage [2005/05/25(水) 15:48:09 ] いや、関数呼び出しは実装してないんで ローカル変数実装するのが、(ちょっとだけ)面倒だから まじめに比較したい人がいるなら、ソース出すけど
309 名前:デフォルトの名無しさん mailto:sage [2005/05/25(水) 18:38:40 ] 普通に1から1億までを足すプログラムとかで十分差がでると思うが。
310 名前:デフォルトの名無しさん mailto:sage [2005/05/25(水) 18:40:29 ] 最適化しないと変わらないんじゃない?
311 名前:300 [2005/05/26(木) 00:06:05 ] >>302 ソースTNX! へぼ言語どころか、めっちゃ気に入りそう(ハート) あんた、センスあるねぇ。。。
312 名前:デフォルトの名無しさん mailto:sage [2005/05/26(木) 02:47:24 ] i = 1 r = 1 fact: r = r * i i = i + 1 if i <= 1000000 then jump fact "1000000! = "; r; "\n" 多倍長じゃないとか気にするな。 ただのベンチマークだから。
313 名前:デフォルトの名無しさん mailto:sage [2005/05/26(木) 03:31:29 ] めんどくさいから、誰かやって もう飽きたし・・・ ttp://rerere.sytes.net/up/source/up6309.zip
314 名前:デフォルトの名無しさん mailto:sage [2005/05/26(木) 19:17:26 ] >>305 んなわけない sieveみたいな2重ループ程度じゃ適当に作っても差はあんま出ない >>313 見た限りでは関数作れないっぽいけど 同じやり方でループのネスト深くしたり、fiboとかアッカーマン関数で 比較したりすると倍以上差が出てくるよ VMとかインタプリタに比べれば問題ない差だろうけどね
315 名前:デフォルトの名無しさん [2005/05/26(木) 22:17:47 ] >>314 ヤッターマン関数って何? ぐぐっても出てこんかったorz
316 名前:デフォルトの名無しさん mailto:sage [2005/05/26(木) 22:32:08 ] >>315 アッカーマン関数でもヤッターマン関数でも出てくるけど?
317 名前:デフォルトの名無しさん mailto:sage [2005/05/26(木) 22:54:33 ] ポチっとな
318 名前:デフォルトの名無しさん mailto:sage [2005/05/27(金) 00:20:48 ] Fibonacciの関数呼び出し程度では大した差はでない Ackermannはコンパイラが末尾再帰を認識するかどうかでかなり差が出るはず 普通の処理でも変数の数や間接参照とかが増えてくれば違ってくる
319 名前:デフォルトの名無しさん [2005/05/27(金) 01:08:54 ] Borland C++ Conpilerについての質問です c:\bcc32\Bin の中に bcc32.cfgを作って -I"c:\Bcc32\include" -L"c:\Bcc32\lib" と書きます ILINK32.cfgを作って -I"c:\Bcc32\include" -L"c:\bcc32\lib" と書きます www.kumei.ne.jp/c_lang/bcc/bcc_05.htm ここのソースをコピペしてコンパイルします bcc32 -W menu01.cpp のほうはうまく行きました brc32 menu01.rc menu01.exe って入力しても、windous.hが見つからないとエラーでます brc32 -i c:\bcc32\include menu01.rc menu01.exe とディレクトリを指定してやったらコンパイルできました このようにディレクトリを指定せずにコンパイルさせる設定ってどこでするのでしょうか?
320 名前:デフォルトの名無しさん mailto:sage [2005/05/27(金) 02:13:26 ] 【初心者歓迎】C/C++室 Ver.17【環境依存OK】 pc8.2ch.net/test/read.cgi/tech/1115958601/
321 名前:デフォルトの名無しさん mailto:sage [2005/05/27(金) 02:39:07 ] >Fibonacciの関数呼び出し程度では大した差はでない これどういう意味?
322 名前:デフォルトの名無しさん mailto:sage [2005/05/27(金) 05:46:16 ] fibでも関数値のメモ化のあるなしで大きく違ってきそうだが。
323 名前:remi@id5214.bbs.盗撮倶楽部 mailto:sage [2005/05/27(金) 14:32:00 ] はじめまして れみです。 向こうのbbsで質問したところ、こちらで聞いたほうがより高度な技法を 教えていただけると紹介いただき、まかりこしました。 のぞき穴最適化技法についてお知恵をお借りできませんか。 尚、使用レンズ口径は3.00mmです よろしくお願いします
324 名前:デフォルトの名無しさん mailto:sage [2005/05/27(金) 15:09:36 ] そのレンズを通して見える範囲でソースコードを手でチューニングすればいいです。 見える範囲が終わったら視野を移動するかスクロールします。 ファイルの最後までいったらおしまいです。お疲れ様でした。
325 名前:デフォルトの名無しさん mailto:sage [2005/05/27(金) 18:52:21 ] どういう誤爆だ? 業者にしてはまったく意味が無い。 誰かAIのテストでもしてるのか?
326 名前:デフォルトの名無しさん mailto:sage [2005/05/27(金) 18:54:35 ] スコープについて聞いてるんじゃないか?
327 名前:デフォルトの名無しさん mailto:sage [2005/05/27(金) 18:57:13 ] うまい
328 名前:デフォルトの名無しさん mailto:sage [2005/05/27(金) 19:04:44 ] >>322 すまんが、そういう話じゃない 関数呼び出しのテストにしても変数が1個や2個の値参照程度では 違いは出にくいということ メモ化すれば当然速くなる
329 名前:デフォルトの名無しさん mailto:sage [2005/05/27(金) 20:24:00 ] ackermann関数は変数が何個の値参照なん?
330 名前:デフォルトの名無しさん mailto:sage [2005/05/27(金) 20:50:02 ] mann個
331 名前:デフォルトの名無しさん mailto:sage [2005/05/27(金) 20:52:11 ] >>329 lispの例題とかで見たこと無い? ものすげーえげつない再帰呼び出しのテストだと思ってくれ。
332 名前:デフォルトの名無しさん mailto:sage [2005/05/27(金) 21:35:57 ] >>331 すまんが、そういう話じゃない 関数呼び出しのテストにしても変数が1個や2個の値参照程度では 違いは出にくいということ
333 名前:デフォルトの名無しさん mailto:sage [2005/05/27(金) 21:41:48 ] こんな感じ? extern yattarman(){ printf("アフォ\n"); }
334 名前:デフォルトの名無しさん mailto:sage [2005/05/27(金) 21:50:56 ] ack(m,n) = n+1 if m = 0 ack(m-1, 1) if n = 0 ack(m-1, ack(m,n-1)) otherwise
335 名前:デフォルトの名無しさん mailto:sage [2005/05/27(金) 21:53:10 ] >>334 すまんが、そういう話じゃない 関数呼び出しのテストにしても変数が1個や2個の値参照程度では 違いは出にくいということ
336 名前:デフォルトの名無しさん mailto:sage [2005/05/27(金) 22:06:19 ] ここはお前の話をみんなで静聴するスレじゃないぞ。 各人がしたいように話を転がしていくだけだ。
337 名前:デフォルトの名無しさん mailto:sage [2005/05/27(金) 22:08:15 ] 仕切り厨の自己否定乙ww
338 名前:デフォルトの名無しさん mailto:sage [2005/05/28(土) 00:28:16 ] >>337 すまんが、そういう話じゃない 関数呼び出しのテストにしても変数が1個や2個の値参照程度では 違いは出にくいということ
339 名前:デフォルトの名無しさん [2005/05/28(土) 03:12:13 ] >>333 そう、それだ!
340 名前:デフォルトの名無しさん mailto:sage [2005/05/28(土) 04:15:37 ] >>333 extern coffee(){ printf("ボケ\n"); } extern lighter(){ printf("ゴルァ\n"); }
341 名前:デフォルトの名無しさん [2005/05/28(土) 23:34:48 ] アメ、コーヒー、ライター?
342 名前:デフォルトの名無しさん mailto:sage [2005/05/29(日) 01:10:17 ] ヤッターマン
343 名前:デフォルトの名無しさん mailto:sage [2005/06/04(土) 04:52:17 ] そろそろN88BASIC作ろうと思うんだけど、どう?
344 名前:デフォルトの名無しさん [2005/06/04(土) 12:18:56 ] N05BASICの誤りでは? どんな畑になることやらw
345 名前:デフォルトの名無しさん mailto:sage [2005/06/04(土) 21:04:29 ] >>344 ???
346 名前:デフォルトの名無しさん mailto:sage [2005/06/04(土) 21:16:13 ] >>345 しぃーっ!見ちゃだめ!
347 名前:デフォルトの名無しさん mailto:sage [2005/06/04(土) 22:01:33 ] bison -v で出力される *.output と言うファイルの書式の解説って マニュアルには含まれてないと思うのですが、ありますか?
348 名前:デフォルトの名無しさん mailto:sage [2005/06/04(土) 22:05:10 ] >>347 人が見て理解できれば十分だと思うけど…… *.output ファイル自体をいじるとか、そういうことを考えているの?
349 名前:デフォルトの名無しさん [2005/06/04(土) 22:34:23 ] >>348 state 100 nls -> '\n' . (rule 200) とかあった場合、この点(.)は何を意味するものなの?
350 名前:デフォルトの名無しさん mailto:sage [2005/06/05(日) 00:02:52 ] オライリーの本読め。解説してあったと思うが。 なくてもそれくらい見当つかないんじゃ困るとは思う。
351 名前:デフォルトの名無しさん mailto:sage [2005/06/05(日) 00:12:32 ] lex&yacc でイイデツカ?
352 名前:デフォルトの名無しさん mailto:sage [2005/06/05(日) 00:22:29 ] うん。
353 名前:デフォルトの名無しさん mailto:sage [2005/06/05(日) 03:26:05 ] >>344 それ以前に2000年問題に対応してください
354 名前:デフォルトの名無しさん mailto:sage [2005/06/05(日) 03:35:03 ] >>344 ==353
355 名前:デフォルトの名無しさん mailto:sage [2005/06/05(日) 11:17:47 ] >>349 LALR(1)
356 名前:351 mailto:sage [2005/06/05(日) 18:39:22 ] >>352 ありがとう。 >>355 LALR(1) の標準記法とかあるのですか?
357 名前:デフォルトの名無しさん mailto:sage [2005/06/05(日) 18:47:49 ] >>356 標準かどうかしらんが LALR(1)を勉強した人なら一瞬で分かる。
358 名前:デフォルトの名無しさん [2005/06/05(日) 19:46:23 ] >>353 畑は1年単位のサイクルの筈。
359 名前:デフォルトの名無しさん mailto:sage [2005/06/05(日) 23:06:16 ] >>344 ==353==358
360 名前:デフォルトの名無しさん [2005/06/06(月) 08:56:20 ] 並列化コンパイラを作ることになったんですが、 なにをどうすればいいかわかりません 良い本、サイトなどあれば教えてください
361 名前:デフォルトの名無しさん mailto:sage [2005/06/06(月) 09:14:01 ] TAに泣きつけ。
362 名前:デフォルトの名無しさん mailto:sage [2005/06/06(月) 10:51:43 ] 並列化のための補助文法を言語的に持っているという意味? それとも複数の演算素子にコードを割り振る方?
363 名前:360 [2005/06/06(月) 17:05:12 ] そもそもコンパイラそのものがわかっていないので 1から勉強できるようなものがあると助かるとです
364 名前:デフォルトの名無しさん mailto:sage [2005/06/06(月) 18:37:44 ] 360は早稲田の学生
365 名前:デフォルトの名無しさん [2005/06/06(月) 19:54:03 ] >>363 まずは、りんご畑系の本を勧める。
366 名前:360 [2005/06/07(火) 02:28:10 ] >>364 駅弁です >>365 リンゴ畑とは?
367 名前:デフォルトの名無しさん mailto:sage [2005/06/07(火) 23:42:17 ] 予約語と識別子との区別を、字句解析時に行ってしまうのがいいのか、構文解析時になってから行うのがいいのか悩んでいます。 字句解析時に行ったほうがわかりやすいような気もするけど、構文解析時に行ったほうが柔軟になるし(予約語と同じ名前のメソッド名を定義できるとか)。 みなさんはどうしてますか。
368 名前:デフォルトの名無しさん mailto:sage [2005/06/07(火) 23:52:07 ] 作ろうとしている言語の文法を合うように 決めればいいんじゃない? つまんない意見でごめんな
369 名前:デフォルトの名無しさん mailto:sage [2005/06/07(火) 23:59:39 ] ほぼ同意。 ps.りんご畑だとパーサだったかな?
370 名前:デフォルトの名無しさん mailto:sage [2005/06/08(水) 00:12:20 ] typo ×文法を合うように ○文法に合うように
371 名前:デフォルトの名無しさん mailto:sage [2005/06/08(水) 01:10:48 ] >>367 >予約語と同じ名前のメソッド名を定義できるとか そもそもこんなことができると紛らわしいからよした方が… ワインバーグが「プログラミングの心理学」のどっかにそんなことを書いていたはず。
372 名前:デフォルトの名無しさん [2005/06/08(水) 01:17:01 ] >>371 古い概念にとらわれるな
373 名前:デフォルトの名無しさん mailto:sage [2005/06/08(水) 10:02:30 ] >>372 歴史に学べ
374 名前:デフォルトの名無しさん mailto:sage [2005/06/08(水) 10:04:01 ] >>367 ifという名前のローカル変数を作ってしまってif文が使えない とかいうことになるので、字句解析でやっといた方がいいんじゃないかな。
375 名前:デフォルトの名無しさん mailto:sage [2005/06/08(水) 10:41:04 ] 素人な質問だけど、構文解析どう書くの? IDENT expr IDENT block IDENT block で$1と$3と$5がそれぞれ"if" "then" "else"であることを アクションでチェック?現実に実現可能なもの?
376 名前:デフォルトの名無しさん mailto:sage [2005/06/08(水) 12:25:52 ] 構文木を識別子以外のものに基づいて組み立てれば無問題。括弧とか。
377 名前:デフォルトの名無しさん mailto:sage [2005/06/08(水) 12:26:47 ] >>360 育男ちゃんに代打ちしてもらえばいいじゃん
378 名前:デフォルトの名無しさん mailto:sage [2005/06/08(水) 13:08:32 ] 文法の、どこに error を噛ませれば良いのか分からんですたい
379 名前:デフォルトの名無しさん mailto:sage [2005/06/08(水) 13:39:49 ] エラーが発生したらなかったことにしたい単位のところ。 全てが式の言語なら式。Cみたいのなら文か関数。 例外処理のcatchのようなもんだ。
380 名前:デフォルトの名無しさん [2005/06/08(水) 20:52:34 ] それよりも的確な場所でエラーを検出することができるかどうかだよ 極端な言語で言えば、LISP系はソースコードの何行目でエラーが出た、 とかの検出が困難。 S式として妥当ならreadが通ってしまう。 readに通した時点で行の情報は失われる。 よく知らないけどLISPのエラー検出の最小単位って関数かな? エラー検出とかのためにリストがどの行のものか保存するLISP処理系ってある?
381 名前:デフォルトの名無しさん mailto:sage [2005/06/08(水) 20:56:29 ] VCのコンパイラって/Pオプションでプリプロセッサを通した結果がとりだせるじゃないですか bccではそのようなコンパイルオプションってないですか?
382 名前:367 mailto:sage [2005/06/08(水) 21:04:00 ] ご回答いただいた皆様、どうもありがとうございます。 そもそもの動機は、事前にすべての予約語を予測することができない(あとで必ず新しい予約語を追加したくなる)ので、 せめて識別子がくることが明確にわかっている場所でなら、予約語でも識別子として使えるようにしておけば、 新しい予約語を追加したときに、多少なりとも影響を小さくできるかなと思ったからです。 また個人的には「switch」や「end」をメソッド名として使えたらなーと思うことがあったので、メソッド名であることが明らかなら 予約語でもメソッド名にできるようにしたかったのです。(Rubyだとそれができるみたい) しかーし、発想をかえまして、予約語になんらかのプレフィックスをつけることにしました。 PHPやPerlでは、変数名と予約語がかぶらないように変数名のほうにプレフィックスをつけますが、 それとは逆に予約語にプレフィックスをつければ、変数名やメソッド名とかぶらなくてすむんじゃないかと。 ifやwhileにプレフィックスをつける言語なんてきわものっぽいですが、なんか気に入ったのでこれでいくことにします。 スレ汚しすみませんでした。
383 名前:デフォルトの名無しさん mailto:sage [2005/06/08(水) 21:06:52 ] >>379 いや、俺が気になるのは、それが全てのエラーを正しく捕まえてくれるのかと、無限ループが起きないかどうかです ……多分、yyerrok の挙動の理解が甘いような気がするんだけど 根元に error を仕込みたいですけど、エラーリカバリ後のゴミが結構引っかかります orz
384 名前:デフォルトの名無しさん [2005/06/08(水) 21:54:44 ] もれが気になるのは、ねーちゃんのケータイかどうかってことだ。
385 名前:デフォルトの名無しさん mailto:sage [2005/06/08(水) 21:59:44 ] >>384 どっからそういう話になるんだ? 誤爆?
386 名前:デフォルトの名無しさん mailto:sage [2005/06/08(水) 22:12:00 ] www.sidhe.org/~dan/presentations/Parrot_Implementation.pdf Parrotの実装について
387 名前:デフォルトの名無しさん [2005/06/08(水) 23:24:31 ] 予約語と識別子の区別はなんとでもなると思うが、 後から追加した予約語の文法定義はどうやって追加するの? ってあたりが気になった。
388 名前:デフォルトの名無しさん mailto:sage [2005/06/09(木) 20:22:41 ] >>380 gaucheとか、エラー時に行番号を表示してくれるから何かやってるんじゃない?
389 名前:デフォルトの名無しさん [2005/06/09(木) 23:54:13 ] >>380 >>388 構文木のノード毎に、行数を覚えておけば済むでしょ
390 名前:デフォルトの名無しさん mailto:sage [2005/06/10(金) 00:05:29 ] >>389 (´,_ゝ`)プッ
391 名前:デフォルトの名無しさん mailto:sage [2005/06/10(金) 00:49:48 ] gaucheってランタイムエラーのときも行数表示するん?
392 名前:デフォルトの名無しさん mailto:sage [2005/06/10(金) 00:50:19 ] 「人権擁護法案」を知って下さい。どう考えるかは 貴方次第です。 法務省 第154回国会(常会)提出主要法律案 人権擁護法(案) www.moj.go.jp/HOUAN/JINKENYOUGO/refer02.html ズームイン朝でおなじみ、 辛坊治郎さんのコラムです。 ttp://shinsho.shueisha.co.jp/toranomaki/020724/index.html こちらは櫻井よしこさんのコラムです。 ttp://blog.yoshiko-sakurai.jp/archives/2005/03/post_324.html 櫻井よしこ 人権擁護法案緊急リポ(SAPIO 6月22日号6月8日発売) www.uplo.net/www/vip14260.jpg www.uplo.net/www/vip14261.jpg www.uplo.net/www/vip14262.jpg www.uplo.net/www/vip14263.jpg 他にもこのような方々が危険性を危惧しています。 西尾幹二 ttp://nitiroku-nishio.jp/blog/ 西村幸祐 ttp://nishimura-voice.seesaa.net/ タックルと報道2001とチャンネル桜の動画。 nur.ath.cx/no0/50/tset/no0050292.zip 参考資料 国連の勧告といわれる物 国内機構の地位に関する原則(パリ原則) www.moj.go.jp/SHINGI/010525/refer05.html
393 名前:デフォルトの名無しさん mailto:sage [2005/06/10(金) 09:18:46 ] >>391 するよん。バックトレースにも表示される。
394 名前:デフォルトの名無しさん mailto:sage [2005/06/10(金) 13:02:02 ] >>367 字句解析で識別するしかない。 予約語のない(キーワードと同じ変数名が使える)言語としてはPL/Iがある(あっ た、というべきか)。が、たとえ予約語のない言語でもキーワードは字句解析 で識別しないとダメだろう。 そのような言語では、具体的にはこういうふうにする。 stmt: IF expr THEN ....(略) expr: Identifier Identifier: IDENTIFIER | IF | THEN ... むろんCのような文法ではこれはconflictをおこすので無理だが、 PL/Iならなんとかなるかもしれない。もっともPL/IがLR(1)で記述できるかど うかは不勉強にして知らない。もっと長い先読みが必要かもしれない。