6. 구문 분석 (syntax analysis)

Slides:



Advertisements
Similar presentations
CHAPTER 5 TOP-DOWN PARSING SUNG-DONG KIM, DEPT. OF COMPUTER ENGINEERING, HANSUNG UNIVERSITY.
Advertisements

1 넷스팟 MAC ID 설정 방법 ( 서울캠퍼스 기준 ) 각종 스마트폰의 WiFi 를 이용시 각종 스마트폰의 WiFi 를 이용시 MAC ID 설정을 하는 방법 입니다. 아이폰의 경우는 별도의 설정없이 바로 사용이 가능하오니, 사용이 어려울 경우, 고객센터로 문의하시면 됩니다.
제 5 장 구문 정의  프로그래밍 언어의 기본 문자 집합  Alphabet 문자 (A-Z) 26 개 + 아라비아 숫자 (0 - 9) 10 개  예 ) Fortran : 기본 문자 집합 + 13 개의 특수문자 (=+ - * / ( ),. $ ‘ : 공백 ) Algol60.
컴파일러 입문 제 7 장 LL 구문 분석.
컴파일러 입문 제 5 장 Context-Free 문법.
적분방법의 연속방정식으로부터 Q=AV 방정식을 도출하라.
8. LR 구문 분석 8-1. LR 파서 8-2. LR(0) 아이템의 집합 8-3. SLR 파싱 테이블 구성 방법
1. 컴파일러 개론 1-1. Compiler 정의 1-2. Language Processing System
3장 구문과 의미론 순천향대학교 컴퓨터공학과 하상호.
차량용 교류발전기 alternator Byeong June MIN에 의해 창작된 Physics Lectures 은(는) 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 3.0 Unported 라이선스에 따라 이용할 수 있습니다.
업체등록신청절차 목차 메인화면 메세지별 유형 2-1. 이미 가입된 공급업체
조 병 규 Software Quality Lab. 한국교통대학교
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
제3장 스택과 큐.
질의 사항 Yield Criteria (1) 소재가 평면응력상태에 놓였을 때(σ3=0), 최대전단응력조건과 전단변형에너지 조건은σ1 – σ2 평면에서 각각 어떤 식으로 표시되는가? (2) σ1 =σ2인 등이축인장에서 σ = Kεn로 주어지는 재료의 네킹시 변형율을 구하라.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
제 11 장  코드 최적화.
D / K / I / T / E / C / H / N / O / L / O / G / Y
Sungkyunkwan University OS Project Dongkun Shin
자료구조: CHAP 7 트리(1) 순천향대학교 컴퓨터공학과 하 상 호.
자료구조: CHAP 4 리스트 (3) 순천향대학교 컴퓨터공학과 하 상 호.
프로그래밍 랩 – 7주 리스트.
11장. 1차원 배열.
CHAP 7: 트 리 (1) 한 성 대 학 교 정보통신공학과 봉 정 식.
Introduction To Data Structures Using C
2. 형식언어 (Formal Language)
7. LL 구문 분석 7-1. 결정적 구문 분석 7-2. Recursive-descent 파서 7-3. Predictive 파서 7-4. Predictive 파싱 테이블의 구성 7-5. Strong LL(k) 문법과 LL(k)문법.
프로그래밍 개요
어서와 C언어는 처음이지 제14장.
5. Context-free 문법 5-1. 서 론 5-2. 유도와 유도 트리 5-3. CFG표기법.
인터넷응용프로그래밍 JavaScript(Intro).
13. 포인터와 배열! 함께 이해하기 IT응용시스템공학과 김 형 진 교수.
자료구조: CHAP 7 트리 –review 순천향대학교 컴퓨터공학과 하 상 호.
7장. 다양한 형태의 반복문. 7장. 다양한 형태의 반복문 7-1 반복문이란? 반복문의 기능 세 가지 형태의 반복문 특정 영역을 특정 조건이 만족하는 동안에 반복 실행하기 위한 문장 7-1 반복문이란? 반복문의 기능 특정 영역을 특정 조건이 만족하는 동안에 반복.
Term Projects 다음에 주어진 2개중에서 한 개를 선택하여 문제를 해결하시오. 기한: 중간 보고서: 5/30 (5)
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
제 9장 트랜스레이터.
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
8. LR 구문 분석 8-1. LR 파서 8-2. LR(0) 아이템의 집합 8-3. SLR 파싱 테이블 구성 방법 8-4. CLR 파싱 테이블 구성 방법 8-5. LALR 파싱 테이블 구성 방법 8-6. 모호한 문법 8-7. 구문 분석기의 작성.
PADS Logic 회로도.
Choi Seong Yun 컴퓨터 프로그래밍 기초 #06 : 반복문 Choi Seong Yun
합집합과 교집합이란 무엇인가? 01 합집합 두 집합 A, B에 대하여 A에 속하거나 B에 속하는 모든 원소로 이루어진 집합을 A와 B의 합집합이라고 하며, 기호 A∪B로 나타낸다. A∪B ={x | x∈A 또는 x∈B}
자바 5.0 프로그래밍.
메모리 타입 분석을 통한 안전하고 효율적인 메모리 재사용
CHAP 21. 전화, SMS, 주소록.
과제 1 4bit x 4 SRAM이 있다 아래 (1), (2) 두 입력에 대한 출력값 [3:0] Dout을 나타내시오 (1)
객체기반 SW설계 팀활동지 4.
균형이진탐색트리 이진 탐색(binary search)과 이진 탐색 트리(binary search tree)와의 차이점
( Windows Service Application Debugging )
2nd day Indexing and Slicing
Homework #12 (1/2) 프로그램을 작성하고, 프로그램과 실행 결과를 프린트하여 제출한다.
SPL3D Printer If 조건문.
Flow Diagram IV While.
[INA240] Data Structures and Practice
7장. 다양한 형태의 반복문. 7장. 다양한 형태의 반복문 7-1 반복문이란? 반복문의 기능 세 가지 형태의 반복문 특정 영역을 특정 조건이 만족하는 동안에 반복 실행하기 위한 문장 7-1 반복문이란? 반복문의 기능 특정 영역을 특정 조건이 만족하는 동안에 반복.
Homework #5 (1/3) 다음을 수행한 후, 결과 파일들을 출력하여 제출한다.
Tensorboard in Windows
업체등록신청절차 목차 메인화면 메세지별 유형 2-1. 이미 가입된 공급업체
Homework #3 (1/3) 다음을 수행한 후, 결과 파일들을 출력하여 제출한다.
13. 에러 처리 에러의 종류 에러 탐지 및 보고 단계별 에러 처리.
3장 (2) 구문과 의미론 순천향대학교 컴퓨터공학과 하상호.
동적메모리와 연결 리스트 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
제 4 장 Record.
제 29 강 스트링(string) 다루기 s a i s . s T i h t g r i n.
 6장. SQL 쿼리.
13. 포인터와 배열! 함께 이해하기.
교착 상태 해결 : 교착 상태 탐지 교착 상태 탐지(Deadlock Detection)
7 생성자 함수.
6 객체.
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

6. 구문 분석 (syntax analysis) 6-1. 구문분석 방법 6-2. 구문 분석기의 출력 6-3. Top-down방법 6-4. Botton-up방법

6-1. 구문분석방법 구문분석기 파스트리(parse tree) 구문분석기의 출력으로 생성되는 유도 트리와 같은 모양의 트리 스캐너 파서 중간코드 생성기 원시 프로그램 일련의 토큰 구문 분석 정보 중간 코드

Top-down방식 Bottom-up방식 루트노드로부터 시작하여 단말노드를 생성 좌측유도와 같은 생성규칙 단말 노드로부터 루트 노드를 향하여 위로 생성 우측유도의 역순의 생성규칙

 예제 1. S  XY 2. X  aX 3. X b 4. Y aY 5. Y c S X Y a b c S XY  aXY  abY  abaY  abac 좌파스 = 12345  XaY  Xac  aXac 우파스 = 32541

6-2. 구문 분석기의 출력 구문분석 구문 분석기 주어진 스트링이 정의된 문법에 의해 생성될 수 있는지의 여부를 결정하는 과정으로 올바른 문장에 대해서는 일련의 생성 규칙 번호나 그 문장의 구조를 나타내는 파스 트리 또는 구문 트리를 출력으로 나타낸다. 올바른 문장 : 일련의 생성 규칙 번호, 또는 트리(파스 트리, 구문 트리) 틀린 문장 : 오류 메세지 입력 스트링 구문 분석기  구문분석기의 기능

파스(parse) 유도 과정에서 적용된 일련의 생성 규칙 번호 좌측유도과정에서 생성된 좌파스(left parse)와 우측유도과정에서 생성된 우파스(right parse)  예제 1. E E + T 2. E T 3. T  T*F 4. T  F 5. F  ( E ) 6. F  id (1) 좌측유도과정 (2) 우측 유도 과정 E  E + T (1) E  E + T (1)  T + T (12)  E + F (14)  F + T (124)  E + id (146)  id + T (1246)  T + id (1462)  id + F (12464)  F + id (14624)  id + id (124646)  id + id (146246)  좌파스 = 124646  우파스 = 642641

파스트리(parse tree) 올바른 문장에 대해 구문분석기가 그 문장의 구조를 트리 형태로 나타낸 것 루트노드 : 정의된 문법의 시작 심벌 중간노드 : 각 생성 규칙의 좌측 nonterminal 심벌 단말노드 : 주어진 스트링을 생성하는 terminal 심벌

 예제 1. E  E + E 2. E  E * E 3. E  ( E ) 4. E  -E 5. E  id 1) Top-down방식 E  ( ) + id 2) Bottom-up방식

구문트리(Abstract Syntax Tree) 코드 생성 단계에서 꼭 필요한 의미정보만을 갖는 트리 비단말노드 : 의미있는 생성규칙의 이름 단말노드 : 의미있는 terminal 심벌  예제 1. E  E + T  add 2. E  T 3. T  T * F  mul 4. T  F 5. F  ( E ) 6. F  id add id mul E + T * F 1) 구문트리 2) 파스트리

6-3. Top-down 방법 구문분석과정 (Backtracking : 반복검조) 처음에 시작 심벌의 첫번째 생성 규칙을 적용하여 유도한다. 생성된 문장 형태의 스트링과 입력 스트링을 차례로 비교한다. 비교과정에서 nonterminal이 생성된 스트링에 나오면 이 nonterminal의 첫번째 생성규칙을 적용하여 유도한다. 유도된 스트링과 입력이 같으면 계속 비교해 나간다

비교한 두 심벌이 같지 않으면, 생성 규칙을 잘 못 적용한 것이므로 현재 적용된 생성 규칙을 제거하고 다른 생성규칙을 적용한다 비교한 두 심벌이 같지 않으면, 생성 규칙을 잘 못 적용한 것이므로 현재 적용된 생성 규칙을 제거하고 다른 생성규칙을 적용한다. 이때 입력 심벌의 위치는 제거한 생성규칙에서 보았던 심 벌의 개수 만큼 입력으로 되돌려 보낸다. 이상과 같은 과정을 반복하다가 더 이상 적용할 생성규칙이 없으면 주어진 스트링을 틀린 문장으로 인식하고, 문장 형태에 나 타난 스트링이 주어진 스트링과 같아지면 올바른 문장으로 인식 한다.

예제 S a B ccd A d b () 스트링 accd가 정의된 문법의 올바른 문장임을 확인 1. S  aAd 2. S  aB 3. A  b 4. A  c 5. B  ccd 6. B  ddc S a B ccd A d b ()

left-recursion 무한 loop의 가능성 => right-recursion으로 해결 예제 E + T => E  E + T | T T  T * F | F F  ( E ) | id E + T =>

직접 left-recursion은 생성 규칙이 AA의 형태로 lhs의 nonterminal이 같은 생성 규칙의 rhs의 첫 심벌에 나타날 때 예제 A  A |  A A´ => A= (+ + ) => A = A +  A´A´| = + +  = * = (+ + ) = * A A  A´ A  => right-recursion  A´ A   A´ A   A´  

간접 left-recursion은 유도 과정 중 A => A의 형태를 갖는 경우로 예제 E  E + T | T T  T * F | F F  ( E ) | id => E  TE´ E´  +TE´ |  T  FT´ T´  *FT´ |  간접 left-recursion은 유도 과정 중 A => A의 형태를 갖는 경우로 두 번 이상 유도 과정이 있은 후에 순환이 나타나는 경우 +

간접 left-recursion을 직접 left-recursion으로 변환하는 방법 일정한 순서로 nonterminal을 순서화 생성 규칙에서 lhs보다 순서적으로 앞선nonterminal이 rhs의 첫번째로 나오는 생성 규칙에서 간접 순환이 발생한다. 따라서, 이와 같은 형태의 생성규칙을 대입기법을 통하여 제거한다. 대입 기법을 사용하여 간접 left-recursion을 제거하면 반드시 직접 left-recursion이 나타나게 된다.  예제 S  Aa | b S  Aa | b A  Ac | Sd | e 간접 left-recursion제거 A  Ac | Aad | bd | e A  bdA´ | eA´ A´ cA´ | adA´ | 

Left-factoring LL조건 공통 앞부분(common prefix)을 새로운 nonterminal을 도입하여 인수 분해 해야 한다. 예제 A   |  ==> A  A´ A´   |  S  iCtS | iCtSeS | a C  b ==> S  iCtSS´ | a S´  eS |  LL조건 형식적으로 전개하기 위해 FIRST, FOLLOW등을 이용 이 조건을 만족하는 문법을 LL문법

6-4. Bottom-up방법 Reduce S => 이고 AB의 생성규칙이 존재할 때, 문장 형태  예제 1. S  aAcBe 2. A  Ab 3. A  b 4. B  d (1) reduce sequence abbcde =  aAbcde (reduce 3) =  aAcde (reduce 2) =  aAcBe (reduce 4) =  S (reduce 1) (2) 파스트리 ====> * S A A B a b b c d e

Handle 한 문장 형태에서 reduce되는 부분 S => A => 의 과정이 있을 때, 을 문장형태  의 handle  예제 E  E + E | E * E | ( E ) | id id + id * id E => E + E E => E * E => E + E * E E => E * id => E + E * id E => E + E * id => E + id * id E => E + id * id => id + id * id E => id + id * id 같은 sentential form에서 다른 handle이 존재할 때, 그 Grammar는 ambiguous하다. *

 예제 1. E  E + T 2. E  T 3. T  T * F 4. T  F 5. F  ( E ) 6. F  a (1) 우측 유도 (2) reduce 과정 E => E + T (1) a + a * a =  F + a * a (6) => E + T * F (13) =  T + a * a (64) => E + T * a (136) =  E + a * a (642) => E + F * a (1364) =  E + F * a (6426) => E + a * a (13646) =  E + T * a (64264) => T + a * a (136462) =  E + T * F (642646) => F + a * a (1364624) =  E + T (6426463) => a + a * a (13646246) =  E (64264631)  우파스와 reduce sequence : 64264631

(2) 우파스와 reduce sequence : 64264631 Handle pruning S  r0  r1  …  rn-1  rn  의 우측 유도 과정이 있을 때 각 ri의 문장 형태에서 handle을 찾아 ri-1로 가면서 시작 심벌로 reduce되는 과정  예제 (1) id + id * id 분석과정 (2) 우파스와 reduce sequence : 64264631

Shift-reduce 구문분석 스택의 top부분에 handle이 나타날 때까지 계속해서 shift를 행하며, handle를 찾으면 이 handle에 해당되는 rhs를 갖는 생성 규칙을 결정하여 lhs로 reduce하여 문법의 시작 심벌에 이를 때 까지 반복, 수행하는 구문 분석 과정 123…I …n-1n$ Sn . : $ 출력 Shift-redude 파서 파싱 테이블  그림 6-3 shift-reduce

파싱 스택(parsing stack) Shift행동 Reduce행동 Accept행동 Error행동 문장 형태에서 handle을 찾을 때까지 필요한 문법 심벌들을 유지하고 입력 버퍼는 주어진 스트링을 간직 Shift행동 현재의 입력 심벌을 스택에 옮기는 것 입력포인터를 하나 증가하여 다음 심벌을 가리키도록 하고 현재의 입력 심벌은 스택에 push하는 작업을 의미 Reduce행동 스택 top부분에 있는 handle을 생성규칙의 lhs로 대치하는 것을 의미한다. Accept행동 주어진 스트링이 문법의 올바른 문장인 것을 나타낸다. Error행동 현재 보고 있는 입력 심벌이 그 상태에서 나타날 수 없기 때문에 틀린 문장 이라는 것을 의미

 예제 1. E  E + T 2. E  T 3. T  T * F 4. T  F 5. F  ( E ) 6. F  a (1) reduce 과정 : a + a * a =  F + a * a (6) =  T + a * a (64) =  E + a * a (642) =  E + F * a (6426) =  E + T * a (64264) =  E + T * F (642646) =  E + T (6426463) =  E (64264631)  reduce sequence : 64264631

(2) 구문 분석 과정 $는 end marker이며, 단계 0에서는 스택에 $, 그리고 입력 버퍼에는 파싱 하고자 하는 스트링과 입력의 끝을 나타내는 기호 $ 기호를 넣는다. 이 상태를 초기 상태라 한다. 그리고, 13단계에서, 스택 top에 시작 심벌이 있고 입력은 모두 본 상태를 accept상태라 말한다.

트리 생성 파스트리 구성하는 방법 shift 모든 shift되는 심벌에 대해 단말 노드를 만든다. reduce가 일어날 때마다 AX1X2…Xn A에 해당하는 비단말 노드를 만든다. X1X2…Xn을 A노드의 자노드로 연결한다. 생성규칙이 A인 경우, 단지 A노드만 만든다. accept 현재 구성된 트리를 파스트리로 복귀한다. error 이제까지 구성한 트리가 아무 의미가 없게 된다.

 예제 1. LIST  LIST, ELEMENT 2. LIST  ELEMENT 3. ELEMENT  a (1) 파싱 과정 (2) 파스 트리 7 LIST 3 LIST 2 ELEMENT 6 ELEMENT 1 4 5 a , a

구문트리 구성 방법  예제 (2) 구문트리 build node 의미있는 terminal 심벌을 shift할 때 호출한다. build tree 의미있는 생성 규칙으로 reduce할 때 호출한다.  예제 (1) 파싱과정 (2) 구문트리 8 Id_list a 5 a 1