「コンパイラ・スクリプトエンジン」相談室16 (649レス)
上下前次1-新
抽出解除 レス栞
124: 117 2014/12/06(土)23:06:51.00 ID:BPhK2Nlg(2/3)調 AAS
とりあえずenzan3の定義の先頭にマイナスの記号があるかもしれないという意味合いで
以下のようなコードに変えてみました。
void enzan3() :
{}
{
[<HIKU>]enzan4() //★
((<TASU>|<HIKU>)enzan4())*
}
void enzan4() :
{}
{
enzan5()
((<KAKERU>|<WARU>)enzan5()
}
void enzan5() :
{}
{
<MOZI>|<SUUZI>|"(" enzan3() ")"
}
<>:トークン |:左右のどちらかの構文(||やOr演算子のようなもの) []:省略可能構文
202: 2015/02/24(火)17:44:49.00 ID:H95vOz7j(1/2)調 AAS
>>199
そのテーブルに式を入れるときその式が不変かどうかを判断する部分でわからなくなってくる
>>200
ほとんど読んでないドラゴンブック見たら最適化部分についても書いてるな
これ読むの辛いな
頑張って読んで出直すか
270: 261 2015/09/19(土)12:48:32.00 ID:YlOPp2hb(2/4)調 AAS
>>268
今考えてる言語では、演算子の扱いが関数を引数の場所に関して一般化した第一級オブジェクトなので
前置引数の個数や後置引数の個数は実行してみるまで分からないので
コンパイル時の識別子を用いた構文解析は無理です。
前置演算子と一引数関数が別物って変だと思ったのでそうしました。
c++風に書くと、こんな感じのが通るイメージです。
g = [](a,b){return a - b;};
if (複雑な式) {
f = [](a|b,c){return a + b + c;}; // (a|b)で前置引数としてa、後置引数としてbと示すものとする。
} else {
f = [](a,b|c){return a + b + c;};
}
// gは2引数演算子、fは3引数演算子。
// ここではgの優先順位はfより低いものとする(c++での表現方法が無いので)。
// カッコやカンマを省いてある場合、上の条件のどちらが走っても構文上は受理される。
// 複雑な式の結果によって、これはg(1, f(2, 3, 4))及びg(f(1, 2, 3), 4)のどちらにもなりうる。
cout << (g 1 2 f 3 4) << endl;
>>269
そういうわけで一度に全部読み込んでコンパイルしてから実行するという事が出来ないので、
折角だからVMも設計しようと思った次第です。
ASTから中間言語に落とすとcontinuationの実装が楽になるので。
347(1): 2016/01/15(金)22:55:08.00 ID:y9x+XKWj(1)調 AAS
C言語のABIは色々あるぞ
基本はcdeclかstdcallだけど
スタック使わずレジスタでやりとりしたり
環境や処理系毎に異なる
369: 2016/01/23(土)15:07:58.00 ID:0d2orZXz(1)調 AAS
メモ化とテーブルルックアップw
510: 2016/04/23(土)18:35:58.00 ID:vG+aKQwy(1)調 AAS
禿丸エディタを何の参考にする気だ
610: 2016/06/05(日)14:53:16.00 ID:D97p9ZEl(1)調 AAS
最適化有効にしてバグるのも大抵そのプログラムのバグだから
612: 2016/06/11(土)06:06:42.00 ID:MaD03lMp(1)調 AAS
今考えたら昔のN88BASICも、実は凄かったんだな。
コンパイラを作りの前の基礎教養として、価値があると思う。
知識が多いほうが有利だし。
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.029s