date: 2020-09-26 01:15 tags: [] categories: []
// (1)
function func1()
var a, b;
function func2() // (2)
var i, j, b; // (3)
begin
a := 10;
write a; // (A)
write q; // (Z)
end;
function func3() // (4)
var i, j, b; // (5)
begin
write i; // (B)
end;
begin // (6)
write func2(); // (C)
write b; // (D)
end;
const x = 10; // (7)
var y; // (8)
begin
write func1(); // (E)
write x; // (F)
end.
-------
はブロックの区切りを表している
- tIndex:
0
- level:
0
tIndex と level を初期化
----------- 0
0: _
- tIndex:
4
- level:
1
----------- 0
0: _
1: func1
----------- 1
2: a
3: b
4: func2
- tIndex:
7
- level:
2
----------- 0
0: _
1: func1
----------- 1
2: a
3: b
4: func2
----------- 2
5: i
6: j
7: b
そのとき、0番目には番兵として a を入れておく
----------- 0
0: a <- 番兵として入れておく
1: func1
----------- 1
2: a <- ここで見つかる
3: b
4: func2
----------- 2
5: i
6: j
7: b
そのとき、0番目には番兵として q を入れておく
----------- 0
0: q <- 番兵として入れておく
1: func1
----------- 1
2: a
3: b
4: func2
----------- 2
5: i
6: j
7: b
q は番兵まで探しに言ったため、未定義ということになる 0 番目 = 未定義と考えていい
blockEnd()
が呼び出され、level1
の tIndex が回復される (level1
の tIndex は 4 )
- tIndex:
4
- level:
1
----------- 0
0: _
1: func1
----------- 1
2: a
3: b
4: func2
5, 6, 7 番目に入っていた i, j, b はどこにいってしまうの??? 別で管理しているため、問題ない? 記号表に集中したいから、今は考えないことにする
- tIndex:
8
- level:
2
----------- 0
0: _
1: func1
----------- 1
2: a
3: b
4: func2
5: func3
----------- 2
6: i
7: j
8: b
そのとき、0番目には番兵として i
を入れておく
----------- 0
0: i <- 番兵として入れておく
1: func1
----------- 1
2: a
3: b
4: func2
5: func3
----------- 2
6: i <- ここで見つかる
7: j
8: b
blockEnd()
が呼び出され、level1
の tIndex が回復される (level1
の tIndex は 5 )
- tIndex:
5
- level:
1
----------- 0
0: _
1: func1
----------- 1
2: a
3: b
4: func2
5: func3
6 以降はどこかにいってしまう
そのとき、0番目には番兵として func2
を入れておく
----------- 0
0: func2 <- 番兵として入れておく
1: func1
----------- 1
2: a
3: b
4: func2 <- ここで見つかる
5: func3
そのとき、0番目には番兵として b
を入れておく
----------- 0
0: b <- 番兵として入れておく
1: func1
----------- 1
2: a
3: b <- ここで見つかる
4: func2
5: func3
blockEnd()
が呼び出され、level0
の tIndex が回復される (level0
の tIndex は 1 )
- tIndex:
1
- level:
0
----------- 0
0: _
1: func1
2 以降はどこかにいってしまう
- tIndex:
2
- level:
0
x
が追加される
----------- 0
0: _
1: func1
2: x
- tIndex:
3
- level:
0
y
が追加される
----------- 0
0: _
1: func1
2: x
3: y
そのとき、0番目には番兵として func1
を入れておく
----------- 0
0: func1 <- 番兵として入れておく
1: func1 <- ここで見つかる
2: x
3: y
そのとき、0番目には番兵として x
を入れておく
----------- 0
0: x <- 番兵として入れておく
1: func1
2: x <- ここで見つかる
3: y