LL 파서

위키百科, 우리 모두의 百科事典.

LL 파서 (LL parser)는 文脈 自由 文法 의 一部를 파싱 할 수 있는 下向式 파서 이다. LL 파서는 入力 文字列의 왼쪽(Left)에서부터 파싱을 始作하여, 左側誘導(Leftmost derivation) 方式으로 動作한다. LL 派서로 파싱이 可能한 文法은 LL 文法이라고 부른다.

萬若 LL 파서가 lookahead에 最大 k個의 토큰(token)을 使用한다면, 그 파서는 LL(k) 파서라고 부른다. LL(k) 派서로 파싱이 可能한 文法은 LL(k) 文法이라고 부른다.

파서의 構造 [ 編輯 ]

LL 파서는 普通 다음과 같은 構造로 이루어져 있다.

  • 入力 버퍼: 파싱할 文字列을 貯藏한다.
  • 스택 : 파싱 中인 토큰을 貯藏하는 데에 使用한다.
  • 파싱 테이블: 各 토큰에 對해, 어떤 파싱 規則을 使用해야 하는지를 整理해놓은 票로, 파싱 文法에 따라 決定된다.

스택의 初期 狀態에는 가장 위쪽에 始作 文字 S가 들어있고, 그 밑에 스택의 바닥을 表示하는 特殊 文字 $街 들어있다. LL 파서에서는 스택에 들어있는 토큰들에 對해, 파싱 테이블을 利用하여 토큰을 다른 토큰들로 바꾸거나, 或은 파싱이 完了된 文字를 出力 스트림에 出力한다.

예제 [ 編輯 ]

다음과 같은 文法에 對해서:

  1. S → F
  2. S → ( S + F )
  3. F → a

( a + a ) 라는 文字列을 LL(1) 파서 方式으로 파싱하는 過程은 다음과 같다. 于先 該當 文法에 對한 파싱 테이블을 다음과 같이 準備한다.

( ) a + $
S 2 - 1 - -
F - - 3 - -

스택의 初期 狀態는 다음과 같다. (왼쪽이 가장 위, 오른쪽이 가장 아래의 狀況)

S $

이제 스택의 가장 위에 있는 토큰을 確認하고 該當 토큰을 다른 토큰으로 交替하는 作業을 反復한다.

段階 動作 說明 動作 後 스택 動作 後 入力 文字列
1 初期 狀態 S $ ( a + a )
2 入力 文字列에서 ( 를 읽고, 스택의 가장 위에 있는 文字 S를 確認한다. 파싱 테이블에 依하여 規則 2를 適用한다. ( S + F ) $ ( a + a )
3 入力 文字列에서 ( 를 읽고, 스택의 가장 위에 있는 文字 ( 를 確認한다. 두 文字가 같으므로 削除한다. S + F ) $ a + a )
4 入力 文字列에서 a 를 읽고, 스택의 가장 위에 있는 文字 S를 確認한다. 파싱 테이블에 依하여 規則 1을 適用한다. F + F ) $ a + a )
5 入力 文字列에서 a 를 읽고, 스택의 가장 위에 있는 文字 F를 確認한다. 파싱 테이블에 依하여 規則 3을 適用한다. a + F ) $ a + a )
6 入力 文字列에서 a 를 읽고, 스택의 가장 위에 있는 文字 a 를 確認한다. 두 文字가 같으므로 削除한다. + F ) $ + a )
7 入力 文字列에서 + 를 읽고, 스택의 가장 위에 있는 文字 + 를 確認한다. 두 文字가 같으므로 削除한다. F ) $ a )
8 入力 文字列에서 a 를 읽고, 스택의 가장 위에 있는 文字 F를 確認한다. 파싱 테이블에 依하여 規則 3을 適用한다. a ) $ a )
9 入力 文字列에서 a 를 읽고, 스택의 가장 위에 있는 文字 a 를 確認한다. 두 文字가 같으므로 削除한다. ) $ )
10 入力 文字列에서 ) 를 읽고, 스택의 가장 위에 있는 文字 ) 를 確認한다. 두 文字가 같으므로 削除한다. $
11 入力 文字列과 스택 모두 빈 것을 確認하고 作動을 終了한다. $

파싱 過程에서 使用한 規則은 順序대로 2, 1, 3, 3이다. 卽, ( a + a ) 는 다음과 같이 파싱된다.

S → ( S + F ) ( F + F ) ( a + F ) ( a + a )

같이 보기 [ 編輯 ]