「コンパイラ・スクリプトエンジン」相談室14
at TECH
735:デフォルトの名無しさん
10/05/22 21:02:29
>>731
それ括弧でくくってから呼び出し関数の名前を最初に書いたら単なるLISPじゃないのかな?
736:デフォルトの名無しさん
10/05/23 16:18:33
>>735
>それ括弧でくくってから呼び出し関数の名前を最初に書いたら単なるLISPじゃないのかな?
しー!、黙っていればわからないって!
見た目がPython風にならないかと思っただけ。
>>730
>今まで通りスタックの伸縮についてコメントで記す方式で十分な気がする
これで、IDEでワードを打ち込むと、前のキーワードの色が変わったりすると便利だな
でも、深さが任意のキーワードとかがあったらだめだろうけどな。
737:デフォルトの名無しさん
10/05/25 23:57:02
lemonとかcaperとかのプッシュ型パーサージェネレーター使ってる人いる?
738:デフォルトの名無しさん
10/05/26 01:40:55
caperは使ってる、でかいの書いたらコンパイル時間がたまらん事になった
739:737
10/05/26 12:48:47
プッシュ型パーサーって入力の終わりを示すトークンを自分で入れるでしょ。
あれがどうもやりにくいというかピンとこないというか。
対話型でスクリプトを入力するようなやつ(ぶっちゃけるとlisp)で
単純に改行を入力の終わりと出来ないやつは一体いつ終了トークンをプッシュするんだと。
「全ての左括弧と右括弧が対応したかを自分で検査してtoken_eofをプッシュ」ってやんのかな?あれ?
740:デフォルトの名無しさん
10/05/26 21:47:01
それでいいんじゃね、字句解析機でネストレベルを覚えとくのは普通にやる。
あと、プッシュ型パーサは字句解析と構文解析の間で小細工できるのが便利だと思う
741:jonigata
10/05/26 21:56:43
なるほど……
スペース的なトークンを用意したら
なんとかなったりしないかな?
それはそれで文法作るの面倒かしら
あるいは、改行のところでパーサのインスタンスを保存して、
改行にあわせて無理やりeof打ち込んで、
エラーになったら保存したインスタンスを復帰してどうにかするってのは
どうでしょう
742:737
10/05/26 23:46:56
>>740
> それでいいんじゃね、字句解析機でネストレベルを覚えとくのは普通にやる。
即効性で言っても多分それが一番かなぁ。
>>741
> スペース的なトークンを用意したら
> なんとかなったりしないかな?
外側の都合が文法に影響するのはなんとなく気持ち悪い気が…。
> あるいは、改行のところでパーサのインスタンスを保存して、
> 改行にあわせて無理やりeof打ち込んで、
> エラーになったら保存したインスタンスを復帰してどうにかするってのは
概念的には一番わかりやすいと思うけど、
括弧が閉じられた後、改行が来るまでに別のトークンが来ないとも限らないのが…。
(defun foo ()
5) (foo)
とかだったら
==> foo
==> 5
みたいにfooの定義とfoo呼び出しの戻り値5が返って欲しいし。
743:jonigata
10/05/27 00:15:48
それはトップレベルがS式のリストじゃだめ?
それも気持ち悪いor実はそんなことじゃ解決しない
ということであれば、何をどうできればいいかなあ
eofを仮にpostしてacceptするかどうかだけ判定する
メソッドとか?
一切コーディングせずに妄想だけで言ってるけど!
744:737
10/05/27 08:56:44
> それはトップレベルがS式のリストじゃだめ?
あ、なるほど。そう考えたら「パーサのインスタンスを保存して〜」で問題ないのかな…。
まだやってないけどメソッドの追加はいらなさそうな気がします。
実際試すまでちょっと間が空くかも知れないけどまた報告に来ます。
745:737
10/05/30 14:46:41
とりあえずやったこと書いてみます。
まず、字句解析器から受け取ったトークンをcaperにプッシュするループのところに以下の部分を挟みました。
if( token == token_LINE_FEED ){
Parser< Value, SemanticAction > backup = parser;
if( parser.post( token_eof, 0 ) ){
break;
}
parser = backup;
}
と、backupを書き戻そうとしたところでoperator=使えないというエラーが。
で、Parserクラスに代入演算子を入れました。
public:
self_type& operator!=(const self_type& other)
{
if (this != &other) {
accepted_ = this->accepted_;
error_ = this->error_;
accepted_value_ = this->accepted_value_;
stack_ = this->stack_;
}
return *this;
}
};
これでエラーは無くなりました。
(つづく)
746:デフォルトの名無しさん
10/05/30 14:46:58
じゃあさ、SQLでViewが画面とかどうだろう。
入力困るけど。
747:737
10/06/01 10:44:02
次に今までS式が最上位だった所へ更に上を追加しました。
Top<int> : []
| [] Top Datum(0)
;
とここでふと疑問が。
・全体をS式の列として受理するとして、スタックに積む値の型はどうなるの?
typedef boost::variant<std::string, int, bool, Sexp *> Value;
となっていたのが
typedef boost::variant< std::string, int, bool, Sexp *, std::list< boost::variant< std::string, int, bool, Sexp * > > > Value;
とでもなるのかな?えー。
…SemanticAction内でYYACCEPTに相当する何かを行った時にも
postでtrueを返せばbisonの置き換えが楽そうな気がするんだけど。
748:デフォルトの名無しさん
10/06/04 17:43:52
中田の新しい本は何が変わりましたか?
749:デフォルトの名無しさん
10/06/04 18:54:51
>748
ちょっと自分で調べといて
おれ忙しいから
750:デフォルトの名無しさん
10/06/04 22:12:22
>>748
新刊でたの?、それとも改訂版?
751:デフォルトの名無しさん
10/06/04 22:21:56
>750
ちょっと自分で調べといて
おれも忙しいから
752:デフォルトの名無しさん
10/06/04 22:24:16
>>751
そんなこと書き込んでる間に調べられるだろう
753:デフォルトの名無しさん
10/06/05 13:31:54
>>750
2版が出た
754:デフォルトの名無しさん
10/06/05 17:06:45
>>745 >>747
型に関しては、単にリストをオブジェクトを用意すればよいのではないかな?
代入演算子とかはこれから実装しますです
YYACCEPT云々についてはちと考えます。
755:デフォルトの名無しさん
10/06/05 19:48:52
良く見たらoperator!=になってるw
最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5334日前に更新/174 KB
担当:undef