플렉스(lexical Analyzer Generator)

Flex (lexical analyser generator)
굴곡이 지다
개발자번 팍손
초기 릴리즈약 1987년; 35년 전 (1998년)[1]
안정적 해제
2.6.4 / 2017년 5월 6일; 4년(2017-05-06)
리포지토리
운영 체제유닉스 유사
유형어휘분석기 발전기
면허증BSD 라이선스
웹사이트github.com/westes/flex

Flex(고속 어휘 분석기 제너레이터)는 렉스를 대체하는 무료 오픈 소스 소프트웨어다.[2]어휘 분석기("스캐너" 또는 "렉서"라고도 한다)[3][4]를 생성하는 컴퓨터 프로그램이다.BSD에서 파생된 운영 체제에서 버클리 야카퍼 제너레이터와 함께 렉스 구현으로 자주 사용된다(두 가지 모두 사용).lex그리고yaccPOSIX)[5][6][7]의 일부 또는 *BSD 포트[8] 및 Linux 배포에서 GNU bison(yacc의 한 버전)과 함께.바이슨과 달리 플렉스는 GNU 프로젝트의 일부가 아니며, 플렉스를 위한 매뉴얼이 자유소프트웨어재단에 의해 제작, 발행되었지만 [9]GNU 일반공용면허에 따라 공개되지 않는다.[10]

역사

플렉스(Flex)는 밴 제이콥슨(Van Jacobson)의 많은 아이디어와 많은 영감의 도움을 받아 1987년경[1] Vern Paxson에 의해 C로 쓰여졌다.Jef Poskanzer의 원본.빠른 표 표현은 밴 제이콥슨이 한 디자인을 부분적으로 구현한 것이다.그 실행은 케빈 공과 번 팍슨이 했다.[11]

어휘 분석기 예제

이것은 지시 프로그래밍 언어 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.

%{ #include "y.tab.h" %}  숫자를 매기다         [0-9] 글자        [a-zA-Z]  %% "+"                  { 돌아오다 플러스;       } "-"                  { 돌아오다 빼기;      } "*"                  { 돌아오다 시대;      } "/"                  { 돌아오다 슬래시;      } "("                  { 돌아오다 LPAREN;     } ")"                  { 돌아오다 RPAREN;     } ";"                  { 돌아오다 세미콜론;  } ","                  { 돌아오다 쉼표;      } "."                  { 돌아오다 마침표;     } ":="                 { 돌아오다 된다;    } "="                  { 돌아오다 EQL;        } "<>"                 { 돌아오다 NEQ;        } "<"                  { 돌아오다 LSS;        } ">"                  { 돌아오다 GTR;        } "<="                 { 돌아오다 LEQ;        } ">="                 { 돌아오다 GEQ;        } "begin"              { 돌아오다 비긴심;   } "콜"               { 돌아오다 콜심;    } "const"              { 돌아오다 콘스팀;   } "do"                 { 돌아오다 도심;      } "끝"                { 돌아오다 ENDSYM;     } "만약"                 { 돌아오다 IFSYM;      } "odd"                { 돌아오다 오즈심;     } "procedure"          { 돌아오다 ProcSYM;    } "그럼"               { 돌아오다 SHSYM;    } "var"                { 돌아오다 VARSYM;     } "그동안"              { 돌아오다 와일심;   } {글자}({글자} {숫자를 매기다})* {                        yylval.id = 걸레질하다(yytext);                        돌아오다 IDENT;      } {숫자를 매기다}+             { yylval.숫자 = 아토이(yytext);                        돌아오다 숫자;     } [ \t\n\r]            /* 공백 건너뛰기 */ .                    { 활자화하다("알 수 없는 문자 [%c]\n",yytext[0]);                        돌아오다 알 수 없는;    } %%  t로 야랩(공허하게 하다){돌아오다 1;} 

내국

이 프로그램들은 결정론적 유한자동화(DFA)를 이용하여 캐릭터 구문 분석과 토큰화를 수행한다.DFA는 정규 언어를 받아들이는 이론적 기계다.이 기계들은 튜링 기계 모음의 일부분이다.DFA는 읽기 전용 우측 이동 튜링 기계와 동등하다.구문은 정규식의 사용에 기초한다.비결정론적 유한 자동화를 참조하십시오.

문제들

시간 복잡성

Flex 어휘 분석기는 일반적으로 입력 길이에 시간 복잡성 ()이(가) 있다.즉, 각 입력 기호에 대해 일정한 수의 연산을 수행한다.이 상수는 상당히 낮다: GCC는 DFA 매치 루프에 대한 12가지 지침을 생성한다.[citation needed]상수는 토큰 길이, 정규식 길이 및 DFA 크기와 무관하다는 점에 유의하십시오.

그러나 극도로 긴 토큰과 일치할 가능성이 있는 스캐너에서 REVEN 매크로를 사용하면 Flex가 비선형 성능을 가진 스캐너를 생성할 수 있다.이 기능은 선택 사항이다.이 경우 프로그래머는 플렉스에게 이미 일부 입력과 일치한 후 "다시 돌아가서 다시 시도하라"고 명시적으로 말했다.이것은 DFA가 다른 수용 국가를 찾기 위해 역행하는 원인이 될 것이다.REVEN 기능은 기본적으로 활성화되어 있지 않으며, 성능상의 영향을 미치기 때문에 Flex 매뉴얼에서 사용을 금지한다.[12]

리엔트런시

기본적으로 Flex에서 생성된 스캐너는 재입력되지 않는다.이것은 다른 스레드에서 생성된 스캐너를 사용하는 프로그램에 심각한 문제를 일으킬 수 있다.이 문제를 극복하기 위해 Flex가 제공하는 옵션이 있다.이러한 옵션에 대한 자세한 설명은 Flex 매뉴얼을 참조하십시오.[13]

비유닉스 환경에서의 사용

일반적으로 생성된 스캐너에는 언리스트드에 대한 참조가 포함되어 있다.h 헤더 파일(유닉스별)unistd.h를 포함하는 코드를 생성하지 않으려면 %option 명사istd를 사용해야 한다.또 다른 문제는 생성된 코드에서 찾을 수 있는 isatty로의 호출(유닉스 라이브러리 함수)이다.%option never-interactive등가성을 사용하지 않는 코드를 생성하도록 유동적이다.[14]

다른 언어의 flex 사용

Flex는 CC++에 대한 코드만 생성할 수 있다.다른 언어의 flex에 의해 생성된 스캐너 코드를 사용하려면 SWIG와 같은 언어 바인딩 도구를 사용할 수 있다.

플렉스++

flex++는 플렉스 패키지의 일부로 포함된 C++용 유사한 어휘 스캐너다.생성된 코드는 입력이 또한 그것에 의존하지 않는 한 메모리 할당자(malloc 또는 사용자가 제공한 대안)를 제외하고 어떠한 런타임이나 외부 라이브러리에 의존하지 않는다.이것은 전통적인 운영 체제나 C 런타임 시설을 이용할 수 없는 임베디드 및 유사한 상황에서 유용할 수 있다.

flex++ 생성 C++ 스캐너에 헤더 파일이 포함됨FlexLexer.h는 두 개의 C++ 생성 클래스의 인터페이스를 정의한다.

참고 항목

참조

  1. ^ a b Levine, John (August 2009). flex & bison. O'Reilly Media. p. 9. ISBN 978-0-596-15597-1. In about 1987, Vern Paxson of the Lawrence Berkeley Lab took a version of lex written in ratfor (an extended Fortran popular at the time) and translated it into C, calling it flex, for 'Fast Lexical Analyzer Generator.'
  2. ^ Levine, John R.; Mason, Tony; Brown, Doug (1992). lex & yacc (2nd ed.). O'Reilly. p. 279. ISBN 1-56592-000-7. A freely available version of lex is flex.
  3. ^ Levine, John R.; Mason, Tony; Brown, Doug (1992). lex & yacc (2nd ed.). O'Reilly. pp. 1–2. ISBN 1-56592-000-7.
  4. ^ Levine, John (August 2009). flex & bison. O'Reilly Media. p. 304. ISBN 978-0-596-15597-1.
  5. ^ OpenBSD (2015-12-11). "src/usr.bin/lex/". BSD Cross Reference. Retrieved 2015-12-26. This is flex, the fast lexical analyzer generator.
  6. ^ "flex(1)". *BSD man pages.
  7. ^ "yacc(1)". *BSD man pages.
  8. ^ "bison-3.0.4 – GNU parser generator". OpenBSD ports. 2015-11-15. Retrieved 2015-12-26.
  9. ^ 플렉스 GNU인가, 아닌가?웨이백 머신에 2016-03-03 보관, 플렉스 FAQ
  10. ^ "Flex - a scanner generator - Table of Contents - GNU Project - Free Software Foundation (FSF)". ftp.gnu.org. Retrieved 2019-12-05.
  11. ^ "Flex, version 2.5 A fast scanner generator Edition 2.5, March 1995". Retrieved 20 April 2019.
  12. ^ "Performance - Lexical Analysis With Flex, for Flex 2.5.37". Flex.sourceforge.net. Archived from the original on 2014-01-27. Retrieved 2013-02-25.
  13. ^ "Reentrant - Lexical Analysis With Flex, for Flex 2.5.37". Flex.sourceforge.net. Archived from the original on 2010-11-17. Retrieved 2013-02-25.
  14. ^ "Code-Level And API Options - Lexical Analysis With Flex, for Flex 2.5.37". Flex.sourceforge.net. Archived from the original on 2013-03-14. Retrieved 2013-02-25.

추가 읽기

  • Levine, John (August 2009). flex & bison. O'Reilly Media. ISBN 978-0-596-15597-1.
  • M. E. 레스크와 E.슈미트, 렉스 - 어휘 분석기 제너레이터
  • 알프레드 아호, 라비 세티, 제프리 울만, 컴파일러: 원리, 기술도구, 애디슨 웨슬리(1986)플렉스가 사용하는 패턴 매칭 기법 설명(결정론적 유한 오토마타)

외부 링크