Flex (어휘분석기)
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
Flex는 C로 작성된 어휘 분석기 생성기로, 1987년경 번 팩슨이 개발했으며 반 제이콥슨의 아이디어를 기반으로 한다. Flex는 정규 표현식을 사용하여 문자 파싱 및 토큰화를 수행하며, C 및 C++ 코드를 생성할 수 있다. 하지만 유니코드 직접 지원, 재진입성, 유닉스 환경 의존성, 다른 언어와의 연동에 제한이 있으며, flex++는 C++용 어휘 분석기로서 임베디드 시스템과 같은 환경에서 유용하게 사용될 수 있다.
더 읽어볼만한 페이지
- 유한 상태 기계 - 정규 언어
정규 언어는 주어진 알파벳으로 구성된 문자열 집합으로, 클레이니 스타, 합집합, 문자열 연결 연산을 통해 확장되며, 정규 표현식, 유한 상태 기계 등으로 표현 가능하다. - 유한 상태 기계 - Lex
Lex는 마이크 레스크와 에릭 슈미트가 개발한 어휘 분석기 생성기로, 정규 표현식을 기반으로 입력 텍스트를 분석하여 토큰을 식별하고 컴파일러 개발 등에 활용된다. - 구문 분석기 - ANTLR
ANTLR은 EBNF로 표현된 문법을 입력받아 렉서, 파서, 트리 파서 등 다양한 언어 인식기 소스 코드를 생성하는 파서 생성기이며, C#, Java, Python 등 여러 언어를 지원하고 깃허브에 다양한 문법이 공개되어 있다. - 구문 분석기 - GNU bison
GNU Bison은 Yacc와 호환되면서 재진입성, 다양한 언어 코드 생성, 자동 반례 생성 등의 기능을 제공하는 파서 생성기로, 여러 프로젝트에서 Yacc를 대체하여 널리 사용되고 있으며, Bison으로 생성된 코드는 GPL과 호환되는 라이선스로 배포 가능하다. - 컴파일러 - 바이너리 재컴파일러
- 컴파일러 - 링커 (컴퓨팅)
링커는 여러 모듈로 된 목적 파일을 결합해 실행 가능한 프로그램을 만들고, 정적/동적 링킹으로 라이브러리를 연결하며, 심볼 해결 및 재배치로 변수와 함수를 메모리 주소에 연결하는 소프트웨어 도구이다.
Flex (어휘분석기) - [IT 관련 정보]에 관한 문서 | |
---|---|
기본 정보 | |
![]() | |
유형 | 어휘 분석기 생성기 |
개발자 | Vern Paxson |
최초 릴리스 | 1987년경 |
최신 버전 | 2.6.4 |
최신 릴리스 날짜 | 2017년 5월 6일 |
운영체제 | 유닉스 계열 |
라이선스 | BSD 라이선스 |
웹사이트 | flex GitHub 저장소 |
2. 역사
Flex는 번 팩슨(Vern Paxson)이 1987년경 C로 작성했으며, 반 제이콥슨(Van Jacobson)의 많은 아이디어와 영감을 받았다.[1] 초기 버전은 제프 포스캔저(Jef Poskanzer)가 만들었으며, 빠른 테이블 표현은 반 제이콥슨이 설계하고 케빈 궝(Kevin Gong)과 번 팩슨이 구현했다.[1]
2. 1. 초기 개발
번 팩슨이 1987년경 C 언어로 Flex를 작성했으며, 반 제이콥슨의 많은 아이디어와 영감을 받았다.[1] 제프 포스캔저가 초기 버전을 만들었다.[1]2. 2. 핵심 구현
반 제이콥슨이 빠른 테이블 표현의 부분적인 구현을 설계했다.[1] 이 구현은 케빈 궝(Kevin Gong)과 번 팩슨이 수행했다.[1]3. 예제
다음은 PL/0 프로그래밍 언어를 위한 Flex 스캐너의 예시이다. Flex를 사용하여 PL/0 언어의 어휘 분석을 수행하는 방법을 보여준다.
```c
%{
#include "y.tab.h"
%}
digit [0-9]
letter [a-zA-Z]
%%
"+" { return PLUS; }
"-" { return MINUS; }
"*" { return TIMES; }
"/" { return SLASH; }
"(" { return LPAREN; }
")" { return RPAREN; }
";" { return SEMICOLON; }
"," { return COMMA; }
"." { return PERIOD; }
":=" { return BECOMES; }
"=" { return EQL; }
"<>" { return NEQ; }
"<" { return LSS; }
">" { return GTR; }
"<=" { return LEQ; }
">=" { return GEQ; }
"begin" { return BEGINSYM; }
"call" { return CALLSYM; }
"const" { return CONSTSYM; }
"do" { return DOSYM; }
"end" { return ENDSYM; }
"if" { return IFSYM; }
"odd" { return ODDSYM; }
"procedure" { return PROCSYM; }
"then" { return THENSYM; }
"var" { return VARSYM; }
"while" { return WHILESYM; }
{letter}({letter}|{digit})* {
yylval.id = strdup(yytext);
return IDENT; }
{digit}+ { yylval.num = atoi(yytext);
return NUMBER; }
[ \t\n\r] /* skip whitespace */
. { printf("Unknown character [%c]\n",yytext[0]);
return UNKNOWN; }
%%
int yywrap(void){return 1;}
3. 1. PL/0 스캐너 예제
다음은 PL/0 프로그래밍 언어를 위한 Flex 스캐너의 예시이다.인식되는 토큰은 다음과 같다: '+', '-', '*', '/', '=', '(', ')', ',', ';', '.', ':=', '<', '<=', '<>', '>', '>=';
숫자: `0-9 {0-9}`; 식별자: `a-zA-Z {a-zA-Z0-9}` 및 키워드: `begin`, `call`, `const`, `do`, `end`, `if`, `odd`, `procedure`, `then`, `var`, `while`.
```c
%{
#include "y.tab.h"
%}
digit [0-9]
letter [a-zA-Z]
%%
"+" { return PLUS; }
"-" { return MINUS; }
"*" { return TIMES; }
"/" { return SLASH; }
"(" { return LPAREN; }
")" { return RPAREN; }
";" { return SEMICOLON; }
"," { return COMMA; }
"." { return PERIOD; }
":=" { return BECOMES; }
"=" { return EQL; }
"<>" { return NEQ; }
"<" { return LSS; }
">" { return GTR; }
"<=" { return LEQ; }
">=" { return GEQ; }
"begin" { return BEGINSYM; }
"call" { return CALLSYM; }
"const" { return CONSTSYM; }
"do" { return DOSYM; }
"end" { return ENDSYM; }
"if" { return IFSYM; }
"odd" { return ODDSYM; }
"procedure" { return PROCSYM; }
"then" { return THENSYM; }
"var" { return VARSYM; }
"while" { return WHILESYM; }
{letter}({letter}|{digit})* {
yylval.id = strdup(yytext);
return IDENT; }
{digit}+ { yylval.num = atoi(yytext);
return NUMBER; }
[ \t\n\r] /* skip whitespace */
. { printf("Unknown character [%c]\n",yytext[0]);
return UNKNOWN; }
%%
int yywrap(void){return 1;}
4. 내부 구조
Flex는 결정적 유한 오토마타(DFA)를 사용하여 문자 파싱 및 토큰화를 수행한다. DFA는 정규 언어를 인식하는 이론적인 기계이며, 튜링 기계 집합의 부분 집합이자 읽기 전용 오른쪽 이동 튜링 기계와 동등하다. 구문은 정규 표현식을 기반으로 한다. 비결정적 유한 오토마타(NFA)도 참고할 수 있다.[1]
4. 1. 결정적 유한 오토마타 (DFA)
결정적 유한 오토마타(DFA)는 정규 언어를 인식하는 이론적인 기계이다. 이 기계는 튜링 기계 집합의 부분 집합이며, 읽기 전용 오른쪽 이동 튜링 기계와 동등하다. Flex는 DFA를 사용하여 문자 파싱 및 토큰화를 수행하며, 구문은 정규 표현식을 기반으로 한다. 비결정적 유한 오토마타(NFA)도 참고할 수 있다.5. 문제점 및 한계
Flex는 몇 가지 문제점과 한계를 가지고 있다.
시간 복잡도Flex는 일반적으로 입력 길이에 대해 의 시간 복잡도를 갖지만, `REJECT` 매크로를 사용하면 비선형 성능의 스캐너를 생성할 수 있다. `REJECT` 기능은 기본적으로 활성화되어 있지 않으며, 성능에 미치는 영향 때문에 Flex 매뉴얼에서 사용을 권장한다.[12]
재진입성 (Reentrancy)기본적으로 Flex에 의해 생성된 스캐너는 재진입 가능하지 않아, 여러 스레드에서 사용하는 프로그램에 문제를 야기할 수 있다. Flex는 재진입성을 위한 옵션을 제공하며, 자세한 내용은 Flex 매뉴얼에서 확인할 수 있다.[13]
유닉스 환경 의존성생성된 스캐너는 유닉스 특정 ''unistd.h'' 헤더 파일을 참조하는 경우가 있다. 이를 피하려면 `%option nounistd`를 사용해야 한다. 또한, 생성된 코드에서 isatty (유닉스 라이브러리 함수) 호출 문제가 발생할 수 있는데, `%option never-interactive`를 통해 해결할 수 있다.[14]
다른 언어와의 연동Flex는 C와 C++ 코드만 생성 가능하다. 다른 언어에서 사용하려면 SWIG와 같은 언어 바인딩 도구가 필요하다.
유니코드 지원Flex는 1바이트(8비트) 바이너리 값 일치로 제한되어 유니코드를 직접 지원하지 않는다.[15] RE/flex 등 다른 도구들은 유니코드 일치를 지원한다.
5. 1. 시간 복잡도
Flex는 일반적으로 입력 길이에 대해 의 시간 복잡도를 갖는다. 즉, 각 입력 기호에 대해 상수 횟수의 연산을 수행한다. 이 상수는 상당히 낮다. GCC는 DFA 매치 루프에 대해 12개의 명령어를 생성한다. 이 상수는 토큰의 길이, 정규 표현식의 길이 및 DFA의 크기와 무관하다는 점에 유의해야 한다.그러나 매우 긴 토큰과 일치할 가능성이 있는 스캐너에서 `REJECT` 매크로를 사용하면 Flex가 비선형 성능의 스캐너를 생성할 수 있다. 이 기능은 선택 사항이다. 이 경우 프로그래머는 이미 일부 입력을 일치시킨 후 "다시 시도"하도록 Flex에 명시적으로 지시한 것이다. 이렇게 하면 DFA가 다른 수락 상태를 찾기 위해 백트래킹하게 된다. `REJECT` 기능은 기본적으로 활성화되어 있지 않으며, 성능에 미치는 영향 때문에 Flex 매뉴얼에서 사용을 권장하지 않는다.[12]
5. 2. 재진입성 (Reentrancy)
기본적으로 Flex에 의해 생성된 스캐너는 재진입 가능하지 않다. 이는 생성된 스캐너를 서로 다른 스레드에서 사용하는 프로그램에 심각한 문제를 야기할 수 있다. 이러한 문제를 해결하기 위해 Flex는 재진입 가능성을 달성하기 위한 옵션을 제공한다. 이러한 옵션에 대한 자세한 설명은 Flex 매뉴얼에서 찾을 수 있다.[13]5. 3. 유닉스 환경 의존성
일반적으로 생성된 스캐너는 유닉스에 특정한 ''unistd.h'' 헤더 파일에 대한 참조를 포함한다. ''unistd.h''를 포함하는 코드가 생성되는 것을 피하려면, ''%option nounistd''를 사용해야 한다. 또 다른 문제는 생성된 코드에서 발견될 수 있는 ''isatty''(유닉스 라이브러리 함수)에 대한 호출이다. ''%option never-interactive''는 flex가 ''isatty''를 사용하지 않는 코드를 생성하도록 강제한다.[14]5. 4. 다른 언어와의 연동
Flex는 C와 C++에 대한 코드만 생성할 수 있다. Flex가 생성한 스캐너 코드를 다른 언어에서 사용하려면 SWIG와 같은 언어 바인딩 도구를 사용할 수 있다.5. 5. 유니코드 지원
Flex는 1바이트(8비트) 바이너리 값 일치로 제한되어 있어 유니코드를 직접 지원하지 않는다.[15] RE/flex 및 다른 대안들은 유니코드 일치를 지원한다.6. Flex++
flex++는 C++용 어휘 분석기로, flex 패키지에 포함되어 있다. 생성된 코드는 입력 자체에 종속되지 않는 한, 메모리 할당기(malloc 또는 사용자가 제공한 대안)를 제외하고는 어떠한 런타임이나 외부 라이브러리에도 의존하지 않는다. 이는 기존의 운영체제나 C 런타임 기능을 사용할 수 없는 임베디드 시스템 및 유사한 상황에서 유용할 수 있다.
flex++로 생성된 C++ 스캐너는 `FlexLexer.h` 헤더 파일을 포함하며, 이 헤더 파일은 두 개의 C++ 생성 클래스의 인터페이스를 정의한다.[1]
6. 1. 특징
flex++는 C++용 어휘 분석기로, flex 패키지에 포함되어 있다. 생성된 코드는 (입력 자체에 종속되지 않는 한) 메모리 할당기(malloc 또는 사용자가 제공한 대안)를 제외하고는 어떠한 런타임이나 외부 라이브러리에도 의존하지 않는다. 이는 기존의 운영체제나 C 런타임 기능을 사용할 수 없는 임베디드 시스템 및 유사한 상황에서 유용할 수 있다.flex++로 생성된 C++ 스캐너는 `FlexLexer.h` 헤더 파일을 포함하며, 이 헤더 파일은 두 개의 C++ 생성 클래스의 인터페이스를 정의한다.
6. 2. 생성 클래스
flex++로 생성된 C++ 스캐너는 `FlexLexer.h` 헤더 파일을 포함하며, 이 헤더 파일은 두 개의 C++ 생성 클래스의 인터페이스를 정의한다.[1]참조
[1]
서적
flex & bison
https://books.google[...]
O'Reilly Media
2009-08
[2]
서적
lex & yacc
https://books.google[...]
O'Reilly
[3]
서적
lex & yacc
https://books.google[...]
O'Reilly
[4]
서적
flex & bison
http://oreilly.com/c[...]
O'Reilly Media
2009-08
[5]
웹사이트
src/usr.bin/lex/
http://bxr.su/o/usr.[...]
2015-12-11
[6]
웹사이트
flex(1)
http://mdoc.su/-/fle[...]
[7]
웹사이트
yacc(1)
http://mdoc.su/-/yac[...]
[8]
웹사이트
bison-3.0.4 – GNU parser generator
http://ports.su/deve[...]
2015-11-15
[9]
웹사이트
Is flex GNU or not?
https://westes.githu[...]
[10]
웹사이트
Flex - a scanner generator - Table of Contents - GNU Project - Free Software Foundation (FSF)
https://ftp.gnu.org/[...]
2019-12-05
[11]
웹사이트
Flex, version 2.5 A fast scanner generator Edition 2.5, March 1995
https://www.cs.princ[...]
2019-04-20
[12]
웹사이트
Performance - Lexical Analysis With Flex, for Flex 2.5.37
https://westes.githu[...]
Flex.sourceforge.net
2013-02-25
[13]
웹사이트
Reentrant - Lexical Analysis With Flex, for Flex 2.5.37
https://westes.githu[...]
Flex.sourceforge.net
2013-02-25
[14]
웹사이트
Code-Level And API Options - Lexical Analysis With Flex, for Flex 2.5.37
https://westes.githu[...]
Flex.sourceforge.net
2013-02-25
[15]
웹사이트
Why you should not use (f)lex, yacc and bison
https://tomassetti.m[...]
2022-10-26
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com