- 「コンパイラ・スクリプトエンジン」相談室15
851 :jonigata[]:2014/03/25(火) 00:03:25.96 ID:GAMZ9k7g - ebnfブランチ github.com/jonigata/caper/tree/ebnf で
EBNFを実装してみた(C++ジェネレータのみ)ので暇な人いたら人柱募集。 使い方はsamples/cppのlist0, list1, list2, optionalを参考のこと。 list2のスラッシュオペレータは独特のやつで、 X/Yと書くと X Y X Y XにマッチしてYを捨ててXのリストを返す。 引数リストなどに使う目的で作った。 カッコは役に立つところが思いつかないので実装してない (今のところ実装する気もない)。 というか実用的な言語ではスラッシュ以外ほとんど使うところないと思ってる。 出力されるパーサ・ジェネレータのソースはより読みやすくなったはず。
|
- 「コンパイラ・スクリプトエンジン」相談室15
853 :jonigata[]:2014/03/25(火) 22:09:52.29 ID:GAMZ9k7g - とりあえずイテレータ対とかboost::optional的なものを返すようにしてみたよ。
それをどう使うかはセマンティックアクション側で勝手にしてね、的な。 template <class S> int Document(const S& x) { for(typename S::const_iterator i = x.begin();i!=x.end();++i) { } return 42; } こんな感じで受ける。 なぜかrange-based forは使えなかった。 返すイテレータの実装が悪いのかな? 誰かに添削して欲しい。
|
- 「コンパイラ・スクリプトエンジン」相談室15
854 :jonigata[]:2014/03/25(火) 22:12:36.54 ID:GAMZ9k7g - あ、気のせいだった。普通に使えた。
template <class S> int Document(const S& x) { for (const auto& y: x) { } return 42; } これで受けれる。
|