前のページ 次のページ
re:BISONforWIN32の起動  投稿者:西谷  投稿日:12月12日(火)18時52分57秒

徳丸さん、はじめまして。
高速解答ありがとうございます。(_^o^_)
動作確認いたしました。

今後とも技術協力をお願いします。
日本にこのようなサイトがあることがとてもうれしいです。
これもIT時代の恩恵ですね。
今後もがんばってくださいね。このサイトを応援します。


re:BISONforWIN32の起動 投稿者:徳丸(オケゲム)  投稿日:12月12日(火)15時56分12秒

西谷さん、はじめまして。インプリメンタの部屋へようこそ。
申し訳ない。これは私のドキュメントが間違っていました。
環境変数は、下記のように設定してください。

SET BISON_SIMPLE=D:\BISON\bison.simple

これで動くようになると思います。ホームページ側の記述も修正しました。
今後も、時々遊びに来てくださいね。


BISONforWIN32の起動 投稿者:西谷  投稿日:12月12日(火)14時22分01秒

徳丸さん、プログラム開発ありがとうございます。
コンパイラ−コンパイラについて勉強中のものです。

開発中のプログラムでBYACCが容量オーバーして実行できなないので
BISONに切替えようとしていますが、CYGWIN版は上手く行きませんでした。
(実行メモリエラー発生。)

http://www.tokumaru.org/ からダウンロードしたBISONも動かなくて困っています。
起動方法を教えてください。

実行環境はNT4.0+SP6aです。
実行結果を示します。
DOS窓から・・・
Microsoft(R) Windows NT(R)
(C) Copyright 1985-1996 Microsoft Corp.

D:\BISON>bison
bison: no grammar file given

D:\BISON>bison edif1.y
bison: /usr/local/lib/bison.simple: No such file or directory

D:\BISON>SET BISON_SIMPLE=D:\BISON

D:\BISON>bison edif1.y
bison: D:\BISON: Permission denied
(ディスクはFAT形式でパーミッション無しです。)


Re: 論理式 投稿者:fumio  投稿日:12月 4日(月)12時58分09秒

Cabezonの論理式のコード生成は、きっとVC6と同じ方法を取ってるのだろうと思います。
判断の根拠は、ラベル番号が逆順になっていることです。

それにしても、ほぼ完璧ですねぇ。
できれば、このアルゴリズムを教えていただきたいのですが。(簡単にで構いません)
Cabezonのソースもちょこっと見ましたが、該当部分を見ただけなので理解できませんでした。
どっかのサイトのURLだけでも教えていただけるとありがたいです。

#case文は、いずれ参考にさせていただくことになると思います。:-)


ありがとうございました 投稿者:Ponta  投稿日:12月 2日(土)15時15分22秒

徳丸さん

こんにちは、Pontaです。
Flex&Bisonの使用に関し、アドバイスを頂きましてありがとうございました。

>こんにちは。Pontaさん、「インプリメンタの部屋」にようこそ。
>FlexとBisonの商用利用についてですが、私はBisonは既にお仕事で利用しています。
>以下の本に、Bison1.25以降であれば、Bisonの商用利用が可能であるという記述が
>あります。

いろいろ調べて、客先とも相談したところ「問題ないであろう。」という結論に達し、
Flex&Bisonを使って構文解析部を作ることになりました。

Bisonの規則部でややてこずってますが、(Conflictが出たりして)
かなり楽ができそうです。


論理式 投稿者:徳丸(オケゲム)  投稿日:12月 1日(金)11時55分16秒

〉とある本によると、このことを「短絡評価」と呼ぶそうですね。
〉Modula-2にもあるようで、Pascalにもあるんでしょうか。

 手元に資料がないのでうろ覚えですが、Pascalの場合は処理系依存だったと思います。
Cabezonの場合は「短絡評価」です。

〉スタックマシンのコードを生成するために、VC6のアセンブラ出力を検討していたら、
〉かなり生成規則が複雑なのですね。驚きました。(VC6の出力コードには無駄がありません)

 Cabezonは、論理式のコードはかなり頑張っていると思います。以下は、Jump最適化
を指定している場合のコードですが、

;  if (x > y) and (z < w) or (w > x) and (z < y) then
  mov ax, word ptr _X
  cmp ax, word ptr _Y
  jle _75
  mov ax, word ptr _Z
  cmp ax, word ptr _W
  jl _74
_75:
  mov ax, word ptr _W
  cmp ax, word ptr _X
  jle _72
  mov ax, word ptr _Z
  cmp ax, word ptr _Y
  jge _72
_74:
;    x := 1;
  mov word ptr _X, 1
_72:



;  if (x > y) and (z < w) or not ((w > x) and (z < y)) then
  mov ax, word ptr _X
  cmp ax, word ptr _Y
  jle _75
  mov ax, word ptr _Z
  cmp ax, word ptr _W
  jl _74
_75:
  mov ax, word ptr _W
  cmp ax, word ptr _X
  jle _76
  mov ax, word ptr _Z
  cmp ax, word ptr _Y
  jl _72
_76:
_74:
;    x := 1;
  mov word ptr _X, 1
_72:

 そんなに悪くないと思っています。

〉switch文と並んで実は奥深い機能と知りました。

 Cebezonはswitch文(Pascalの場合はcase文)も頑張っています:-)


Re: 真偽式の優先順位 投稿者:fumio  投稿日:11月30日(木)23時57分45秒

ありゃ・・・ほんとだ・・・。
徳丸さんの例を試したところ、見事差異が表れました。
試したはずのパターンだったのに・・・いかんですな。(^^;

考え方を構文の優先順位から日本語レベルに変えてみて検討したところ、
「●●か○○の場合・・・」などと最初に考え、
「●●というのは、△△かつ□□が成立するときだから・・・」と条件式を詳細に検討していく・・・
「これが人間の思考だ!」というのはちと無理がありますね。。。

おかげさまで優先順位については、懸念事項が消えて次に進めそうです。
と思ったら早速壁に・・・というのも論理演算子のコード生成です。
スタックマシンのコードを生成するために、VC6のアセンブラ出力を検討していたら、
かなり生成規則が複雑なのですね。驚きました。(VC6の出力コードには無駄がありません)

とある本によると、このことを「短絡評価」と呼ぶそうですね。
Modula-2にもあるようで、Pascalにもあるんでしょうか。
switch文と並んで実は奥深い機能と知りました。


真偽式の優先順位 投稿者:徳丸(オケゲム)  投稿日:11月30日(木)23時10分34秒

fumioさんはじめまして。インプリメンタの部屋にようこそ。

〉私はオリジナル言語を設計&実装していて、Public PL/0シリーズは大変参考になっています

この部屋は、fumioさんのような方のためにあるようなものですね。
今後ともちょくちょく遊びに来てください。

で、ご質問の件ですが、

a() && b() || c() && d()

のような場合が問題になると思います。
a()、b()がともにtrueの場合は、c()とd()を実行せずにtrueであることが
確定します。

&&と||を同じ優先順位にすると、

((a() && b()) || c()) && d()

ということですから、a()とb()がともにtrueであっても、真偽値は確定しませんし、
d()がfalseであれば、いつでも式の値がfalseになります。


kmyaccについて 投稿者:徳丸(オケゲム)  投稿日:11月30日(木)23時09分05秒

森公一郎さん、お久しぶりです。森さんが私のことを覚えていて下さっただけでも感激です。
願わくば、ちょくちょく遊びに来てください。

リエントラントなパーサの要望が一般的に多いのかどうかは分かりません。
私の場合、WWWサーバー上で動くスクリプト・エンジンを作ったので、
必然的にリエントラントになりました。
(IISのAPI(ISAPI)を使ったアプリケーションなどでは、リエントラント
にすることが要求されます。)

私の場合、やむを得ずbisonを使ったので、kmyaccがリエントラントなパーサ
を生成するようになったら嬉しいですね。デバックモードは重宝していましたから。


論理演算子の優先順位 投稿者:fumio  投稿日:11月30日(木)11時46分55秒

はじめまして、fumioと申します。
私はオリジナル言語を設計&実装していて、Public PL/0シリーズは大変参考になっています。

さて、論理and/or演算子はたいていの言語にありますが、CとJavaはand/orの優先順位につい
ては「andが強い」と定めています。その意図がわからず、and/orは+/-と同じように並列な
関係で良いのではないか?と考えています。

いろいろなパターンを検討してみましたが、and/orの優先順位の差異が発生するような
コードを見つけることができませんでした。例えば、

bool a(); bool b(); bool c(); bool d();
bool b1 = a() || b() && c() || d();

という例では、a,b,c,dが何を返そうとも、a,b,c,dが呼ばれる順番に優先順位は影響を及ぼしません。
さらに複雑なパターンを考えても、さっぱり見えてきませんでした。

是非徳丸さんの意見を聞きたいと思います。
よろしくお願いします。

※ここでいう論理演算は、右辺の評価が不要な場合に右辺の評価を行わないことを前提としています。


前のページ 次のページ