
- 인터프리터는 각 문장의 AST를 순회하면서 문장의 의미에 따라 해석하여 수행BNF, EBNF → 사용되는 non-terminal 갯수는 EBNF가 더 작음
RHS : right hand side
RD parser를 구현할때는 이라는 non-terminal을 처리해주는 Expression procedure을 만들고 non terminal에 대응되는 함수 호출


1, 2, 3에 대해 처리

어떤 non-terminal이 BNF에 정의되어있는데 right hand side에 하나의 항만 있다면 구현이 간단하지만, 만약 두개 이상의 Right hand side가 존재한다면 (위의 처럼 or 표시로 이루어져 있다면..) input을 살펴보고 (들어오는 token input을 살펴보고) 오른쪽에 or로 선택할 수 있는 right hand side 들을 처리할 수 있어야함
⇒ Match되는게 있으면 처리하고 (match되는 right hand side 없으면 = token이 잘못 들어온 것이라면) syntax error에 대한 처리
expr - term - factor 으로 정의됨
term은 factor/factor 로 정의
factor는 (expr)로 정의
expr은 term + term으로 정의
term은 factor로, factor는 리터럴으로 정의
일반적인 LL parser
LL parser가 가지고 있는 2가지 단점 (=RD parser, LL이나 RD나 같다고 보겠다고 하심) → LL parser가 가지고있는 BNF를 가지고 parse tree를 만들 수 없는 = syntax 분석을 할 수 없는 경우
BNF상에서 left recursion 발생 → LL parser는 무한 루프에 빠짐
⇒ BNF or EBNF 자체를 바꿔야 함, 혹은 LR parser로 구현하면 됨

ㄴ A를 없애서 rule을 다시 만들어냄으로써 극복 가능
pairwise disjointness test를 통과해야 함


여기까지가 top-down parser에 대한 설명이었음
input이 들어왔을때 bottom up parser로 어떻게 parse tree를 만들 것인가?
software tool에 BNF 입력하면 이런 LL parser or LR parser의 parsing table을 제공해줌 → parsing table은 제공된다.
초기상태는 0으로 시작
(S0, a1...an$)
stack은 이렇게 주어짐 → 대문자 S는 상태 (State), 뒤는 입력 스트링, 입력 스트링의 끝은 $ 기호로 표시
Stack은 상태0token상태1token…으로구성됨
0E1+6T9*7F10
숫자하나 = 상태 번호, 토큰 순으로 엇갈려가면서 쌓인다.
0은 초기 start 상태 번호임
입력에 따라 parsing table을 보고 동작 결정
동작 기술: action table → S로 시작하거나 (shift) R로 시작하거나 (reduce) accept거나 공란 (4가지 경우)
shift: 상태를 뒤에있는 상태번호로 이동하라는 의미 (뒤에있는 숫자 상태로 stack의 상태를 바꿔라)
reduce: BNF rule번호에 의해 해당 BNF rule번호로 reduce하라는 뜻
accept: 끝났다는 의미. syntax 성공 (parse tree를 bottom up으로 LR parsing으로 생성하는데 성공)
공란: error가 발생, syntax error 출력

reduce는 해당 BNF의 Rule을 따른다

Bottom-up parser
right most derivation을 한다고 가정했을 때, right most derivation의 역순으로 오면서 sentential form을 이동해감
→ parse tree를 아래에서부터 위로 오면서 변경한다.
handle: 역순으로 올 수 있는 terminal과 non-terminal의 조합 , simple phrase에 해당
phrase: 1번 이상의 derivation을 거쳐 A만 β로 바뀌었다면 β는 phrase
**simple phrase**: 1번만 derivation을 거쳤는데 A만 β로 바뀌었다면 β는 simple phrase (한번만 역으로 가면 A로 바뀐다.)

right most의 역순으로 오려면 가장 왼쪽에 있는 simple phrase(가장 왼쪽의 handle)을 계속 production rule의 역으로 대치해나가면 된다.
⇒ 근데 실질적으로 bottom-up parser가 동작할때는 parse tree가 없다. 실제 parsing 동작은 parsing table에 의해 일어난다.
Shift-Reduce Algorithm
LR parser(bottom-up)의 advantage
left recursion이 나오는 경우도 해결 가능
pairwise disjointness test를 실패하는 문법에 대해서도 동작 가능
→ LR parser가 더 다양한 프로그래밍 랭귀지 문법 수용 가능, syntax error도 더 빠르게 검출 가능
parser의 동작원리: stack, input buffer 필요