boost::spiritを使ってみる (2)
いやー,spirit は本当に便利だわ.
ものすっっっっっっっっっごくコンパイルが遅くなるけどw
しかしまー,プログラミング言語の BNF 記法を考えるのは大変だな!
int a;
int b();
この二行をパースして a が変数名, b が関数名だと知るためには,シンボル名の後に ( があるかどうかまで読まないといけない.
こういうときにシンボル名を発見した段階でそれをシンボルテーブルに登録してしまうと,バックトラックが起こったときに二重登録してしまうようだ.
入力を消費しないで先読みできるパーサは用意されていないのだろうか?(eps_p がそれかもしれない)
他の方法なら,シンボル名を発見した段階で一時的に記憶しておいて,確定した段階で初めてシンボルテーブルに登録するってのはどうだろう.
これも,確定した段階をどうやって得るかということと,あいまいだったシンボルと確定したシンボルの対応をどうやって管理するかということ,この2つが問題・・・.
バックトラックが起こらないように BNF を定義できたらいいのだが・・・そもそも可能なのかどうかがわからない.
あーもー相談できる人がいないのはきっついなあ.
よし,上の問題は解消できた.
想像通り,一時的にバッファに溜めておいて,ルールが終了するタイミングでバッファからシンボルテーブルに登録するようにした.
ところで,もっとややこしい問題が!
string a;
string b();
b がコンストラクタだったらどうしよう ・゚・(ノД`)・゚・
・・・.
えーと,インテリセンスに利用するだけだから変数か関数か気にしなくてもいいですか?(苦笑)
駄目ですよね・・・.
そろそろスコープの概念を導入して,関数定義可能なスコープとそうでないスコープを区別しなきゃいけないみたい.
参考:
http://boost.cppll.jp/HEAD/libs/spirit/doc/primitives.html
http://www.c3.club.kyutech.ac.jp/~gridbug/spirit/spirit04.html
http://homepage3.nifty.com/kaku-chan/boost/spirit/chapter_002.html
関連記事:
http://rayerd.ddo.jp/mt/inglogging/archives/2006/05/boostspirit.html
http://rayerd.ddo.jp/mt/inglogging/archives/2006/05/parser.html