560 likes | 722 Views
言語処理系(9). 金子敬一. 6 構文主導型翻訳. 6.1 構文主導型翻訳方式 6.2 構文主導型翻訳系の実現 6.3 中間コード 6.4 後置記法 6.5 解析木と構文木. 6.6 3番地コード,4つ組および3つ組 6.7 代入文の翻訳 6.8 論理式 6.9 制御の流れを変える文. 6.8 論理式. 式の形 E → E or E | E and E | not E | ( E ) | id | id relop id ただし relop は,<, ≦ ,=, ≠ ,>, ≧ のいずれか or , and は左結合
E N D
言語処理系(9) 金子敬一
6 構文主導型翻訳 6.1 構文主導型翻訳方式 6.2 構文主導型翻訳系の実現 6.3 中間コード 6.4 後置記法 6.5 解析木と構文木 6.6 3番地コード,4つ組および3つ組 6.7 代入文の翻訳 6.8 論理式 6.9 制御の流れを変える文
6.8 論理式 • 式の形 E → EorE|EandE|notE|(E) |id|id relop id ただしrelopは,<,≦,=,≠,>,≧のいずれか or, andは左結合 not, and, orの順に優先順位
6.8 論理式 • 論理式の翻訳方法 基本的には次の2つ • trueを1,falseを0などと数値的に符号化 • 制御の流れを用いる goto L if A goto L if A relop B goto L
6.8 論理式 • 数値による表現 A or B and C T1 := B and C T2 := A or T
6.8 論理式 • 数値による表現 A < B or C (1) if A < B goto (4) (2) T1 := 0 (3) goto (5) (4) T1 := 1 (5) T2 := T1 or C
6.8 論理式 • 数値による表現 E → E(1)orE(2) {T := N( ); E.P := T; GEN(T := E(1).P or E(2).P)} E → id(1) relop id(2) {T := N( ); E.P := T; GEN(if id(1).P relop id(2).P gotoNQ+3); GEN(T := 0); GEN(goto NQ+2); GEN(T := 1);}
6.8 論理式 • 制御の流れによる論理式の表現 A < B or C (1) if A < B goto (4) (2) T1 := 0 (3) goto (5) (4) T1 := 1 (5) T2 := T1 or C T2 := C T2 := 1
6.8 論理式 • 制御の流れによる論理式の表現 if E then S(1) else S(2) Eに対する コード S(1)に対する コード TRUE: S(2)に対する コード FALSE:
6.8 論理式 • 制御の流れによる論理式の表現 while E do S Eに対する コード Sに対する コード TRUE: FALSE:
6.8 論理式 • 制御の流れによる論理式の表現 分岐点の生成時には分岐先は未定 後埋め MAKELIST(i): アドレスiのみからなるリストを生成 MERGE(p1, p2): アドレスリストp1とp2を併合したリストを返す BACKPATCH(p, i): アドレスリストpが指定する4つ組の分岐先がiとなるように更新
6.8 論理式 • 制御の流れによる論理式の表現 翻訳属性 E.T: Eが真のときの未定の分岐先を持つ4つ組のアドレスリスト E.F: Eが偽のときの未定の分岐先を持つ4つ組のアドレスリスト
6.8 論理式 • 制御の流れによる論理式の表現 (1) E→E(1)orME(2) {BACKPATCH(E(1).F, M.Q); E.T := MERGE(E(1).T, E(2).T); E.F := E(2).F} (2) E→E(1)andME(2) {BACKPATCH(E(1).T, M.Q); E.T := E(2).T; E.F := MERGE(E(1).F, E(2).F)}
6.8 論理式 • 制御の流れによる論理式の表現 (3) E→notE(1) {E.T := E(1).F; E.F := E(1).T} (4) E→(E(1)) {E.T := E(1).T; E.F := E(1).E}
6.8 論理式 • 制御の流れによる論理式の表現 (5) E→id {E.T := MAKELIST(NQ); E.F := MAKELIST(NQ + 1); GEN(if id.P goto _); GEN(goto _)}
6.8 論理式 • 制御の流れによる論理式の表現 (6) E→id(1) relop id(2) {E.T := MAKELIST(NQ); E.F := MAKELIST(NQ + 1); GEN(ifid(1).Prelopid(2).Pgoto_); GEN(goto _)} (7) M→e {M.Q := NQ}
E E M E E E M 6.8 論理式 • 制御の流れによる論理式の表現 100: if P < Q goto _ 101: goto _ 102: if R < S goto _ 103: goto _ 104: if T < U goto _ 105: goto _ 102 104 T={100,104} F={103,105} T={104} F={103,105} T={100} F={101} T={102} F={103} Q=102 T={104} F={105} Q=104 < and R S e < T U e < or P Q
6.8 論理式 • 混合型の式 算術式⊂論理式ならば論理式を数値として扱ったほうが便利;論理式を制御の流れとして表現する方法も利用可能
6.9 制御の流れを変える文 • 無条件飛越し goto文の翻訳 後方分岐:ラベルの検索,3番地文生成 前方分岐:ラベルの登録,3番地文生成,ラベルに番地を登録