lex와 yacc
『lex와 yacc』는 두 가지 중요한 유닉스 프로그래밍 도구인 렉스와 야크를 완전하게 다루고 있는 유일한 책이다. 렉스와 야크는 주로 컴파일러나 인터프리터 개발자가 사용하는 도구이지만, 효율적인 입력 처리와 구문 분석 및 파싱을 원하는 모든 응용프로그래머 또한 유용하게 사용할 수 있다. 특히, 그동안 입력을 분석, 검사, 변환하는 엔진을 별도로 개발해오던 프로그래머들은 이 책을 통해 막강한 두 도구에 대한 사용법과 수반 내용을 철저히 익힘으로써, 까다롭고 세부적인 부분에 신경쓸 필요 없이 간결하고 명확하게 개발할 수 있게 될 것이다.
개정판에서는 전체적으로 내용을 크게 개정하였으며, 예제들 또한 새롭게 추가하고 확장하였다. 추가적으로 4장과 5장을 메뉴 컴파일러와 SQL 문법을 구현하는 데 할애하여, 경험 많은 프로그래머들도 유용한 기법을 얻을 수 있도록 하였다. 부록에서는 렉스와 야크에 대한 명쾌한 레퍼런스와 다양한 오류 해결법을 제공하며, 유닉스와 MS-DOS에서 사용할 수 있는 주요 버전에 대해 다룬다.
1장. 렉스와 야크
가장 간단한 렉스 프로그램
렉스 이용한 단어 인식
기호 테이블
문법
파서와 렉서의 의사 소통
언어 요소 분석기
야크 파서
규칙절
렉스와 야크의 실행
렉스와 손수 작성한 렉서의 비교
연습 문제
2장. 렉스 이용하기
정규 표현식
정규 표현식의 예
단어 세기 프로그램
명령행 파싱
시작 상태
C 소스 코드 분석기
요약
연습 문제
3장. 야크 이용하기
문법
재귀 규칙
이동/감소 파싱
야크에서 파싱할 수 없는 문법
야크 파서
정의절
규칙절
기호 값과 동작
렉서
간단한 파서 컴파일 및 실행
산술 표현식과 모호성
우선 순위 규칙을 사용하지 말아야 할 때
변수와 타입을 갖는 토큰
기호 값과 %union
기호 테이블
함수와 예약어
기호 테이블의 예약어
교환 가능한 함수와 변수명
Make를 이용한 파서 구축
요약
연습 문제
4장. 메뉴 생성 언어
MGL 개요
MGL 개발
MGL 구축
초기화
화면 처리
종료
샘플 MGL 코드
연습문제
5장. SQL 파싱
SQL 개요
관계형 데이터베이스
관계의 구성
SQL을 사용하는 세 가지 방법
구문 검사기
렉서
에러와 메인 루틴
파서
정의
최상위 규칙
스키마 서브-언어
모듈 서브-언어
조작 서브-언어
잡동사니
구문 검사기의 사용
임베디드 SQL
렉서에 가한 변경
파서에 가한 변경
보조 루틴
전처리기 이용하기
연습문제
6장. 렉스 명세서 참조
렉스 명세서의 구조
정의절
규칙절
사용자 서브루틴
BEGIN
버그
모호한 미리 보기
AT&T 렉스
플렉스
문자 변환
컨텍스트 감지
왼쪽 컨텍스트
오른쪽 컨텍스트
정의 (대체)
ECHO
Include 연산 (파일의 논리적 포함)
yywrap( )을 이용한 파일 체인
파일 포함 구조
문자열에서 읽어들이는 입력
AT&T 렉스
플렉스
아브락사스 피시렉스
MKS 렉스
POSIX 렉스
input( )
내부 테이블(%N 선언)
렉스 라이브러리
main( )
다른 라이브러리 루틴
행 번호와 yylineno
리터럴 블록
한 프로그램에 존재하는 여러 개의 렉서
결합된 렉서
여러 개의 렉서
output( )
렉서가 생성한 렉서의 이식성
렉스 명세서 이식
생성된 C 렉서 이식
정규 표현식 구문
메타 문자
POSIX 확장
REJECT
yylex( )에서 값 리턴하기
시작 상태
unput( )
yyinput( ), yyoutput( ), yyunput( )
yyleng
yyless( )
yylex( )
yylex( ) 안의 사용자 코드
yymore( )
yytext
yytext 확장
yywrap( )
7장. 야크 문법 참조
야크 문법의 구조
기호
정의절
규칙절
사용자 서브루틴절
동작
규칙에 내장된 동작
내장 동작을 위한 기호 타입
사라져가는 기능
모호성과 충돌
충돌의 타입
야크에 존재하는 버그
실제 버그
무한 재귀
실제 버그가 아닌 것
끝 표시기
에러 토큰과 에러 복구
%ident 선언
상속된 속성 ($0)
상속된 속성을 위한 기호 타입
렉서의 피드백
리터럴 블록
리터럴 토큰
야크 파서의 이식성
야크 문법 이식
생성된 C 파서 이식
우선 순위, 결합 법칙 그리고 연산자 선언
우선 순위와 결합 법칙
연산자 선언
우선 순위와 결합 법칙 이용한 충돌 해소
우선 순위의 전형적인 이용
재귀 규칙
왼쪽과 오른쪽 재귀
규칙
특수 문자
시작 선언
기호 값
기호 타입 선언
계산기 예제
명시적인 기호 타입
토큰
토큰 번호
토큰 값
%type 선언
%union 선언
여러 가지 다른 문법들
결합된 파서
여러 개의 파서
재귀적인 파싱
여러 개의 파서를 위한 렉서
y.output 파일
야크 라이브러리
main( )
yyerror( )
YYABORT
YYACCEPT
YYBACKUP
yyclearin
yydebug와 YYDEBUG
YYDEBUG
yydebug
yyerrok
YYERROR
yyerror( )
yyparse( )
YYRECOVERING( )
8장. 모호성과 충돌
포인터 모델과 충돌
충돌의 타입
파서 상태
y.output의 내용
y.output 안의 충돌 재검토
충돌의 흔한 예
표현식 문법
IF-THEN-ELSE
중첩 리스트 문법
충돌 해결 방법
IF-THEN-ELSE (이동/감소)
루프 안에 있는 루프 (이동/감소)
표현식의 우선 순위 (이동/감소)
제한된 미리 보기 (이동/감소 혹은 감소/감소)
선택 사항의 중복 (감소/감소)
요약
연습 문제
9장. 에러 보고와 복구
에러 보고
더 나은 렉스 에러 보고
에러 복구
야크 에러 복구
에러 토큰의 위치
컴파일러 에러 복구
연습 문제
부록 A. AT&T 렉스
부록 B. AT&T 야크
부록 C. 버클리 야크
부록 D. GNU 바이손
부록 E. 플렉스
부록 F. MKS 렉스와 야크
부록 G. 아브락사스 렉스와 야크
부록 H. POSIX 렉스와 야크
부록 I. MGL 컴파일러 코드
부록 J. SQL 파서 코드