목차
1장 컴파일러 개론 ... 13
   1.1 프로그래밍 언어 ... 13
   1.2 번역기와 컴파일러 ... 17
   1.3 컴파일러의 일반적 구조 ... 20
   1.4 컴파일러 자동화 도구 ... 28
      1.4.1 어휘 분석기 생성기 ... 29
      1.4.2 파서 생성기 ... 31
      1.4.3 코드 생성의 자동화 ... 32
      1.4.4 컴파일러-컴파일러 시스템 ... 33
   연습문제 ... 37
2장 형식 언어 ... 39
   2.1 언어 ... 39
   2.2 문법 ... 44
   2.3 문법의 종류 ... 56
   연습문제 ... 62
3장 정규 언어 ... 69
   3.1 정규 문법과 정규 언어 ... 69
   3.2 정규 표현 ... 73
   3.3 유한 오토마타 ... 80
      3.3.1 결정적 유한 오토마타 ... 81
      3.3.2 비결정적 유한 오토마타 ... 85
      3.3.3 NFA에서 DFA로의 변환 ... 89
      3.3.4 DFA의 상태수 최소화 ... 98
      3.3.5 유한 오토마타의 닫힘 성질 ... 101
   3.4 정규 언어의 속성 ... 103
      3.4.1 정규 문법과 유한 오토마타 ... 104
      3.4.2 유한 오토마타와 정규 표현 ... 107
      3.4.3 정규 언어의 닫힘 성질 ... 115
      3.4.4 정규 언어에 대한 펌핑 렘마 ... 118
   연습문제 ... 121
4장 어휘 분석 ... 129
   4.1 서론 ... 129
   4.2 토큰 인식 ... 133
      4.2.1 명칭의 인식 ... 133
      4.2.2 정수의 인식 ... 134
      4.2.3 실수의 인식 ... 135
      4.2.4 스트링 상수의 인식 ... 137
      4.2.5 주석의 처리 ... 138
   4.3 어휘 분석기의 구현 ... 140
   4.4 렉스 ... 146
      4.4.1 렉스의 입력 ... 147
      4.4.2 렉스의 정규 표현 ... 149
      4.4.3 렉스의 액션 코드 ... 152
      4.4.4 스캐너의 생성 및 동작 ... 154
   연습문제 ... 159
5장 Context-free 문법 ... 165
   5.1 서론 ... 165
   5.2 유도와 유도 트리 ... 167
      5.2.1 유도 ... 167
      5.2.2 유도 트리 ... 170
      5.2.3 모호성 ... 173
   5.3 문법 변환 ... 177
      5.3.1 필요없는 생성 규칙 제거 ... 178
      5.3.2 ε-생성 규칙 제거 ... 183
      5.3.3 단일 생성 규칙의 제거 ... 185
      5.3.4 문법의 기본적인 형태 ... 188
   5.4 CFG 표기법 ... 190
   5.5 푸시다운 오토마타 ... 202
   5.6 Context-free 언어와 PDA 언어 ... 209
   연습문제 ... 215
6장 구문 분석 ... 225
   6.1 구문 분석 방법 ... 226
   6.2 구문 분석기의 출력 ... 231
      6.2.1 파스 ... 232
      6.2.2 파스 트리 ... 233
      6.2.3 추상 구문 트리 ... 235
   6.3 Top-Down 방법 ... 238
      6.3.1 일반적인 top-down 방법 ... 238
      6.3.2 Left-recursion ... 241
      6.3.3 Left-factoring ... 245
      6.3.4 No-backtracking의 조건 ... 246
   6.4 Bottom-up 방법 ... 247
      6.4.1 Reduce ... 247
      6.4.2 Shift-reduce 구문 분석 ... 251
      6.4.3 트리 생성 ... 253
   연습문제 ... 257
7장 LL 구문 분석 ... 263
   7.1 결정적 구문 분석 ... 264
      7.1.1 FIRST ... 264
      7.1.2 FOLLOW ... 269
      7.1.3 LL 조건 ... 271
   7.2 Reduce-descent 파서 ... 274
   7.3 Predictive 파서 ... 282
   7.4 Predictive 파싱 테이블의 구성 ... 288
   7.5 Strong LL(k) 문법과 LL(k) 문법 ... 293
   연습문제 ... 298
8장 LR 구문 분석 ... 305
   8.1 LR 파서 ... 306
   8.2 LR(O) 아이템의 집합 ... 311
   8.3 SLR 파싱 테이블 구성 방법 ... 319
   8.4 CLR 파싱 테이블 구성 방법 ... 325
   8.5 LALR 파싱 테이블 구성 방법 ... 331
   8.6 모호한 문법 ... 341
      8.6.1 모호한 문법에서 구문 분석 행동의 순위 ... 341
      8.6.2 모호한 문법에서의 구문 분석 ... 344
      8.6.3 YACC에서 모호한 문법의 정의 방법 ... 348
   8.7 LR 파싱 테이블의 구현 ... 349
      8.7.1 ACTION 테이블의 기억 공간 축소 ... 350
      8.7.2 GOTO 테이블의 기억 공간 축소 ... 352
   8.8 구문 분석기의 작성 ... 353
   연습문제 ... 358
9장 중간 언어 ... 367
   9.1 소개 ... 367
   9.2 Polish 표기법 ... 369
   9.3 3-주소 코드 ... 371
   9.4 트리 구조 코드 ... 375
   9.5 가상 기계 코드 ... 381
      9.5.1 P-코드 ... 382
      9.5.2 EM-코드 ... 384
      9.5.3 U-코드 ... 385
      9.5.4 바이트코드 ... 395
   9.6 중간 언어의 선택 ... 398
   연습문제 ... 401
10장 중간 언어의 생성 ... 407
   10.1 소개 ... 407
   10.2 문법-지시적 변환 ... 409
      10.2.1 문법-지시적 변환의 모델 ... 409
      10.2.2 의미 규칙 ... 411
      10.2.3 문법-지시적 변환기의 구현 ... 412
      10.2.4 AST의 구성 ... 415
   10.3 AST의 설계 및 생성 ... 417
      10.3.1 AST의 설계 ... 417
      10.3.2 AST 노드의 구조 ... 422
      10.3.3 AST의 생성 ... 423
   10.4 중간 코드 생성 ... 431
      10.4.1 중간 코드 생성기 ... 432
      10.4.2 선언문 ... 435
      10.4.3 배정문 ... 438
      10.4.4 제어문 ... 443
      10.4.5 프로시저 호출문 ... 450
   10.5 U-코드 번역기 ... 453
   연습문제 ... 457
11장 코드 최적화 ... 461
   11.1 기본 블록 ... 462
   11.2 지역 최적화 ... 467
      11.2.1 공통 부분식의 제거 ... 467
      11.2.2 연산 강도 경감 ... 468
      11.2.3 상수 폴딩과 전파 ... 469
      11.2.4 대수학적 간소화 ... 470
   11.3 루프 최적화 ... 470
      11.3.1 루프 불변 코드 이동 ... 471
      11.3.2 연산 강도 경감 ... 471
      11.3.3 루프 언롤링 ... 473
      11.3.4 루프 융합 ... 473
      11.3.5 영으로의 카운트 ... 474
   11.4 전역 최적화 ... 474
      11.4.1 공통 부분식의 제거 ... 474
      11.4.2 전역 상수 폴딩과 전파 ... 475
      11.4.3 도달될 수 없는 코드의 제거 ... 475
      11.4.4 조건문의 재구성 ... 476
      11.4.5 연속된 GOTO의 축약 ... 476
   11.5 기계 종속적 최적화 ... 477
      11.5.1 중복된 load의 제거 ... 477
      11.5.2 효율적인 명령어 선택 ... 478
      11.5.3 레지스터 할당 ... 479
      11.5.4 연산 순서 ... 480
      11.5.5 핍홀 최적화 ... 480
12장 심벌 테이블 ... 481
   12.1 심벌 테이블의 기능 ... 481
   12.2 심벌 테이블의 내용 ... 482
   12.3 심벌 테이블의 운용 ... 484
   12.4 심벌 테이블의 구성 ... 487
      12.4.1 비정렬된 심벌 테이블 ... 487
      12.4.2 정렬된 심벌 테이블 ... 487
      12.4.3 트리 구조 심벌 테이블 ... 488
      12.4.4 해시 심벌 테이블 ... 490
   12.5 블록 구조 언어에 대한 심벌 테이블 ... 493
      12.5.1 스택 심벌 테이블 ... 494
      12.5.2 스택 구현 트리 구조 심벌 테이블 ... 495
      12.5.3 스택 구현 해시 구조 심벌 테이블 ... 497
13장 에러 처리 ... 499
   13.1 에러의 종류 ... 500
   13.2 에러 탐지 및 보고 ... 502
   13.3 단계별 에러 처리 ... 504
      13.3.1 어휘 분석 단계 에러 ... 505
      13.3.2 구문 단계 에러 ... 507
      13.3.3 의미 에러 ... 515
14장 컴파일러 자동화 도구 ... 517
   14.1 스캐너 생성기 ... 518
   14.2 파서 생성기 ... 521
      14.2.1 YACC ... 522
      14.2.2 스탠포드 파서 제작 시스템 ... 532
      14.2.3 위스콘신 파서 제작 시스템 ... 536
   14.3 코드 생성의 자동화 ... 539
      14.3.1 해석적 코드 생성 ... 540
      14.3.2 패턴 매칭 코드 생성 ... 542
      14.3.3 테이블을 이용한 코드 생성 ... 543
   14.4 컴파일러-컴파일러 시스템 ... 545
      14.4.1 PQCC ... 545
      14.4.2 ACK ... 546
   연습문제 ... 558
부록A 미니파스칼 ... 563
   A.1 소개 ... 563
   A.2 어휘 구조 ... 564
   A.3 구문 구조 ... 565
   A.4 예제 프로그램 ... 566
   A.5 문법 형태 ... 569
부록B U-코드 인터프리터 ... 572
참고 문헌 ... 592
찾아보기 ... 599
닫기