第5回

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