본문 바로가기

23년 2학기 학교공부/컴파일러개론

(25)
[CP] 3-addr Code Translation 규칙 * 여러가지 중간코드 중 3-addr Code로 바꾸는 걸 보자. HIR code가 C코드 혹은 상위언어코드 혹은 AST 등으로 생각할 수 있고, 이걸 LIR 즉 3-addr 코드같은걸로 바꿀땐 nested 구조때문에 필연적으로 한 줄의 HIR 코드가 여러줄의 LIR 코드로 바뀐다. 이렇게 여러줄로 바뀔때 중간중간 임시변수를 정의하고 가져다 쓰는 형태로 바뀐다. 이때 여러줄로 바뀔 때 규칙이 있음.컴파일러가 하는 일. 그 방법에 대해 알아보자. 빨간글씨가 notation. 연산. 속에 들어가는 e는 하이레벨코드가 하나이상 섞여있는 코드.이게 [[ ]]를 만나면 LIR expression이 나온다. t = [[e]]에서 e가 어떤 표현식. 마지막 결과값을 t에 저장하자. t가 임시변수. t = [[v]]에..
[CP] Stack Machine Code, Tree Code 2023학년도 2학기 충남대학교 조은선 교수님의 컴파일러개론 수업 정리자료입니다. 📁 가상 기계 코드 (Bytecode, MSIL) * 컴파일러는 전반부와 후반부로 나뉨. 전반부가 끝나면 중간코드가 나오고, 중간코드가 후반부를 거쳐서 타겟 머신 코드로 바뀐다. 전반부는 주로 하이레벨 언어에만 관련이 있고, 후반부는 주로 머신코드와 관계가 되어있다. 그래서 IR을 잘 정의해야함. 이렇게 잘 나눠놓고 후반부를 interpreter로 만드는 경우가 있다. 이렇게 interpreter로 만들면 그거 자체가 가짜 기계가 되고, 중간코드는 인터프리터 위에서 실행되는 구조. 이런 구조에서 사용되는 머신이 스택머신인 경우가 많고, IR이 스택머신 위에서 돌아가는 스택머신인 경우가 많음. 왜 후반부를 거쳐서 머신코드까지..
[CP] 3-Addr Code 2023학년도 2학기 충남대학교 조은선 교수님의 컴파일러개론 수업 정리자료입니다. 📁 N-tuple, 3-주소 코드(Quadruple) N-tuple은 보통 quadruple(4-tuple)을 많이 사용하는데, quadruple은 피연산자 두개와 결과값을 위해 memory address가 3개 필요하다. 때문에 이를 3-address code(3-주소 코드)라고도 부른다. 3-addr코드는 OP에 단 하나의 연산자가 와야한다는 점과, 기계어가 가지는 피연산자 및 주소의 개수가 3개 미만이라는 점에서 C코드와 비슷하다. 때문에 -e나 b+c와 같은 코드도 3-addr code로 표현이 가능하다. 하지만 C언어와 같은 하이레벨 코드는 a = (b+c) * (-e)처럼 한번에 연산자가 많이 나올 수 있어서, ..
[CP] Intermediate Representation(IR) 2023학년도 2학기 충남대학교 조은선 교수님의 컴파일러개론 수업 정리자료입니다. 📁 Intermediate Representation(IR) 중간언어(Intermediate Representation, IR)은 하이레벨 언어부터 로우레벨 언어까지의 컴파일 과정 사이에 위치하는 중간 레벨의 언어를 말한다. 대부분의 컴파일러가 중간언어를 사용한다. 전체적인 컴파일 과정을 살펴보면, 자바, C, C++과 같은 하이레벨 언어 코드를 입력으로 받아서, 중간에 파란 글씨로 표시된 IR을 거쳐 로우레벨 언어로 변환된다. 이때 거치는 중간 언어는 여러개일 수 있으며, 이런 경우 multiple IR이라고 부른다. multiple IR 내에서 상대적으로 하이레벨에 가까운 IR을 High level IR(HIR), 로우..
[CP] Abstract Syntax Tree(AST) 2023학년도 2학기 충남대학교 조은선 교수님의 컴파일러개론 수업 정리자료입니다. 📁 Parse Tree Parse Tree(파스트리)란 유도과정을 트리로 나타낸 것을 말한다. terminal이 leaf노드, non-terminal이 중간노드를 이루며, 좌측 유도인지 우측 유도인지는 파스트리에 표현되지 않는다. 📁 Abstract Syntax Tree(AST) Abstact Syntax Tree(AST)란 파스트리에서 불필요한 정보를 제거한 트리 형태의 자료구조를 말한다. abstract class Expr{} class Add extends Expr { Expr left, right; Add(Expr L, Expr R) { left=L; right=R; } } class Num extends Expr ..
[CP] Syntax-Directed Definition(SDD) 2023학년도 2학기 충남대학교 조은선 교수님의 컴파일러개론 수업 정리자료입니다. 📁 Semantic Analysis(의미 분석) 이전 처리 컴파일은 어휘분석, 구문분석, 의미분석 순으로 이루어진다. 이때 구문분석의 결과 parsing tree를 얻을 수 있는데, 이렇게 얻은 parsing tree로 바로 의미분석을 진행할 것인지, 몇가지 처리를 한 후 의미분석을 진행할 것인지 선택할 수 있다. 이때 의미 분석 전에 이루어지는 처리과정에서 사용되는 중요한 도구에는 Syntax-Directed Definition/Translation(SDD/SDT)와 Abstract Syntax Tree (AST)가 있다. 📁 Syntax-Directed Definition (SDD) Syntax-Directed Defi..
[CP] LR(0) 파싱테이블 📁 LR Parsing : 파서 상태 파서는 파싱테이블을 보고 – 현재 상태, 입력 심벌을 보고 shift 할지 reduce 할지 결정하고 (action) – 파서 상태도 변경시킴 (goto) 📁 LR 파싱 테이블 LR(0)이란, LOOKAHEAD 없이 shift-reduce 형태로 파싱하는 것을 말한다. LR(0)에서 사용되는 파싱 테이블을 만드는 절차는 다음과 같다. 1. LR(0) 아이템과 Closure 등을 이용하여 파서 상태가 될 만한 것들이 무엇인지 정한다. 2. GOTO를 이용하여 각 파서 상태들 간의 상태 전이도(DFA : Deterministic Finite Automata)를 만든다. 3. 위 결과를 파싱 테이블에 담아낸다. 📁 LR(0) 아이템 LR(0) 아이템이란, RHS에 점('...
[CP] 구문분석 도구 : Yacc 📁 Yacc Yacc은 Yet Another Compiler Compiler의 약자로, LALR 파서 생성기이다. Lex와 함께 사용되는 유용한 도구이며, Confilxt 발생 시 대처하는 손쉬운 방법을 제공한다. Lex와 함께 AT&T Bell Lab.에서 70년대 유닉스 운영체제 용으로 개발되어, 유닉스 표준으로 채택되었지만 최근에는 GNU Flex/Bison을 더 많이 사용하고 있다. .y 파일 형태는 lex, flex 파일과 동일하며 다음과 같다. 예를 들어 Example.y 라는 파일이 있다고 가정할 때, 내부 형태는 다음과 같다. 📁 LR Conflict 모호한 문법은 파싱 테이블에 shift-reduce 나 reduce-reduce conflict를 야기한다. 이러한 conflict는 우선순..