LR parser

이영규·2024년 7월 8일

Compiler

목록 보기
7/10

LL parser는 top down
LR parser는 Bottom - up

L - left->rigth scan
R - Right derivation



SLR (가장 simple)
CLR (일반적)
LALR(좀 쉬움)

CLR > LALR > SLR
CLR이 할수있는게 LALR이 할 수 있지 않다.



s0 - initial state를 제외하고 symbol과 state이 같이 pair 로 push 된다. 그래서 stack top은 항상 state가 들어간다.


goto 에서는 오류가 발생하지 않는다.
action은 오류날수있다.



현재 input symbol과 current state- S라는 값으로 push됨

LL parser reduce handle 대치
stack 에는 심볼이랑 스테이트 같이 있음. handle에 대한 심볼
reduce A는 handle을 찾았다는 정보. r의 길이만큼 symbol과 state를 pop한다.

그리고 stack top은 state가 유지되어야 하므로 Goto table에서 정보를 가져온다.

Goto(Sm-r, A) = S와 A를 push해서 stack top을 state 로 만든다.

action이 accept상태면 끝나고 빈칸이면 error
를 반환하므로 LR parser를 끝낸다.


LR parser보다 좋은점은 오류를 찾는 시점이 LL 은 항상 expand이후에 찾으므로 좀 시간이 걸리지만 LR은 Action해서 없으면 주어진 symbol에 대해 바로 에러를 띄울수있다. error를 찾는 시점이 굉장히 빠르다.


후에 error recovery

LR parsing 테이블 만들기 어렵다.



LL parser expand할건가 match 할건다.
LR reduce와 shift


파싱테이블을 구하는것어 어려움으로 PGS를 통해 구할수있다.
symbol과 스택분리가능.
yacc 같은 거는 symbol 대신 의미적정보를 담은 것들을 저장한다.


구문분석과 동시에 TREE를 만드는데 TREE는 루트노드만 알면 다 찾아낼수있고 SUBTREE를 알아내는 노드 찾기.


심볼 테이블

심볼테이블은 무슨 심볼이 들어갈까.

  • STRING 의 정보와 IDENTIFIER 의 STRING POLL
    모든 스트링에 대한 정보.


NAME에 해당하느 정보를 포함하고 있어야한다.


ADDRESS의 대한 정보도 들어가는데 중간코드를 생성하느 과정에서


![(https://velog.velcdn.com/images/sontouf/post/a0fad6f8-8672-4c1a-8ba6-21858fabd207/image.png)
TYPE (정수, 실수 등등)

여러가지 ATTRIBUTE 정보들이 어떤상황에 적용되는지 확인



A를 연산기 값 확인. a를 찾기. lookup 필요. symbol table 에서 지우는 작업.
insert는 lookup과정을 동반한다.
lookup은 레퍼런스가 있을경우 참조하기 위해서 symbol정보-바인딩정보를 가져와서 쓴다.
lookup은 undefined error가 발생할 수 있다.


profile
슥슥

0개의 댓글