「コンパイラ・スクリプトエンジン」相談室11at TECH
「コンパイラ・スクリプトエンジン」相談室11 - 暇つぶし2ch734:デフォルトの名無しさん
07/04/26 23:29:06
だいぶ今更な記事だな...

735:デフォルトの名無しさん
07/04/26 23:49:01
パーサー書くときのコーディングのテクニックが掲載された書籍は存在するのでしょうか。


736:デフォルトの名無しさん
07/04/27 00:58:05
今年ってコンパイラに関係する本って出版される予定ないんだな...


737:デフォルトの名無しさん
07/04/27 09:49:51
C/C++のプリプロセッサの構文やマクロ展開アルゴリズムが載ったページや本とかないでしょうか?
あとVCとGCCで使えるマクロの違いが分かるものも探しています。

たとえば、↓のマクロはGCCでは使えて、VCでは使えません。
 #define MSG(format, param...) printf(format, param);
こんなのが分かるものを探しています。


738:デフォルトの名無しさん
07/04/27 13:50:20
>>737
>C/C++のプリプロセッサの構文やマクロ展開アルゴリズムが載ったページや本とかないでしょうか?
URLリンク(gcc.gnu.org)
このへん?

>あとVCとGCCで使えるマクロの違いが分かるものも探しています。
処理系固有の拡張は処理系のマニュアルに載っているはず。

それから、スレ違いじゃないか?

739:デフォルトの名無しさん
07/04/27 13:55:29
Cのプリプロセッサ作りたいなら、このスレでもいいのでは?
コーディングのテクニック載ってる本あったら買うだろうなぁ。

740:デフォルトの名無しさん
07/04/27 18:07:38
誰かの自作自演が始まると、
ガクッとレベルが低下するな
このスレ

741:デフォルトの名無しさん
07/04/27 19:30:22
同意

742:デフォルトの名無しさん
07/04/27 19:34:00
まったくだ

743:デフォルトの名無しさん
07/04/27 19:48:08
仰る通り

744:デフォルトの名無しさん
07/04/27 20:45:24
>740はいつも正しいな

745:デフォルトの名無しさん
07/04/27 21:31:14
>>737
最近プログラミング始めたとかだとその辺
情報足りてないよね…

Cプリプロセッサ・パワー―C言語の秘められた能力を解き放つ(1988年発行)
URLリンク(www.pro.or.jp)
>マクロについて勉強したければ、標準のヘッダーファイルとか、
>ウィンドシステムなどのヘッダーファイルなどに豊富な例があるので、
>そちらを参考にした方が、はるかにためになるでしょう。

というか日本には20年前に出版されたのしかないのね…orz
ソース嫁。もしくはググれ。20年前にはググれなかったわけだし。

プリプロセッサとは - はてなダイアリー
URLリンク(d.hatena.ne.jp)

この辺からマクロっぽいことやってるのを追いかけてみるのも
有効かもね。

alias, エリアス, スクリプト言語とかやってることまんま
マクロっぽい気がする。微妙にスレ稚貝っぽいのでsage。

>>736
書籍の価値って何なんだろうね。出版されるのは入門書ばっかりだよね。
どうでもいいけど。
>速効! Pythonプログラミング バージョン2.5対応
>URLリンク(www.shuwasystem.co.jp)

746:デフォルトの名無しさん
07/04/27 21:36:53
プリプロセッサのプログラミング解説と言えばカーニハンが書いた有名な本があるだろ…

747:745
07/04/27 22:44:51
>>746
マクロ カーニハン で 検索
URLリンク(d.hatena.ne.jp)
URLリンク(www5a.biglobe.ne.jp)
URLリンク(www.coara.or.jp)
URLリンク(www.pro.or.jp)

ありが㌧。なんか基本中の基本みたいでした
これだからゆとりは orz

748:デフォルトの名無しさん
07/04/27 23:03:08
言うまでも無い事だが、マクロ・プロセッサーのソースが載っているカーニハンの本と言えば
「ソフトウェア作法」 URLリンク(www.amazon.co.jp)
の方だw

記述言語&ターゲット言語はFORTRAN

749:デフォルトの名無しさん
07/04/27 23:06:48
×マクロプロセッサ
○プリプロセッサ

www

750:737
07/04/27 23:30:10
いろいろと情報ありがとうございます。
C言語の仕様に則したプリプロセッサを作ろうと考えているのですが、
738のPredefined macroとかを見てると完全準拠は難しそうですね・・・
とりあえずたくさんのソースをパースしてみて
1つ1つクリアしていこうかと思います。

>>746
カーニハンの名著って「プログラミング言語C」でしょうか?
同じカーニハンの「プログラミング作法」では関数マクロは使うなみたいなことが
書いてあるらしい(Amazonより)のでプリプロセッサが嫌いなのかと思いました。


751:デフォルトの名無しさん
07/04/27 23:40:54
>>750
> 同じカーニハンの「プログラミング作法」では関数マクロは使うなみたいなことが
> 書いてあるらしい(Amazonより)のでプリプロセッサが嫌いなのかと思いました。

「プログラミング作法」のほうだと思う。
ただし、「プログラミング作法」に載ってるのはFortran用の
プリプロセッサーの話。
Cのプリプロセッサーではないので注意。

752:745
07/04/28 01:00:12
プログラミング作法 第1章「スタイル」関数マクロはなるべく使うな etc
URLリンク(www.ascii.co.jp) (2000/11)
 ↑
プログラム書法 (プログラミング作法の前版 記述言語は Fortran,PL1)
URLリンク(d.hatena.ne.jp) (1982/06)
プログラム書法 メモ
URLリンク(www.6809.net)
 ↑
ソフトウェア作法 使用言語 は RatFor (1981年)
Ratfor - Wikipedia
URLリンク(ja.wikipedia.org)

発刊された年順に並べるとsoft作法->prog書法->prog作法

soft作法(Fortran) -> orz
prog書法(Fortran,PL1) -> prog作法(C)

あれっ、soft作法はアップトゥデートされてなwwwww

こんなかんじですた (調べるのめんどい)

753:612
07/04/28 01:41:25
自己フォロー。 boost::spirit v1.8 にstored_parserなんていうのがありました。
正しく求めていたのですな。こんなことができました。ソースコードベタはり

#include <iostream>
#include <conio.h>
#include <boost/spirit.hpp>
#include <boost/spirit/dynamic.hpp>
#include "main.hpp"
using namespace boost::spirit;

template<typename ScannerT>
class TSetToken {
public:
   TSetToken(boost::spirit::stored_rule<ScannerT>& target) : target_(target) {}
   void operator()(const char* begin, const char* end) const {
      target_
         =  target_.copy()
         | str_p(begin, end)
         ;
   };
private:
   boost::spirit::stored_rule<ScannerT>& target_;
};

754:デフォルトの名無しさん
07/04/28 01:43:06
おっと、誤)stored_parser 正)stored_ruleですな。

struct TProgramGrammar : public grammar<TProgramGrammar> {
   template <typename ScannerT>
   struct definition {
      boost::spirit::stored_rule<ScannerT> program, block;
      definition(TProgramGrammar const& self) {
         program
            =  +block
            ;
         block
            =  '(' >> (+alpha_p)[TSetToken<ScannerT>(block)] >> ')'
            ;
      };
      const stored_rule<ScannerT>& start() const { return program; }
   };
};

int main() {
   {
      TProgramGrammar p;
      std::cout << parse("a", p, space_p).full << std::endl; // false
   } {
      TProgramGrammar p;
      std::cout << parse("(a) a", p, space_p).full << std::endl; // true
   }
   std::cout << "Press any key" << std::endl;
   getchar();
   return 0;
}



最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch