observe_db

[컴파일러] 8. Lex 본문

학교 공부/컴파일러(3-1)

[컴파일러] 8. Lex

쩡윤 2023. 4. 7. 22:29

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