Lex는 어휘 분석기 ("스캐너" 또는 "렉서")를 생성하는 컴퓨터 프로그램입니다.
Lex는 공통적으로 yacc 파서 생성기와 함께 사용됩니다. 원래 Mike Lesk와 Eric Schmidt에 의해 작성되고, 1975년에 설명된 Lex는 많은 유닉스 시스템의 표준 어휘 분석기 생성기이고, 동등한 도구가 POSIX 표준의 일부로 지정됩니다.
Lex는 어휘 분석기를 지정하는 입력 스트림을 읽고 C 프로그래밍 언어에서 어휘 분석기를 구현하는 소스 코드를 작성합니다.
C 외에도, Lex의 일부 이전 버전은 Ratfor에서 렉서를 생성할 수도 있습니다.
Open source
비록 원래 독점 소프트웨어로 배포되었지만, Lex의 일부 버전은 이제 오픈-소스입니다. 원래 독점 코드를 기반으로 하는 Lex의 오픈 소스 버전은 이제 OpenSolaris와 Bell Labs로부터 Plan 9와 같은 오픈-소스 운영 시스템과 함께 배포됩니다. flex, 또는 "빠른 어휘 분석기"라고 하는 Lex의 인기 있는 오픈-소스 버전은 독점 코딩에서 파생된 것이 아닙니다.
Structure of a Lex file
Lex 파일의 구조는 의도적으로 yacc 파일의 구조와 유사합니다: 파일은 다음과 같이 2개의 퍼센트 기호만 포함하는 행으로 구분된 세 섹션으로 나뉩니다:
- 정의 섹션은 매크로를 정의하고 C로 작성된 헤더 파일을 가져옵니다. 그것은 역시 여기에 임의의 C 코드를 작성하는 것도 가능하며, 생성된 소스 파일에 그대로 복사될 것입니다.
- 규칙 섹션은 정규 표현식 패턴을 C 명령문과 연결합니다. 렉서는 입력에서 주어진 패턴과 일치하는 텍스트를 볼 때, 그것은 관련 C 코드를 실행할 것입니다.
- C 코드 섹션은 생성된 소스 파일에 그대로 복사되는 C 명령문과 함수를 포함합니다. 이들 명령문은 아마도 규칙 섹션에서 규칙에 의해 호출되는 코드를 포함하고 있을 것입니다. 큰 프로그램에서, 이 코드를 컴파일 시간에 링크된 별도의 파일에 배치하는 것이 더 편리합니다.
Example of a Lex file
다음은 Lex의 flex 버전에 대해 Lex 파일의 예제입니다. 그것은 입력에서 숫자 (양의 정수)의 문자열을 인식하고, 그것들을 간단히 인쇄합니다.
/*** Definition section ***/
%{
/* C code to be copied verbatim */
#include <stdio.h>
%}
/* This tells flex to read only one input file */
%option noyywrap
%%
/*** Rules section ***/
/* [0-9]+ matches a string of one or more digits */
[0-9]+ {
/* yytext is a string containing the matched text. */
printf("Saw an integer: %s\n", yytext);
}
.|\n { /* Ignore all other characters. */ }
%%
/*** C Code section ***/
int main(void)
{
/* Call the lexer, then quit. */
yylex();
return 0;
}
만약 이 입력이 flex에 주어지면, 그것은 C 파일, lex.yy.c로 변환될 것입니다. 이것은 정수 문자열과 일치하고 출력하는 실행 파일로 컴파일될 수 있습니다. 예를 들어, 다음과 같은 입력이 주어지면:
abc123z.!&*2gj6
그 프로그램은 다음을 인쇄할 것입니다:
Saw an integer: 123
Saw an integer: 2
Saw an integer: 6
Using Lex with other programming tools
Using Lex with parser generators
Yacc 또는 Bison과 같은, Lex 및 파서 생성기는 공통적으로 함께 사용됩니다. 파서 생성기는 입력 스트림을 구문 분석하기 위해 형식 문법, Lex가 간단한 정규 표현식을 사용하여 수행할 수 없는 어떤 것을 사용합니다 (Lex는 단순 유한 상태 자동 장치로 제한됩니다).
예를 들어 Yacc에 의해 생성된 파서가 문자의 스트림 ("문자-스트림")을 직접 처리하는 것보다 입력으로 토큰의 스트림 ("토큰-스트림")을 받아들이도록 하는 것이 전형적으로 바람직합니다. Lex는 종종 그러한 토큰-스트림을 생성하기 위해 사용됩니다.
Scannerless parsing은 구별되는 렉서없이 직접 입력 문자-스트림을 구문 분석하는 것을 참조합니다.
Lex and make
make는 Lex와 관련된 프로그램을 유지 관리하기 위해 사용될 수 있는 유틸리티입니다. Make는 .l의 확장자를 가지는 파일이 Lex 소스 파일이라고 가정합니다. make 내부 매크로 LFLAGS는 make에 의해 자동으로 호출될 Lex 옵션을 지정하기 위해 사용될 수 있습니다.
External links
- Using Flex and Bison at Macworld.com
- lex(1) – Solaris 10 User Commands Reference Manual
- lex(1) – Plan 9 Programmer's Manual, Volume 1