言語処理系(4) 金子敬一
練習問題 2.2 値呼び,参照呼び,複写復元連係,名前呼び,を用いたときの印字結果? proc PROC(X,Y,Z); begin 練習問題 2.2 値呼び,参照呼び,複写復元連係,名前呼び,を用いたときの印字結果? proc PROC(X,Y,Z); begin Y := Y + 1; Z := Z + X end PROC; begin A := 2; B := 3; PROC(A+B,A,A); print A end
2 練習問題 2.2 値呼び proc PROC(X,Y,Z); begin Y := Y + 1; Z := Z + X 練習問題 2.2 値呼び proc PROC(X,Y,Z); begin Y := Y + 1; Z := Z + X end PROC; A := 2; B := 3; PROC(A+B,A,A); print A end 出力結果は, 2
8 練習問題 2.2 参照呼び proc PROC(X,Y,Z); begin Y := Y + 1; Z := Z + X 練習問題 2.2 参照呼び proc PROC(X,Y,Z); begin Y := Y + 1; Z := Z + X end PROC; A := 2; B := 3; PROC(A+B,A,A); print A end 出力結果は, 8
3か7 練習問題 2.2 複写復元連係 proc PROC(X,Y,Z); begin Y := Y + 1; Z := Z + X 練習問題 2.2 複写復元連係 proc PROC(X,Y,Z); begin Y := Y + 1; Z := Z + X end PROC; A := 2; B := 3; PROC(A+B,A,A); print A end 出力結果は, 3か7
9 練習問題 2.2 名前呼び proc PROC(X,Y,Z); begin Y := Y + 1; Z := Z + X 練習問題 2.2 名前呼び proc PROC(X,Y,Z); begin Y := Y + 1; Z := Z + X end PROC; A := 2; B := 3; PROC(A+B,A,A); print A end 出力結果は, 9
3 字句解析 3.1 字句解析系の役割 3.2 字句解析系を設計するための簡単な方法
3.1 字句解析系の役割 字句解析系の設計 入力文字列 入力文字列 字句解析系 呼出し 構文解析系 字句解析系 字句 構文解析系 字句 3.1 字句解析系の役割 字句解析系の設計 入力文字列 入力文字列 字句解析系 呼出し 構文解析系 字句解析系 字句 構文解析系 字句 解析木 解析木
3.1 字句解析系の役割 字句解析の必要性 構文解析よりも簡単な作業 分離することで構文解析も単純化 字句解析時に実行可能なこと 3.1 字句解析系の役割 字句解析の必要性 構文解析よりも簡単な作業 分離することで構文解析も単純化 字句解析時に実行可能なこと 行番号の数え上げ 出力リストの作成 余白の除去 注釈の削除
3.1 字句解析系の役割 入力バッファリング ’i’ ’n’ ’t’ ’ ’ ’x’ ’1’ ’;’ ’ ’ ’i’ ’n’ ’t’ ’ ’ 3.1 字句解析系の役割 入力バッファリング ’i’ ’n’ ’t’ ’ ’ ’x’ ’1’ ’;’ ’ ’ ’i’ ’n’ ’t’ ’ ’ ”int”
3.1 字句解析系の役割 入力バッファリング ’i’ ’n’ ’t’ ’ ’ ’x’ ’1’ ’;’ ’ ’ ’i’ ’n’ ’t’ ’ ’ 3.1 字句解析系の役割 入力バッファリング ’i’ ’n’ ’t’ ’ ’ ’x’ ’1’ ’;’ ’ ’ ’i’ ’n’ ’t’ ’ ’ ”int” ”x1”
3.1 字句解析系の役割 入力バッファリング ’l’ ’o’ ’n’ ’g’ ’a’ ’m’ ’e’ ’;’ ’ ’ ’i’ ’x’ ’1’ 3.1 字句解析系の役割 入力バッファリング ’l’ ’o’ ’n’ ’g’ ’a’ ’m’ ’e’ ’;’ ’ ’ ’i’ ’x’ ’1’ ’;’ ’ ’ ’i’ ’n’ ’t’ ’ ’ ’v’ ’e’ ’r’ ’y’
3.1 字句解析系の役割 入力バッファリング ’x’ ’1’ ’;’ ’ ’ ’i’ ’n’ ’t’ ’ ’ ’v’ ’e’ ’r’ ’y’ 3.1 字句解析系の役割 入力バッファリング ’x’ ’1’ ’;’ ’ ’ ’i’ ’n’ ’t’ ’ ’ ’v’ ’e’ ’r’ ’y’ ’l’ ’o’ ’n’ ’g’ ’a’ ’m’ ’e’ ’;’ ’ ’ ’i’
3.1 字句解析系の役割 予備操作 注釈の除去 不要な空白の除去 行数の数え上げ
3.2 字句解析系を設計する ための簡単な方法 遷移図 字句の発見を表す 現れ得る入力文字 遷移 * 1 英字 状態 1文字戻す
3.2 字句解析系を設計する ための簡単な方法 識別子に対する遷移図 英字または数字 * 始め 英字 1 2 区切り記号
ちょっと休憩 (雑談)
CMの中の外国語 Volare, cantare... 飛ぶ,歌う... Что? Что? 何? 何? Что? Что? 何? 何? Il offre sa confiance et son amour. 信頼と愛情を提供する. 有烏龍茶嗎? ウーロン茶ありますか?
休憩おわり
3.2 字句解析系を設計する ための簡単な方法 遷移図からプログラムへ 入力バッファから次の文字を読み込む.(関数GETCHAR) 3.2 字句解析系を設計する ための簡単な方法 遷移図からプログラムへ 入力バッファから次の文字を読み込む.(関数GETCHAR) 対応する辺が出ていれば,対応する状態へ制御を移す. 2重丸の状態でなければ,失敗. すべての遷移図を試しても駄目ならば字句誤り.
3.2 字句解析系を設計する ための簡単な方法 状態0 state0: C := GETCHAR(); if LETTER(C) then 3.2 字句解析系を設計する ための簡単な方法 状態0 state0: C := GETCHAR(); if LETTER(C) then goto state1 else FAIL() 始め 英字
1 3.2 字句解析系を設計する ための簡単な方法 状態1 state1: C := GETCHAR(); if LETTER(C) or 3.2 字句解析系を設計する ための簡単な方法 状態1 state1: C := GETCHAR(); if LETTER(C) or DIGIT(C) then goto state1 else if DELIMIT(C) then goto state2 else FAIL() 英字または数字 1 区切り記号
* 2 3.2 字句解析系を設計する ための簡単な方法 状態2 state2: RETRACT(); return(id, 3.2 字句解析系を設計する ための簡単な方法 状態2 state2: RETRACT(); return(id, INSTALL()) * 2