Skip to content

Instantly share code, notes, and snippets.

@tamago324
Created September 25, 2020 17:11
Show Gist options
  • Save tamago324/bcb33ce149304907c77d3660691f5b66 to your computer and use it in GitHub Desktop.
Save tamago324/bcb33ce149304907c77d3660691f5b66 to your computer and use it in GitHub Desktop.
記号表について、ちょっと理解した気になった

title: kigohyonituiterikaisitai

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.

------- はブロックの区切りを表している

(1) を解析する前 (プログラムの解析前)

  • tIndex: 0
  • level: 0

tIndex と level を初期化

----------- 0
 0: _

(2) を解析したあと

  • tIndex: 4
  • level: 1
----------- 0
 0: _
 1: func1
----------- 1
 2: a
 3: b
 4: func2

(3) を解析したあと ((2) を解析した直後にレベルが1つ上がった)

  • tIndex: 7
  • level: 2
----------- 0
 0: _
 1: func1
----------- 1
 2: a
 3: b
 4: func2
----------- 2
 5: i
 6: j
 7: b

(A) で 'a' を探すときは 7番目から上に探していく

そのとき、0番目には番兵として a を入れておく

----------- 0
 0: a           <- 番兵として入れておく
 1: func1
----------- 1
 2: a           <- ここで見つかる
 3: b
 4: func2
----------- 2
 5: i
 6: j
 7: b

(Z) で 'q' を探すときは 7番目から上に探していく

そのとき、0番目には番兵として q を入れておく

----------- 0
 0: q           <- 番兵として入れておく
 1: func1
----------- 1
 2: a
 3: b
 4: func2
----------- 2
 5: i
 6: j
 7: b

q は番兵まで探しに言ったため、未定義ということになる 0 番目 = 未定義と考えていい

(4) を解析する前 (func2 の end)

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 はどこにいってしまうの??? 別で管理しているため、問題ない? 記号表に集中したいから、今は考えないことにする

(5) を解析したあと ((4) を解析した直後にレベルが1つ上がった)

  • tIndex: 8
  • level: 2
----------- 0
 0: _
 1: func1
----------- 1
 2: a
 3: b
 4: func2
 5: func3
----------- 2
 6: i
 7: j
 8: b

(B) で 'i' を探すときは 8番目から上に探していく

そのとき、0番目には番兵として i を入れておく

----------- 0
 0: i           <- 番兵として入れておく
 1: func1
----------- 1
 2: a
 3: b
 4: func2
 5: func3
----------- 2
 6: i           <- ここで見つかる
 7: j
 8: b

(6) を解析する前 (func3 の end)

blockEnd() が呼び出され、level1 の tIndex が回復される (level1 の tIndex は 5 )

  • tIndex: 5
  • level: 1
----------- 0
 0: _
 1: func1
----------- 1
 2: a
 3: b
 4: func2
 5: func3

6 以降はどこかにいってしまう

(C) で func2 を探すときは 5番目から上に探していく

そのとき、0番目には番兵として func2 を入れておく

----------- 0
 0: func2        <- 番兵として入れておく
 1: func1
----------- 1
 2: a
 3: b
 4: func2        <- ここで見つかる
 5: func3

(D) で b を探すときは 5番目から上に探していく

そのとき、0番目には番兵として b を入れておく

----------- 0
 0: b            <- 番兵として入れておく
 1: func1
----------- 1
 2: a
 3: b            <- ここで見つかる
 4: func2
 5: func3

(7) を解析する前 (func1 の end)

blockEnd() が呼び出され、level0 の tIndex が回復される (level0 の tIndex は 1 )

  • tIndex: 1
  • level: 0
----------- 0
 0: _
 1: func1

2 以降はどこかにいってしまう

(7) を解析したあと

  • tIndex: 2
  • level: 0

x が追加される

----------- 0
 0: _
 1: func1
 2: x

(8) を解析したあと

  • tIndex: 3
  • level: 0

y が追加される

----------- 0
 0: _
 1: func1
 2: x
 3: y

(E) で 'func1' を探すときは 3番目から上に探していく

そのとき、0番目には番兵として func1 を入れておく

----------- 0
 0: func1           <- 番兵として入れておく
 1: func1           <- ここで見つかる
 2: x
 3: y

(F) で 'x' を探すときは 3番目から上に探していく

そのとき、0番目には番兵として x を入れておく

----------- 0
 0: x               <- 番兵として入れておく
 1: func1
 2: x               <- ここで見つかる
 3: y
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment