맨위로가기

Lex

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

Lex는 마이크 레스크와 에릭 슈미트가 개발한 어휘 분석기 생성기로, 유닉스 및 유닉스 계열 운영 체제에서 표준으로 사용되었다. Lex는 정규 표현식을 기반으로 입력 텍스트를 분석하여 토큰을 식별하며, Yacc과 같은 파서 생성기와 함께 사용되어 컴파일러나 인터프리터 개발에 활용된다. Lex 파일은 정의, 규칙, C 코드의 세 섹션으로 구성되며, flex가 Lex의 기능을 개선한 오픈 소스 버전으로 제공된다.

더 읽어볼만한 페이지

  • 유한 상태 기계 - 정규 언어
    정규 언어는 주어진 알파벳으로 구성된 문자열 집합으로, 클레이니 스타, 합집합, 문자열 연결 연산을 통해 확장되며, 정규 표현식, 유한 상태 기계 등으로 표현 가능하다.
  • 유한 상태 기계 - Flex (어휘분석기)
    Flex는 C 언어로 작성되어 텍스트를 토큰화하는 어휘 분석기 생성기로, 정규 표현식 기반의 결정적 유한 오토마타를 사용하여 프로그래밍 언어의 구문 분석 및 컴파일러 개발에 활용되며 자유 소프트웨어 라이선스 하에 배포된다.
  • 구문 분석기 - ANTLR
    ANTLR은 EBNF로 표현된 문법을 입력받아 렉서, 파서, 트리 파서 등 다양한 언어 인식기 소스 코드를 생성하는 파서 생성기이며, C#, Java, Python 등 여러 언어를 지원하고 깃허브에 다양한 문법이 공개되어 있다.
  • 구문 분석기 - GNU bison
    GNU Bison은 Yacc와 호환되면서 재진입성, 다양한 언어 코드 생성, 자동 반례 생성 등의 기능을 제공하는 파서 생성기로, 여러 프로젝트에서 Yacc를 대체하여 널리 사용되고 있으며, Bison으로 생성된 코드는 GPL과 호환되는 라이선스로 배포 가능하다.
  • 컴파일 도구 - Libtool
    Libtool은 다양한 유닉스 계열 운영 체제에서 정적 및 동적 라이브러리 생성을 관리하고, 운영 체제별 차이로 인한 소프트웨어 이식 문제를 해결하기 위해 GNU 빌드 시스템에서 사용되는 도구이다.
  • 컴파일 도구 - GNU 빌드 시스템
    GNU 빌드 시스템은 Autoconf, Automake, Libtool 등의 오토툴과 GNU make 등으로 구성되어 다양한 UNIX 시스템에서 소프트웨어 빌드 및 설치를 지원하지만, 복잡성과 이식성에 대한 비판도 존재한다.
Lex - [IT 관련 정보]에 관한 문서
개요
'프로그램의 구조를 보여주는 다이어그램. 입력 스트림은 렉스에 의해 처리되고, 렉스는 C 언어로 렉서 파일을 생성한다. 렉서 파일은 C 컴파일러에 의해 컴파일되어 실행 가능한 렉서가 된다. 렉서는 입력 스트림을 토큰으로 분석한다.'

2. 역사

1975년, 마이크 레스크(Mike Lesk)와 에릭 슈미트(Eric Schmidt)가 Lex를 개발했다.[5][6][7] 이후 Lex는 많은 유닉스 및 유닉스 계열 운영 체제에서 표준 어휘 분석기 생성기로 자리 잡았다. 1983년에는 벨 연구소 라이선스 하에 찰스 리버 데이터 시스템(Charles River Data Systems)의 UNOS 운영 체제에서 사용할 수 있는 여러 유닉스 도구 중 하나였다.[8]

원래는 독점 소프트웨어로 배포되었지만, 현재 Lex의 일부 버전은 오픈 소스 소프트웨어이다. 원래 독점 코드를 기반으로 한 Lex의 오픈 소스 버전은 현재 OpenSolaris 및 Plan 9 from Bell Labs와 같은 오픈 소스 운영 체제와 함께 배포된다. flex (fast lexical analyzer)는 Lex와 유사한 기능을 제공하는 오픈 소스 도구이지만, BSD 라이선스를 따르며 Lex와는 별개의 개발자에 의해 개발된 다른 소프트웨어이다.

3. Lex 파일 구조

Lex 파일은 `%%` 기호로 구분되는 세 개의 섹션으로 구성된다. 이러한 구조는 Yacc 파일 구조와 유사하다.

각 섹션은 다음과 같다.


  • '''정의 섹션''': 매크로를 정의하고 C로 작성된 헤더 파일을 가져온다.
  • '''규칙 섹션''': 정규 표현식 패턴을 C 과 연결한다.
  • '''C 코드 섹션''': C 문과 함수가 포함된다.

3. 1. 정의 섹션

Lex의 파일 구조는 의도적으로 Yacc의 파일 구조와 유사하게 정의되어 있으며, 세 부분으로 나뉜다. 각 부분은 두 개의 퍼센트 기호(%%)로 구분된다.[1]

영역설명
정의 영역정규 표현식을 사용하여 매크로를 정의하고, C 코드로 작성된 헤더 파일을 가져온다. 생성된 소스 파일에 그대로 복사될 C 코드를 작성할 수 있다.
규칙 영역C 명령과의 연관을 수행한다. Lex의 규칙과 일치하는 패턴이 있으면, 그와 관련된 C 코드를 실행한다.
C 코드 영역생성된 소스에 그대로 복사될 C 명령이나 함수가 포함되어 있다. 이러한 명령은 규칙 영역의 규칙에 의해 호출된 코드를 포함하는 경우도 있다. 대규모 프로그램에서는 여기에 분할해 두고 컴파일 시에 링크하는 것이 편리하다.


3. 2. 규칙 섹션

규칙 섹션은 가장 중요한 영역으로, 정규 표현식 패턴과 C 코드를 연결한다. 렉서가 입력에서 주어진 패턴과 일치하는 텍스트를 감지하면, 연관된 C 코드를 실행한다.[1]

아래는 예시이다.

```text

[0-9]+ {

/* yytext는 일치하는 텍스트를 포함하는 문자열이다. */

printf("정수를 발견했습니다: %s\n", yytext);

}

.|\n { /* 다른 모든 문자는 무시한다. */ }

```

위의 예시에서 `[0-9]+`는 하나 이상의 숫자로 구성된 문자열과 일치하는 정규 표현식이다. 렉서가 이러한 패턴과 일치하는 텍스트를 발견하면, `yytext` 변수에 저장된 텍스트와 함께 `printf` 함수를 실행한다.[1]

3. 3. C 코드 섹션

C 코드 섹션에는 생성된 소스에 그대로 복사될 C 문이나 함수가 포함되어 있다. 이러한 명령은 규칙 섹션의 규칙에 의해 호출된 코드를 포함하는 경우도 있다. 대규모 프로그램에서는 C 코드 부분을 분할해 두고 컴파일 시에 링크하는 것이 편리하다.

4. Lex의 정규 표현식

Lex에서 사용되는 정규 표현식은 일반적인 정규 표현식 문법에 몇 가지 특수한 문자가 추가된 형태이다.


  • 행의 시작 부분에 있는 `%`는 영역을 구분하거나 Lex 특유의 지시를 나타내는 데 사용된다.[1]
  • 문자 클래스나 부정 문자 클래스 내에서는 `\`가 특수 문자로 사용된다.[1]
  • `{`와 `}`는 정의 영역에서 정의된 매크로를 사용하는 데 사용된다.[1]
  • `<` 시작 조건 `>` 정규 표현식을 통해 특정 조건에서만 패턴이 일치하도록 할 수 있다.[1]
  • `r/s`는 정규 표현식 `s`가 뒤따르는 정규 표현식 `r`을 나타낸다.[1]

5. Lex와 다른 도구의 연동

Lex는 Yacc 또는 Bison과 같은 파서 생성기와 함께 사용되어 더 복잡한 언어를 인식할 수 있게 한다. 파서 생성기는 형식 문법을 사용하여 입력 스트림을 구문 분석한다. Yacc로 생성된 파서는 문자 스트림을 직접 처리하는 대신, 토큰 스트림을 입력으로 받는 것이 일반적이다. 렉스는 이러한 토큰 스트림을 생성하는 데 사용된다.

Yacc와 렉스는 매우 유사한 문법 정의를 가지며, 함께 사용되는 경우가 많다. 렉스와 Yacc의 기능은 IEEE POSIX 1003.1-2008 (과거에는 1003.2)에서 표준화되어 있다.

make는 Lex를 포함하는 프로그램을 유지 관리하는 데 사용할 수 있는 유틸리티이다. Make는 확장자가 `.l`인 파일이 Lex 소스 파일이라고 가정한다. make 내부 매크로 `LFLAGS`를 사용하여 make에서 자동으로 호출할 Lex 옵션을 지정할 수 있다.[9]

5. 1. 파서 생성기와의 연동

렉스는 Yacc 또는 Bison과 같은 파서 생성기와 함께 사용되어 더 복잡한 언어를 인식할 수 있게 한다. 파서 생성기는 형식 문법을 사용하여 입력 스트림을 구문 분석한다. 예를 들어 Yacc로 생성된 파서가 문자 스트림을 직접 처리하는 대신, 토큰 스트림을 입력으로 받는 것이 일반적이다. 렉스는 이러한 토큰 스트림을 생성하는 데 사용된다.

Yacc와 렉스는 매우 유사한 문법 정의를 가지며, 함께 사용되는 경우가 많다. 렉스와 Yacc의 기능은 IEEE POSIX 1003.1-2008 (과거에는 1003.2)에서 표준화되어 있다.

5. 2. Make와의 연동

make는 Lex를 포함하는 프로그램을 유지 관리하는 데 사용할 수 있는 유틸리티이다. Make는 확장자가 `.l`인 파일이 Lex 소스 파일이라고 가정한다. make 내부 매크로 `LFLAGS`를 사용하여 make에서 자동으로 호출할 Lex 옵션을 지정할 수 있다.[9]

6. Lex 파일의 예

c

/* 정의 섹션 */

%{

/* 그대로 복사할 C 코드 */

#include

%}

/* flex가 하나의 입력 파일만 읽도록 지시합니다. */

%option noyywrap

%%

/* 규칙 섹션 */

/* [0-9]+는 하나 이상의 숫자로 구성된 문자열과 일치합니다. */

[0-9]+ {

/* yytext는 일치하는 텍스트를 포함하는 문자열입니다. */

printf("정수를 발견했습니다: %s\n", yytext);

}

.|\n { /* 다른 모든 문자를 무시합니다. */ }

%%

/* C 코드 섹션 */

int main(void)

{

/* 렉서를 호출한 다음 종료합니다. */

yylex();

return 0;

}

```

이 코드를 `flex`에 입력하면 `lex.yy.c`라는 C 파일로 변환된다. 이 파일은 정수 문자열을 인식하여 출력하는 실행 파일로 컴파일할 수 있다. 예를 들어 다음과 같이 입력하면:

abc123z.!&*2gj6

프로그램은 다음과 같이 출력한다.



Saw an integer: 123

Saw an integer: 2

Saw an integer: 6


참조

[1] 서적 lex & yacc https://archive.org/[...] O'Reilly
[2] 서적 flex & bison http://oreilly.com/c[...] O'Reilly Media 2009-08
[3] 간행물 The Open Group Base Specifications Issue 7, 2018 edition § Shell & Utilities § Utilities § lex https://pubs.opengro[...]
[4] 서적 Lex & Yacc https://archive.org/[...] O'Reilly 1992
[5] 웹사이트 Lex – A Lexical Analyzer Generator http://dinosaur.comp[...] 2010-08-16
[6] 웹사이트 Lex – A Lexical Analyzer Generator http://epaperpress.c[...] bell-labs.com 2011-12-20
[7] 논문 Lex – A Lexical Analyzer Generator Bell Laboratories 1975-10
[8] 서적 The Insider's Guide To The Universe https://www.1000bit.[...] Charles River Data Systems, Inc.
[9] 논문 make http://www.opengroup[...] The IEEE and The Open Group
[10] 웹사이트 POSIX 1003.1-2008 http://standards.iee[...]
[11] 문서 Theory of Compilation -- JLex, CUP tools -- http://cs.haifa.ac.i[...]
[12] 웹사이트 Flex The Lexical Scanner Generator http://ipr20.cs.ehim[...]



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com