LL 파서
이 문서의 {{#은는:내용}} 출처가 분명하지 않습니다. (2021년 9월) |
LL 파서(LL parser)는 문맥 자유 문법의 일부를 파싱할 수 있는 하향식 파서이다. LL 파서는 입력 문자열의 왼쪽(Left)에서부터 파싱을 시작하여, 좌측유도(Leftmost derivation) 방식으로 동작한다. LL 파서로 파싱이 가능한 문법은 LL 문법이라고 부른다.
만약 LL 파서가 lookahead에 최대 k개의 토큰(token)을 사용한다면, 그 파서는 LL(k) 파서라고 부른다. LL(k) 파서로 파싱이 가능한 문법은 LL(k) 문법이라고 부른다.
파서의 구조
LL 파서는 보통 다음과 같은 구조로 이루어져 있다.
- 입력 버퍼: 파싱할 문자열을 저장한다.
- 스택: 파싱 중인 토큰을 저장하는 데에 사용한다.
- 파싱 테이블: 각 토큰에 대해, 어떤 파싱 규칙을 사용해야 하는지를 정리해놓은 표로, 파싱 문법에 따라 결정된다.
스택의 초기 상태에는 가장 위쪽에 시작 문자 S가 들어있고, 그 밑에 스택의 바닥을 표시하는 특수 문자 $가 들어있다. LL 파서에서는 스택에 들어있는 토큰들에 대해, 파싱 테이블을 이용하여 토큰을 다른 토큰들로 바꾸거나, 혹은 파싱이 완료된 문자를 출력 스트림에 출력한다.
예제
다음과 같은 문법에 대해서:
- S → F
- S → ( S + F )
- 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 )
같이 보기
모듈:Authority_control 159번째 줄에서 Lua 오류: attempt to index field 'wikibase' (a nil value).
| 파일:LampFlowchart.svg | 이 글은 컴퓨터 과학에 관한 토막글입니다. 여러분의 지식으로 알차게 문서를 완성해 갑시다. |
- 스크립트 오류가 있는 문서
- 출처가 필요한 글/2021년 9월
- 위키데이터 속성 P18을 사용하는 문서
- 위키데이터 속성 P41을 사용하는 문서
- 위키데이터 속성 P94를 사용하는 문서
- 위키데이터 속성 P117을 사용하는 문서
- 위키데이터 속성 P154를 사용하는 문서
- 위키데이터 속성 P213을 사용하는 문서
- 위키데이터 속성 P227을 사용하는 문서
- 위키데이터 속성 P242를 사용하는 문서
- 위키데이터 속성 P244를 사용하는 문서
- 위키데이터 속성 P245를 사용하는 문서
- 위키데이터 속성 P268을 사용하는 문서
- 위키데이터 속성 P269를 사용하는 문서
- 위키데이터 속성 P271을 사용하는 문서
- 위키데이터 속성 P347을 사용하는 문서
- 위키데이터 속성 P349를 사용하는 문서
- 위키데이터 속성 P350을 사용하는 문서
- 위키데이터 속성 P373을 사용하는 문서
- 위키데이터 속성 P380을 사용하는 문서
- 위키데이터 속성 P396을 사용하는 문서
- 위키데이터 속성 P409를 사용하는 문서
- 위키데이터 속성 P428을 사용하는 문서
- 위키데이터 속성 P434를 사용하는 문서
- 위키데이터 속성 P435를 사용하는 문서
- 위키데이터 속성 P436을 사용하는 문서
- 위키데이터 속성 P454를 사용하는 문서
- 위키데이터 속성 P496을 사용하는 문서
- 위키데이터 속성 P549를 사용하는 문서
- 위키데이터 속성 P650을 사용하는 문서
- 위키데이터 속성 P651을 사용하는 문서
- 위키데이터 속성 P691을 사용하는 문서
- 위키데이터 속성 P716을 사용하는 문서
- 위키데이터 속성 P781을 사용하는 문서
- 위키데이터 속성 P791을 사용하는 문서
- 위키데이터 속성 P864를 사용하는 문서
- 위키데이터 속성 P865를 사용하는 문서
- 위키데이터 속성 P886을 사용하는 문서
- 위키데이터 속성 P902를 사용하는 문서
- 위키데이터 속성 P906을 사용하는 문서
- 위키데이터 속성 P947을 사용하는 문서
- 위키데이터 속성 P950을 사용하는 문서
- 위키데이터 속성 P966을 사용하는 문서
- 위키데이터 속성 P982를 사용하는 문서
- 위키데이터 속성 P1003을 사용하는 문서
- 위키데이터 속성 P1004를 사용하는 문서
- 위키데이터 속성 P1005를 사용하는 문서
- 위키데이터 속성 P1006을 사용하는 문서
- 위키데이터 속성 P1015를 사용하는 문서
- 위키데이터 속성 P1045를 사용하는 문서
- 위키데이터 속성 P1048을 사용하는 문서
- 위키데이터 속성 P1053을 사용하는 문서
- 위키데이터 속성 P1146을 사용하는 문서
- 위키데이터 속성 P1153을 사용하는 문서
- 위키데이터 속성 P1157을 사용하는 문서
- 위키데이터 속성 P1186을 사용하는 문서
- 위키데이터 속성 P1225를 사용하는 문서
- 위키데이터 속성 P1248을 사용하는 문서
- 위키데이터 속성 P1273을 사용하는 문서
- 위키데이터 속성 P1315를 사용하는 문서
- 위키데이터 속성 P1323을 사용하는 문서
- 위키데이터 속성 P1330을 사용하는 문서
- 위키데이터 속성 P1362를 사용하는 문서
- 위키데이터 속성 P1368을 사용하는 문서
- 위키데이터 속성 P1375를 사용하는 문서
- 위키데이터 속성 P1407을 사용하는 문서
- 위키데이터 속성 P1556을 사용하는 문서
- 위키데이터 속성 P1584를 사용하는 문서
- 위키데이터 속성 P1695를 사용하는 문서
- 위키데이터 속성 P1707을 사용하는 문서
- 위키데이터 속성 P1736을 사용하는 문서
- 위키데이터 속성 P1886을 사용하는 문서
- 위키데이터 속성 P1890을 사용하는 문서
- 위키데이터 속성 P1907을 사용하는 문서
- 위키데이터 속성 P1908을 사용하는 문서
- 위키데이터 속성 P1960을 사용하는 문서
- 위키데이터 속성 P1986을 사용하는 문서
- 위키데이터 속성 P2041을 사용하는 문서
- 위키데이터 속성 P2163을 사용하는 문서
- 위키데이터 속성 P2174를 사용하는 문서
- 위키데이터 속성 P2268을 사용하는 문서
- 위키데이터 속성 P2349를 사용하는 문서
- 위키데이터 속성 P2418을 사용하는 문서
- 위키데이터 속성 P2456을 사용하는 문서
- 위키데이터 속성 P2484를 사용하는 문서
- 위키데이터 속성 P2558을 사용하는 문서
- 위키데이터 속성 P2750을 사용하는 문서
- 위키데이터 속성 P2980을 사용하는 문서
- 위키데이터 속성 P3223을 사용하는 문서
- 위키데이터 속성 P3233을 사용하는 문서
- 위키데이터 속성 P3348을 사용하는 문서
- 위키데이터 속성 P3372를 사용하는 문서
- 위키데이터 속성 P3407을 사용하는 문서
- 위키데이터 속성 P3430을 사용하는 문서
- 위키데이터 속성 P3544를 사용하는 문서
- 위키데이터 속성 P3562를 사용하는 문서
- 위키데이터 속성 P3563을 사용하는 문서
- 위키데이터 속성 P3601을 사용하는 문서
- 위키데이터 속성 P3723을 사용하는 문서
- 위키데이터 속성 P3788을 사용하는 문서
- 위키데이터 속성 P3829를 사용하는 문서
- 위키데이터 속성 P3863을 사용하는 문서
- 위키데이터 속성 P3920을 사용하는 문서
- 위키데이터 속성 P3993을 사용하는 문서
- 위키데이터 속성 P4038을 사용하는 문서
- 위키데이터 속성 P4055를 사용하는 문서
- 위키데이터 속성 P4114를 사용하는 문서
- 위키데이터 속성 P4143을 사용하는 문서
- 위키데이터 속성 P4186을 사용하는 문서
- 위키데이터 속성 P4423을 사용하는 문서
- 위키데이터 속성 P4457을 사용하는 문서
- 위키데이터 속성 P4534를 사용하는 문서
- 위키데이터 속성 P4535를 사용하는 문서
- 위키데이터 속성 P4581을 사용하는 문서
- 위키데이터 속성 P4613을 사용하는 문서
- 위키데이터 속성 P4955를 사용하는 문서
- 위키데이터 속성 P5034를 사용하는 문서
- 위키데이터 속성 P5226을 사용하는 문서
- 위키데이터 속성 P5288을 사용하는 문서
- 위키데이터 속성 P5302를 사용하는 문서
- 위키데이터 속성 P5321을 사용하는 문서
- 위키데이터 속성 P5368을 사용하는 문서
- 위키데이터 속성 P5504를 사용하는 문서
- 위키데이터 속성 P5587을 사용하는 문서
- 위키데이터 속성 P5736을 사용하는 문서
- 위키데이터 속성 P5818을 사용하는 문서
- 위키데이터 속성 P6213을 사용하는 문서
- 위키데이터 속성 P6734를 사용하는 문서
- 위키데이터 속성 P6792를 사용하는 문서
- 위키데이터 속성 P6804를 사용하는 문서
- 위키데이터 속성 P6829를 사용하는 문서
- 위키데이터 속성 P7293을 사용하는 문서
- 위키데이터 속성 P7303을 사용하는 문서
- 위키데이터 속성 P7314를 사용하는 문서
- 위키데이터 속성 P7902를 사용하는 문서
- 위키데이터 속성 P8034를 사용하는 문서
- 위키데이터 속성 P8189를 사용하는 문서
- 위키데이터 속성 P8381을 사용하는 문서
- 위키데이터 속성 P8671을 사용하는 문서
- 위키데이터 속성 P8980을 사용하는 문서
- 위키데이터 속성 P9070을 사용하는 문서
- 위키데이터 속성 P9692를 사용하는 문서
- 위키데이터 속성 P9725를 사용하는 문서
- 위키데이터 속성 P9984를 사용하는 문서
- 위키데이터 속성 P10020을 사용하는 문서
- 위키데이터 속성 P10299를 사용하는 문서
- 위키데이터 속성 P10608을 사용하는 문서
- 위키데이터 속성 P10832를 사용하는 문서
- 위키데이터 속성 P11249를 사용하는 문서
- 위키데이터 속성 P11646을 사용하는 문서
- 위키데이터 속성 P11729를 사용하는 문서
- 위키데이터 속성 P12204를 사용하는 문서
- 위키데이터 속성 P12362를 사용하는 문서
- 위키데이터 속성 P12754를 사용하는 문서
- 위키데이터 속성 P13049를 사용하는 문서
- 잘못된 파일 링크가 포함된 문서
- 컴퓨터 과학에 관한 토막글
- 모든 토막글 문서
- 파싱 알고리즘