'2011/08/24'에 해당되는 글 2건

  1. 2011.08.24 중간언어
  2. 2011.08.24 LR 구문 분석
공부/컴파일러2011. 8. 24. 20:48


중간언어는 단계가 세분화된 컴파일러의 각 모듈들을 연결시켜준다.
컴파일러를 기능적으로 독립적인 여러 모듈들로 구성하는 것이 가능해 졌다.
중간 코드를 이용한 최적화가 기계 코드에서의 최적화보다 효율적이다.
인터프리터를 사용해서 실생할 수 있다.

중간언어 형태에 따른 4가지 분류
Polish 표기법(Postfix 표현 등), 3-주소 코드, 트리 구조 코드(AST 등), 가상 기계 코드(U-코드 등)

중간언어 생성
파서가 구문분석을 수행하고 결과로 다음단계에서 필요한 의미정보를 구성하여 출력한다.
방법1
생성 규칙에 해당하는 의미 수행 코드를 직접 기술.
파서에 의해 호출되어 실행된다.
각 생성규칙이 reduce될 때마다 의미 규칙이 수행되어 중간코드가 생성.
하지만, 이 방법의 문제점은 파싱 도중에 에러가 일어난 경우 그 때까지 행한 의미 행동들이 모두 무의미해진다. 
방법 2
방법 1 문제를 보완. 다음 단계에서 필요한 정보들만 구성(AST)
AST를 이용해서 중간 언어를 생성한다.
AST는 파스트리에서 중복되는 부분을 제거한 것. 필요한 정보들만 포함 한 것.
파스트리를 만들 때, shift할 때 단말노드가 만들어지고 reduce할 때 서브트리가 만들어지지만 
AST는 shift할 때 단만노드를 만들고 의미있는 생성 규칙으로 reduce할 때 서브트리가 만들어진다.

'공부 > 컴파일러' 카테고리의 다른 글

LR 구문 분석  (0) 2011.08.24
LL 구문 분석  (0) 2011.08.22
구문 분석 (syntax analysis)  (0) 2011.08.22
context-free grammar  (0) 2011.08.20
regular language  (0) 2011.08.20


Posted by skyjumps
공부/컴파일러2011. 8. 24. 20:02


Left to right scanning, Right parse.
 
파싱테이블 : 스택의 top과 현재의 입력 심벌에 따라 구문 분석 행동을 결정.
LR 파서의 네가지 행동 : Shift, reduce, accept, error
shift: 현재 상태에서 입력 심벌을 본 행동이 shift S이면 입력 심벌을 스택으로 이동하고 다음 상태 S도 스택에 넣는다.
reduce: 현재 상태에서 입력 심벌을 본 행동이 reduce A->α이면 스택에서  α 2배만큼 제거하고 A를 스택에 넣는다. 그리고 A에 대한 다음 상태를 스택에 넣는다.
accept: 주어진 입력이 올바른 스트링이다.

LR 파싱 테이블 만드는 방법 : Simple LR(SLR), Canonical LR(CLR), Lookahead LR(LALR)
SLR
LR(0) 아이템과 FOLLOW 집합을 이용하여 만든다.
LR(0) 아이템은 생성 규칙의 rhs에 .이 있는 생성규칙이다.
점 심벌 다음의 심벌을 mark 심벌이라고 한다.
CLOSURE 함수는 한 상태에서 보아야 되는 모든 LR(0) 아이템을 구하는 것.
마크 심벌이 논터미널일 경우 이 논터미널 생성규칙들을 LR(0) 아이템으로 만들어서 현재 상태에 추가 한다.
GOTO 함수는 한 상태에서 다른 상태로 가기 위해 사용. 
상태 I와 GOTO함수들이 파싱테이블을 구성한다.
CLOSURE로 한 상태를 구하고 그 상태의 GOTO함수를 만든다. GOTO함수의 결과가 이전 상태들하고 일치하는 것이 없을 때 새로운 상태가 된다. 
reduce 아이템에 대하여 그 생성 규칙의 lhs의 follow 심벌을 보고 reduce행동을 한다.  <- SLR의 특징.
한 상태에서 마크 심벌과 reduce 아이템의 follow가 같을 때, shift를 해야 할지, reduce를 해야 할지 결정할 수 없다. shift-reduce충돌
한 상태에서 두개 이상의 reduce 아이템의 follow 심벌이 같다면  어느 것을 reduce해야 할지 결정할 수 없다.  reduce-reduce충돌
문법이 모호하기 때문에 이러한 충돌이 발생한다.

CLR
Lookahead : 한 상태에서 어떤 논터미널 심벌 다음에 나올 수 있는 터미널. 상태 의존적인 follow. Follow가 lookahead를 포함.
reduce 아이템에 대한 reduce행동을 lookahead 심벌에 대해서 만드는 방법이 CLR.
CLOSURE구할 때 lookahead를 구해서 첨가한다. 한 아이템의 마크 심벌 다음에 오는 심벌의 FIRST가 그 심벌의 lookahead가 된다.  
lookahead때문에 파싱 테이블이 커진다. 그래서 lookahead를 이용하지만 테이블 크기는 작게 구성하는 LALR을 많이 사용한다.

LALR
방법1
core(아이템에서 lookahead를 제외한 부분)가 같은 것들끼리 묶는다.
SLR의 상태수랑 같게 된다. shift-reduce충돌은 일어나지 않지만  reduce-reduce충돌은 일어날 수 있다. 왜냐하면 shift는 코어에 따라 결정되는 것이지 lookahead에 의해 결정되는 것이 아니기 때문.
방법2
방법1은 lookahead 때문에 상태수가 많아지고 시간이 오래걸린다.
그래서 SLR에서 follow대신에 lookahead를 계산해서 사용한다.

모호한 문법
모호한 문법은 LR 문법이 될 수 없다.
하지만 연산순위나 결합 법칙 정보를 이용해서 하나의 행동을 선택하도록 함으로써 shift-reduce 충돌이나 reduce-reduce충돌을 해결한다.

 

'공부 > 컴파일러' 카테고리의 다른 글

중간언어  (0) 2011.08.24
LL 구문 분석  (0) 2011.08.22
구문 분석 (syntax analysis)  (0) 2011.08.22
context-free grammar  (0) 2011.08.20
regular language  (0) 2011.08.20


Posted by skyjumps