일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- NLP
- 애자일
- 랩실일기
- 파싱테이블
- 정보검색
- 소프트웨어공학
- 데이터분석
- OS
- 스케줄러
- 객체지향설계
- 웹소프트웨어
- 가상메모리
- 벡터
- Linear Algebra
- 언어모델
- DB
- 오픈소스웹소프트웨어
- 파싱
- React
- 836
- 자연어처리
- css
- 클래스
- C언어
- 컴파일
- 데이터베이스
- 프로세스
- 컴파일러
- 운영체제
- Agile
Archives
- Today
- Total
observe_db
[컴파일러] 8. Lex 본문
4/7
Lex(A Lexical Analyzer Generator)
입력된 정규표현과 명령을 프로그램 언어로 변환
yylex 함수는 입력 문자열에서 정규표현을 인식하고 발견된 각 정규표현에 해당되는 특정 명령들을 실행한다.
[1]
소스 형식(*.l)
definition //정의
%%
rules //규칙
%% //이하 생략 가능
user routines // 사용자 부 프로그램
- definitions: 선언부+ 마크로 정의
- 선언부
- %{ }% 사이의 코드
- Lex에 의해 아무 처리 없이 lex.yy.c의 앞부분에 복사
- 매크로 정의
- Lex 규칙의 정규 표현에 사용할 표현을 미리 정의(간단하게)
- 중괄호 안에 매크로 정의 포함하여 사용.
- 규칙(rules)
- 문법 규칙을 표현
- 규칙에 대해 처리해야 할 명령어 나열
- rules ::= 정규표현 + 명령
- 사용자 부프로그램(user routines)
- 규칙의 명령에서 사용되는 부프로그램들의 집합 정의
- Lex의 출력 후, lex.yy.c 끝부분에 복사된다.
Lex 정규 표현 ::= text characters + operator characters
- text characters: 비교되고 있는 문자열에서 상응하는 characters아 매치.(알파벳과 숫자)
- operator character: 정규 표현 연산자.
- 쌍따옴표 " : 사이에 있는 모든 문자를 텍스트 문자로 취급
- 백슬래쉬 \ : 한개의 문자를 escape
- [] : 문자들의 종류
- -(대쉬): 범위를 표시
- ^(햇): 부정이나 여집합
- \(백슬래쉬): 8진법의 escape처럼 문자 escape
- .(점): 개행을 제외한 모든 문자들을 나타낸다.
- ?: 선택을 의미
- *, + : 반복 표현(*은 0번 이상, +는 1번 이상)
- | : 하나의 선택을 의미(OR)
- ^ : 라인의 시작에서만 인식
- $: 라인의 끝에서만 인식
- /: 접미 문맥을 명시할 때 사용
- <>: 시작 상태 표시(left context sensitivity)
- {}: 정의된 이름 확장(정의된 이름을 정규표현에서 쓸 때)
Lex actions
- 정규 표현에 일치되는 문자열, 토큰이 인식되었을 때 실행할 행동
- default action: 인식되지 않은 문자에 대해 입력을 그대로 출력
- null action: 입력을 무시하고 싶을 경우 ex) 구분자로 사용되는 공백, 탭, 개행에 대해
- |(alternation): 동일한 액션 코드의 반복 표기 생략.
사용할 수 있는 변수 및 함수
- yytext: 정규표현과 매칭된 실제 문자열
- yyleng: 매칭된 문자열의 길이를 나타내는 변수
- ECHO: 출력에 매칭된 문자열 출력 (== printf("%s", yytext)
- yymore: 현재 매칭된 문자열 끝에 다음에 인식된 문자열이 덧붙여지게 하는 함수(if-else 문)
- yyless(n): n개의 문자만 yytext에 남기고 나머지는 입력 스트림으로 되돌리는 함수
- I/O routines
- input(): 입력 스트림으로부터 다음 문자를 읽음.
- output(c): 출력 스트림으로 문자 c를 내보냄
- unput(c): 다시 처리될 수 있도록 문자 c를 입력 스트림으로 되돌려 보내는 기능을 하는 함수, input()에 의해 다시 읽혀진다.
- yywrap(): Lex가 입력파일에 끝에 도달할 때 요청된다.(혹시 마무리할 것 있는지 확인)\
규칙 모호성: 하나의 문자열이 여러 개 규칙에 적용될 경우
=> 가장 길게 인식할 수 있는 정규표현을 우선, 먼저 기술된 정규 표현 우선
기본 동작원칙은 가능한 모든 match를 찾는 것이 아니라, 입력 스트림을 분할하는 것임을 명심. 각 문자는 한 번만 처리한다.
[1] yy가 들어가는 이유는, 사람들이 절대 안쓸 것 같기 때문이다. 사용시 변수명에 yy 쓰지 않게 주의하자.
'학교 공부 > 컴파일러(3-1)' 카테고리의 다른 글
[컴파일러] Lex 실습 (0) | 2023.04.14 |
---|---|
[컴파일러] 9. Yacc (0) | 2023.04.14 |
[컴파일러] 5. 어휘분석 (0) | 2023.03.30 |
[컴파일러] 4. LR 파서 (0) | 2023.03.24 |
[컴파일러] 3. 예측 파서 (0) | 2023.03.16 |
Comments