次のページ
コンパイラの学習法 投稿者:徳丸 浩(オケゲム)  投稿日: 7月 3日(火)22時08分38秒

Mukuさん、こんばんは。

私もlex/flexはあまり使ったことがないので、教科書が「間違っている」かどうかは
判断がつきません。

コンパイラの教科書については、最近話題の佐々先生の教科書が本格的な内容を分か
りやすく説明していますが、lex/yacc(flex/bison)の説明はあまり詳しくありません。

bisonについては、私は以下を利用しています。実は、本書のテキスト形式であれば
インターネットからダウンロードできますが、安いですし、紙の本も(電車の中で読
むときなど)は便利なものです。

Bison入門(Amazonにて購入)

lex/flexについても勉強してみます。


flexbyacc 回答 感謝 投稿者:Muku  投稿日: 7月 3日(火)21時29分26秒

徳丸さま

回答ありがとうございます。
あのソースは本の通りに入力したものです。
このままだと、載ってるソース全部が不完全か?と不安になります。

flexはstrtok()やstrstrの代わりにまずは使う予定です。
PS2のVPUというCPUの簡単なコンパイラなどもつくれたらなぁとも思ってますが
なにぶん、今まではコンパイラを使う人だったもんで先は非常に厳しそうです。

いきなりぶしつけではありますが、効率よくコンパイラ作成までいける方法や
参考文献、webサイト、ソースコード、実装例 などありましたらご教授をお願いします。

話は変わりますが、ここにPS2のCPUの解説があります。
VPU用のコンパイラはまだないようです。
http://www.watch.impress.co.jp/pc/docs/article/20000302/kaigai01.htm

この後ともよろしくお願いいたします。




re^2: プログラミング言語処理系 投稿者:徳丸 浩(オケゲム)  投稿日: 7月 3日(火)13時32分24秒

先に紹介した佐々先生の「プログラミング言語処理系」ですが、Amazonのランキングで
みると、1,291 と非常に高いランキングになっていました。午前中に見たときは500番台
でしたので、この手の専門書(しかも10年以上前に書かれた)としては異常に高いランキ
ングです(なぜだ)。

Amazonアソシエイトプログラムのレポートによると、今まで3人の方が本書を当サイト
経由で購入され、手元に届いているようです。入手の難しくなりつつある本書ですが、
Amazonさん、頑張っているようですね。

amazonにて購入する

http://www.tokumaru.org/


flexの使い方(Mukuさん、はじめまして) 投稿者:徳丸 浩(オケゲム)  投稿日: 7月 3日(火)10時07分00秒

Mukuさん、インプリメンタの部屋にようこそ。席亭の徳丸です。

〉PS2Linuxで使うツールを作っています

なんだか魅力的なテーマですね。

えーと、flexは普段使わないのですが、ちょっと見て見ました。
一番の問題は、smpint.lの宣言部が抜けていることだと思います。
以下のようにしてみてください。

%{
#include "y.tab.h"
int yywrap() { return 1; }
extern int yylval;
%}
%%
"+"   return (ADDOP);
"-"   return (SUBOP);
"*"   return (MULOP);
...以下略

ADDOPなどの記号は、y.tab.hで定義されていますが、それがインクルードされていない
ので、コンパイル時に未定義のエラーになっています。また、yywrap()の定義が抜けて
います。

一方、bisonがわでは、main()関数とyyerror()関数が抜けています。
これらを補うと、一応コンパイルはできるようですが、動かして見ると正常と思われる
入力でもparse errorとなり、まだどこかおかしいようです。
しかし、デバッグの楽しみを奪ってしまうのもなんですので、まずはこの程度にとどめ
たいと思います。

また、分からないことがあったら質問してくださいね。

http://www.tokumaru.org/


flexbyaccの動作 投稿者:Muku  投稿日: 7月 1日(日)17時11分52秒

はじめまして Muku と申します。
いま独学にてyacc/lexを勉強中です。
使用している本は 

yacc/lex プログラムジェネレータ on UNIX
五月女健治(著)、発行 テクノプレス

です。
このサンプルを打ち込んでCygwinの環境で実行しましたがうまくいきません。
結果は
http://www.anakureon.com/pslinux/lex/
のlog.txtに示します。
問題は二つあると思っています。

1. -ll -ly がgccにはない?
2.gccが smpint.lに対するエラーをだす? smpint.lが間違ってる?

周りに聴ける人がいないのでこのBBSに頼ってみます。
検索エンジンでここまでたどり着きました。
PS2Linuxで使うツールを作っています。

http://www.anakureon.com/pslinux/


re: プログラミング言語処理系 投稿者:徳丸 浩(オケゲム)  投稿日: 5月15日(火)19時41分05秒

席亭の徳丸です。なるなるさん、素早いフォローありがとうございます。
佐々先生の「プログラム言語処理系」は私もお勧めの一冊です。amazon.co.jpで見てみると、一応アベイラブルなのでチャレンジされてみてはいかがでしょうか?私は、昇格試験に必要な(しかも入手困難な)本をamazonで探してもらったことがあり、そういう点ではamazonに好印象を持っています。
最近amazonのアソシエイト・プログラムに参加しましたので、下記のURLにて即座に購入できます。

amazonにて購入する


さっそくありがとうございます 投稿者:紗雪  投稿日: 5月 8日(火)23時35分54秒

 なるほど、y.output情報ですね。見落としていました。これを元にとりあえず、さくっと書いてみました。(ファイルに書いてあることを理解するのに半日掛かりましたが...)
 まだ、実験をしていないのですが、とりあえず表にはなるみたいですね。良かった良かった。(でも自分で作れないのはやっぱ悔しいかな :-))

 ”プログラミング言語処理系”って云う本は、なかなか手に入りにくいみたいですが、探してみます。参考になります。

 まだまだ、shiftとgotoの違いに戸惑ったりいろいろ混乱していますが、とりあえず足がかりが出来ました。ありがとうございます。また、ちょくちょく見に来ます。
 よろしくお願いします。


LR parsing table 投稿者:なるなる  投稿日: 5月 7日(月)23時10分24秒

とおりすがりのものですが ...

表現方法が異なりますが (km)yacc -v で生成される y.output は、ほぼ同じような情報を持っていますよね。これを元に書き直してみては如何でしょうか ?

なお kmyacc のテーブルの圧縮方法はかなり以前の C Magazine で簡単に説明されていたと思います。

> LR(単純型で構いません)表の作成の具体的な方法、もしくは考え方。(本は難しすぎるのとサンプルが少なすぎて理解にこぎ着けられません)

読みにくいことで有名な (古い) ドラゴンブック (特に訳本) とか読まれているのなら、別の本を読まれることをお薦めします。

たとえば、岩波講座ソフトウェア科学の「プログラミング言語処理系」では 20 ページに渡って各種の表の作り方を説明しています。もしかしたら参考になるかもしれません。

# ISBN 4-00-010345-8


はじめまして 投稿者:紗雪  投稿日: 5月 6日(日)10時55分07秒

はじめましてぇ〜 ずいぶん前から、cabezon自体は知っていましたが、最近このホームページを知って流れてきました。よろしくお願いします。
 早速なのですが、インタプリタとちょっと関係なさそうなのですが、過去の履歴をちょっと読んでいたら、なんか融通が利きそうだったので書き込んでみることにました。

 実を云いますと、LR構文解析表のエクセルデータ化(CSVでOK)する事を目論んでいます。
 これは冗長で大きなものかも知れませんが、構文解析の理屈だけが何とか分かり掛けた人間には有効なものではないかと思うのです。(特に自分/表と規則が分かれば簡単なサンプルを手作業で何とか還元出来るレベルの人)
 でも、いくら勉強してもLR構文解析表の作り方がちんぷんかんぷんでして、kmyacc等のソースを覗いてもどうやら圧縮型(?)とからしく、おまけにあんまり読めないので、理解できてません。
 何とかならないものかと思い、ご相談してみます。

 ここでは、そう云うレクチャーもして頂けるのでしょうか?
 LR(単純型で構いません)表の作成の具体的な方法、もしくは考え方。(本は難しすぎるのとサンプルが少なすぎて理解にこぎ着けられません)
 また、そう云ったツールが存在しているのならそれ。(笑)

 いきなりで失礼極まりないのですが、なにとぞご回答だけでも、、なにとぞなにとぞよろしくお願いします。

P.S.
 このGW中ずっとペンを片手に本を読んで、手作業でのLR解析までは何とかなったんですが、肝心な表作成が...


ありがとうございました 投稿者:Misawa  投稿日: 4月22日(日)23時27分13秒

 みさわです。プリプロセッサ、中間コードについてお答えを頂
き、ありがとうございました。

 プリプロセッサについては、やはり別処理にしてしまうしか無
いんでしょうね。私は個人で製作しているので、あまり多くのプ
ログラムを一度に作るとなると、収拾が着かなくなるので避けた
かったんですが・・・。

 LSIC-86の中間コードですが、なかなか面白い表記ですね。時間
を見て遊んでみます。

 あと、下の発言で誤字、脱字が多くてすみませんでした。また行
き詰まった事があれば、質問させて頂きたいと思います。

 誠に有り難うございました。


RE: プリプロセッサ、中間コード 投稿者:徳丸 浩(オケゲム)  投稿日: 4月21日(土)22時46分32秒

みさわさん、こんばんは。

プリプロセッサについては、そのような前提であれば、マルチパスにするくらいしか
思いつきませんね。本当に(独立した)プリプロセッサにしてしまうということですが。

中間コードについては、LSIC-86のコンパイラ起動時に -v オプションをつけると各コンパイルフェーズの起動シーケンスがわかるので、直接コンパイラのフロントエンドを起動すると中間コードが消去されないで残ります。

参考までに、hello.cのソースと中間コードを示すと、

#include <stdio.h>
main()
{
printf("hello world\n");
}

に対する中間コードは下記のようになります。これだと分かりにくいのですが、
ポーランド前置記法です。

;LSI C parser ver 3.30m Copyright (C) 1988-1993 by LSI Japan [Aug 05 1993]
$3 ..\hello.c
+Xmain F R I
{
$5
e ( Xprintf V pR G1 ) I
$6
}
G1 { C #104 C #101 C #108 C #108 C #111 C #32 C #119 C #111 C #114 C #108 C #100 C #10 C #0 }
-Xprintf

http://www.tokumaru.org/


徳丸さん、ありがとうがとうざいました 投稿者:Misawa  投稿日: 4月20日(金)10時24分00秒

 みさわです。
質問が不適切ながらもお答え、ありがとうございました。
 前記の機能は、リソース・コンパイラ(Rrc)やアセン
ブラ(Pasm)に必要だからです。よって、質問とましては
(2)ということになります。

■プリプロセッサ機能■
 Rrc および Pasmで私は、 ANSI C ライブラリ関数以
外の関数を使うつもりは無いのでマルチスレッドでの
処理は困難です。
 また、字句解析レベルでの対応についてですが、私も
yylex 以下での処理について考えましたが、簡単ながら
もCで構文解析となりますので、スマートな方法とは言
えません。構文解析をYACCで行う以上は、それ以外
で構文解析は控えるべきだ、と言う訳です。
■中間コード■
 補足説明しますと、まだ設計段階のアセンブラ・プリ
プロセッサの出力する中間コードをPasmに処理させよう
と思っている訳です。少しばかり無理があるので、今は
まだ思いつきのレベルです。
 LSI C-86の中間コードの中間コードですが、出力の仕
方や詳細について全く知らないので、よろしければ詳し
く教えてください。
 本来は自分で調べるべきなのですが、就職活動中のた
め、あまり関係の無い事ばかりをやっていると怒られま
す。お手数をかけて、本当にすみません。

 お答え、誠にありがとうございました。


re: プリプロセッサ 投稿者:徳丸 浩(オケゲム)  投稿日: 4月19日(木)15時35分42秒

徳丸です。Misawaさん、こんどはリソースコンパイラですか。すごいですね。

えーっと、プリプロセッサについては質問の趣旨が良く分からないのですが・・・

(1)YACCでプリプロセッサ機能を作りたい
(2)YACCで作った処理系に対して、プリプロセッサ機能を付与したい

どちらかな?
仮に(2)とすると、字句解析レベルで対応するか、マルチスレッドにしてプリプロセッサスレッドと構文解析スレッドを並行動作させるくらいを思いつきます。
中間コードについては目的がよくわからないので答えるのが難しいですが、
LSI C-86の中間コードなどは参考になるかもしれません。

http://www.tokumaru.org/


次のページ