10
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
   

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

スタックマシンでの制御構文の動作とか…

どうも友人の頼みでスクリプト言語開発中…
stgへ手が回らない…

やっとFlex,yaccの使い方分かった
(C#はC#Flexとmonoのjayです。
C#FlexはGPLですが生成されたコードは制限なしに使えるとライセンスに書いてあります。
またjayはGPL、LGPL、MITのデュアルライセンスなのでMIT選べばGPL感染はしないはず…と思ったらツールはGPLっぽいなぁ~
ついでになんかhttp://www.tiu.ac.jp/org/forum-02/documents/C-04.pdfこんな資料もあった
そもそもskeleton.csにはgplのもじが一つもないので大丈夫)
気が向いたらちょっと書くかも…

とりあえず置いておいて…

スタックマシンの制御構文の動作です。(if,while,do-while,while文)

命令系は以下
これで動くはず…

push expr:exprの値をプッシュ
jmp(C / NC) label:labelへ(スタックからPopして値が等しいとき/等しくないとき)ジャンプ
A,B//大文字:命令文の固まり
label: :ラベルの設置

だいぶアバウトに書いてるけど勘弁

まずif文
→からしたはif(expr) goto label;とlabel:とかで変換したやつ

if(expr) A


if(!expr) goto L;
A
L:

push expr
jmpNC L:
A
L:


if(expr) A else B


if(!expr)L1:
A
jmp L2
L1:
B
L2:

push expr
JmpNC L1
A
Jmp L2
L1:
B
L2:

これが基本
以下if文で置き換えられる所は置き換えたままにします。

for文
面倒くさいからコードに書いたコメントそのままにしてしまえ…

/// for(expr1;expr2;expr3)A


expr1
continue:
if(!expr2) break:
A
jmp continue:
expr3
jmp continue
break:


/// expr1
///
/// Continue:
/// push expr 2
/// JMPNC Break;
///
/// A
/// Continue:
/// expr 3
/// Jmp Continue:
/// Break:

while文…こっちのが先だろう…



/// while(expr)A


goto continue;
while:
A
continue:
if(expr)goto while
break;

/// jmp continue:
/// while:
/// A
/// Continue:
/// expr
/// jmpC while
/// break:
///

do-while文
構成が結構簡単
多分繰り返しの中では速くなると思う

/// do A while ( expr )


continue:
A
if(expr) goto continue:
break:

/// continue:
/// A
/// push expr
/// jmpC continue
/// break:
///

スポンサーサイト

Comment

Secret

検索フォーム

RSSリンクの表示

リンク

リンクというか個人的によく使うアルゴリズムの解説サイト… C#でなかったりする

ブロとも申請フォーム

この人とブロともになる

QRコード

QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。