LLVM-IR(LLVM中間コード)用コンパイラの作り方 その8

前回の続き

前回、IF文の分ができたので、繰り返しのFOR~NEXT文の実装について

IF文では、ざっくり書くと
(1)数式左辺の値を計算するコード
(2)数式右辺の値を計算するコード
(3)2つの値を比較して結果をBool値で得るコード (条件式の示す値)
(4)条件式の示す値(Bool値)が真ならば THENの部分のラベルにジャンプ
(5)偽ならば ELSEの部分にジャンプ
(6)THEN部分のコードとENDIFへのジャンプ
(7)ELSE部分のコードとENDIFへのジャンプ
(8)ENDIFのラベル
というコードが生成される。

FOR~NEXT文についてもほとんど同様だ。

(1)ループ変数への代入文のコード
(2)ループ変数からSTEP値を引く
(3)FOR文先頭ラベル
(4)ループ変数にSTEP値を足す (初回は、引いてから足すのでプラスマイナスゼロになる)
(5)ループの中のコード (行をまたいでもよい)
(6)ループ変数とTO値との比較をして、結果をBool値で得るコード
(7)Bool値が真ならば FOR文先頭ラベルへジャンプ
というコードを生成する。

(1)~(2)が初期化処理で、(3)~(4)がFOR文の処理、(6)~(7)がNEXT文の処理となる。

FOR~NEXT文以外にもWHILE文みたいなのも作ることはできるのだけど、面倒なのでTinyBasicの簡略化のためということにして省略した。




コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Time limit is exhausted. Please reload CAPTCHA.

90 − 82 =