以前メモリに関してお世話になったyukiです。
開発環境:WinXP(SP2) VC++2003 MFC
現在作成中のソフトにマクロ言語を導入し様々な計算(字句解析による括弧を含めた電
卓のような演算から配列を使用した可変長配列×スカラといった複雑なものまで)
をさせたいのですが構文解析器やコンパイラコンパイラなどいろいろ調べてみたのです
が
実装するにはかなりの労力が必要そうなのでもしかしたらここの方たちならよりよい
方法をご存知かもしれないと思い投稿させていただいております。
根本から作成する場合、コンパイラ作成過程で行われる構文解析等と同等のものを行う
ことになると思います。この場合 TinyC のように0から構築することになると思いま
す。ただこの場合は勉強しなければならないことが多すぎて実装にかなりの時間がかか
ってしまうと思います。もっとも融通が利くのはこの方法だと思うので最後の手段とし
て考えています。
既存のものを利用する場合 python や ruby といったスクリプト言語をC++から読み込む
ためのライブラリを利用したり Boost::spirit の構文解析を利用することになると思い
ますが、Boost::spirit にしてもあまりにも文献が少なく構文を定義するクラスから外
部関数を呼び出そうとすると
「引数を取り込む関数には評価されません。」
というエラーがでてしまいます。spirit関連のサイトを覗いてみてもエラーに悩まされ
ている人が多いようです。同等のエラーを検索しても同じ例に当たったものはありませ
んでした。
flex/bison にソースを吐かせることも考えていますがソースを履かせるのであれば1か
ら記述したほうが自身の勉強にもなりよいかと考えています。
文章が長く不明瞭なものになってしまいましたが
マクロ言語をソフトに実装させるためにはどうするのがよいか?
という質問になります。
この手の問題に詳しいかたがいらっしゃいましたら回答よろしくおねがいします。
> マクロ言語をソフトに実装させるためにはどうするのがよいか?
作りたいのはコンパイラ? インタプリタ? トランスレータ?
どうするのが誰のためによいかを問うていますか?
マクロ言語の設計者? 実装者? 利用者?
> flex/bison にソースを吐かせることも考えていますがソースを履かせるのであれば1か
> ら記述したほうが自身の勉強にもなりよいかと考えています。
マクロ言語の実装が勉強のためだというなら/苦労を厭わぬ覚悟があるなら
「全部自前で書き起こしなさい」って答えちゃいますよ。
再帰下降法で実装していくんですかね。
参考
スクリプト言語を作ってみよう
http://ruffnex.oc.to/kenji/text/script/
Javaですが、こんな書籍もあります。
いまどきのプログラム言語の作り方
http://www.amazon.co.jp/gp/product/4839919232/503-9986529-5439129?
v=glance&n=465392
# 私は持っています。
## 今やっている仕事では、バリバリyaccを使っています。
## といっても、作ったのは私ではないですが、、、
「再帰下降」でGoogleってみるとたくさんありますね。
先に紹介したサイトはちょっと、わかりにくいかも。
電卓程度の機能から徐々に作りこんでいくほうが理解ができると思います。
一応、わかりやすそうなサイト
アルゴリズムいろいろ
http://www005.upp.so-net.ne.jp/h-masuda/cl/CAlgo/index.html
作れる!数式評価プログラム
http://www.tuat.ac.jp/~tuatmcc/contents/monthly/200206/nuki.xml
επιστημη さんこんにちわ
>作りたいのはコンパイラ? インタプリタ? トランスレータ?
>どうするのが誰のためによいかを問うていますか?
>マクロ言語の設計者? 実装者? 利用者?
ソフトに組み込むマクロ言語ですのでイメージはインタープリタですね。
質問が抽象的すぎましたか、
誰のためにと言うのは無論開発者である自分のためでもあり利用者のためでも
あります。主に開発効率とマクロ言語の柔軟性の2点についての問題です。
苦労を厭わぬ覚悟ももちろんあります。現在
渡邊坦:コンパイラの仕組み、朝倉書店(1998)
電気通信大学 情報工学科 渡邊坦
(実装の過程の大部分はコンパイラと同じだと思っているので)
を読んで勉強をしていますが他の解決方法やもっとよい方法があるのではないか
と思い投稿しました。
Blueさんありがとうございます。
やはり正攻法が一番なのでしょうか・・・
私が調べたものにはLL法で解説しているところが多かったのですが
再起下降法の方がマクロ言語を作成するには向いているようですね。
yaccを実際に使ったことはないのですが少し質問をしてよいでしょうか?
yaccで言語を作成する場合新しい組み込み関数を設定する際に再度ソースを吐き出させ
る必要があると思います。VC++でGUIに組み込む場合、そのソースに多少修正を加える必
要があると思いますがBlueさんはCUIでの開発ですか?
もしGUIに組み込む場合新しい関数を1つ追加するのにどれくらいの作業が必要になる
か、と言うのはわかるでしょうか・・・。初心者に近いもので不躾な質問ですみませ
ん。
実はflexのGUIツールとして
bison & flex compiler for Windows GUI
http://www.vector.co.jp/soft/win95/prog/se162088.html
というフリーソフトがあります。これを利用すれば開発効率は上がるかな、と考えたも
ので
雑誌でチラッと見た程度なので使えるかわかりませんが
VSTAでVBやC#を取り込んじゃうことが出来るとか…
>yaccで言語を作成する場合新しい組み込み関数を設定する際に再度ソースを吐き出させ
>る必要があると思います。VC++でGUIに組み込む場合、そのソースに多少修正を加える
>必要があると思いますがBlueさんはCUIでの開発ですか?
>もしGUIに組み込む場合新しい関数を1つ追加するのにどれくらいの作業が必要になる
>か、と言うのはわかるでしょうか・・・。初心者に近いもので不躾な質問ですみませ
>ん。
実際作ったのは私ではないので、詳しいことはよくわかりません。
何を基準に GUI、CUIといっているのかよくわかりせん。
マクロといわれるものは単なるテキストに過ぎないのですよね?
文字列にGUI、CUIって概念はないでしょう。
(構文解析時にエディタ機能たとえば色づけとかするんでしたら絡むが)
>何を基準に GUI、CUIといっているのかよくわかりせん。
>マクロといわれるものは単なるテキストに過ぎないのですよね?
>文字列にGUI、CUIって概念はないでしょう。
>(構文解析時にエディタ機能たとえば色づけとかするんでしたら絡むが)
単純に文字列として考えればGUIもCUIも同じですが
構文解析を実際に行う場合yaccやboost::spiritなどのライブラリはほとんど
そのまま流用できます。
上にも書いたようにクラス化する際に吐き出したソースを改変する作業がGUIの
場合必要になってくると思います。
特にコンパイラコンパイラはそのほとんどがCUIで利用することを前提に作成
されているためサンプルなどもオブジェクトの概念のないものばかりな気がする
のです。
そのあたりの話が聞けたらと思ったのですが・・・。説明不足でしたね。
申し訳ありません。
私はまだプログラミングをはじめて間もないので大きな勘違いをしているかも
しれません、ご容赦ください。
> 上にも書いたようにクラス化する際に吐き出したソースを改変する作業がGUIの
> 場合必要になってくると思います。
改変がどの程度必要になるかは、純粋にアプリ<->解析器間のインターフェイスの問題
で、
アプリ自体がCUIとかGUIとかでは変わりません(というか変わらないように書けばいいだ
けです)。
C++からCの関数だって呼べるわけで、無理にクラス化する必要もないですし、
クラス化するならラッパーを作ることになるでしょうから、ここクラスの作り方次第で
す。
すみません。うまく意図を伝えきらないので終了させてもらいます。
いろいろありがとうございました。