6/15/2017

Lex와 Yacc (수정중 , 추후 다시 좀더 진행할 경우 보완)

1. Lex 와 Yacc 소개

Lex와 Yacc는 개념이 나온지는 오래되었으며, 보통 Compiler 과목시간에 배우는 개념이겠다.
그리고 Compiler Design 을 위해서 많이 사용되어지지만, 원대한 꿈을 가지고 Compiler 만들기로만 사용하기에는 그 기능이 너무 좋다.

  • Compiler Design 
  • Interpreter Design (Script Language 설계) 다양하게 이용이 가능 
  • Assembler Design 가능 
  • Parser Design 구현

내가 다시 관심을 크게 가지게 된것은 Device Tree Source 이고, Device Tree Compiler 때문이다.
그리고 다른 HAL (Hardware Abstract Layer) Compiler를 비롯하여 간단한 Compiler들 때문이다.
만약 가능하다면,  Device Tree 같은 Compiler를 간단히 구현을 하고싶다.

  • Linux의 Lex와 Yacc (Flex, Bison) 
Linux에서는 현재 Lex 대신 Flex를 사용하며, Yacc 대신 확장된 기능인 bison을 사용하고 있으며,
Makefile에서 Lex와 Yacc대신 Flex와 Bison을 설정해서 사용하면 될 것이다.


  • Lex 와 Yacc 기본역할
  1. Lex(Flex)의 역할은 입력문자열에 대한 검색역할을 담당 ( Lex scanner) 
  2. Yacc(Bison)는 실제적인 문자열의 분석을 담당 (Yacc parser) 

1.1 Lex와 Yacc 한글 관련자료

Lex와 Yacc의 관련된 기능문서 및 관련자료는 이곳에 Link하고 관련 Link를 소개하겠다.

  • Lex와 Yacc 한글문서 및 예제
  KLDP에서 만들어진 Manual로 좀 더 원론적으로 잘 설명해주고 있다.

  https://wiki.kldp.org/KoreanDoc/html/Lex_Yacc-KLDP/Lex_Yacc-KLDP.html#toc1
  https://github.com/swmaestro06-apus/apus/wiki/Lex-&-Yacc-(flex-&-bison)-%EB%82%B4%EC%9A%A9-%EC%A0%95%EB%A6%AC

  • Lex와 Yacc 한글문서 및 관련예제 
   Lex와 Yacc를 예제가 쉬어 따라하고 이해하기가 쉽다.

   https://www.joinc.co.kr/w/Site/Development/Env/Yacc

1.2  Flex 와 Bison Manual 

상위 문서들은 빠른 이해에 도움이 되겠지만 직접 Manual을 읽는 것이 상세한 설정 및 사용법에 더 도움이 더 되는 것 같다.

  • Lex와 yacc Manual
쉽게 잘 작성된 Manual이며, 이해하기 쉽게 되어있다.
  http://www.epaperpress.com/lexandyacc/index.html

  • Compiler의 디자인 방법
Compiler를 Design 하는 방법으로 구조와 만드는 방법 , 즉 Lex와 Yacc를 사용 
  https://www.tutorialspoint.com/compiler_design/index.htm

  • Lex 와 Yacc (Flex, Bison) 전체 Manual
Lex , Yacc , Flex, Bison 개별 Manual을 연결해주고 있으며, 사실 이 사이트면, Manual이 충분한 것 같다. 
하지만 나중에 Link가 끊기면 아래로 별도의 사이트로 연결하자.
  http://dinosaur.compilertools.net/


  • Lex와 Yacc의 다양한 예제 
  http://aquamentus.com/tut_lexyacc.html


  • Flex (Lexical Analyzer) Manual 
  Flex Tool의 사용법 및 Manual

  http://dinosaur.compilertools.net/flex/index.html
  http://dinosaur.compilertools.net/flex/manpage.html

  • Bison ( Parser Generator) Manual
  보기전에 Lex와 Yacc의 기본동작을 이해하고 , 그 다음에 관련 세부 Manual로 사용

  https://www.gnu.org/software/bison/manual/
  http://dinosaur.compilertools.net/bison/index.html


2. Flex와 Bison의 역할 

Lex와 Yacc의 각각의 기본기능을 알아보고 이를 쉽게 사용을 해보자.
우선 Lex와 Yacc가 Compiler를 만드는 도구이기 때문에 Compiler의 기본구성을 알아보자.

  • Compiler Design 시 Compiler의 구조 (C 언어) 
  Compiler의 기본동작의 작업을 이해해보자
  GCC의 더 깊은 이해하고자 한다면, 예를들면, front-end , back-end 기능 GCC Manual 참조

아래의 사이트에서 컴파일러의 디자인에 대해 자세히 설명을 해주고 있다.
  https://www.tutorialspoint.com/compiler_design/compiler_design_overview.htm


IETF에서 만들어지는 Protocol 형식 HTTP/SIP/RTSP 이런식의 간단한 Parser를 한번 만들어보자.

2.1 Lexical analysis (Flex)의 역할 및 구조 

Lexical analysis or scanner 라고 하며, Flex인 경우는 (The Fast Lexical Analyzer)의 약어이며, C와 C++ 위한 Tool이다.
만약 다른 언어와 조합을 하고자 한다면, 다른 Lexical analysis를 알아보자.

  • Lexical Analysis의 소개 
  사용되는 기본용어설명 ,  다양한 Lexical Analysis 종류 소개 , 이에 역할

  https://en.wikipedia.org/wiki/Lexical_analysis

한글로 번역하고자 하면 어휘분석기 기능이며, 각각의 언어에서 문법요소를 확인하여 어휘최소단위인 Token으로 분리해내는 작업이다.

Lex의 구성은 다음과 같이 구성이 된다고 한다.

  • definitions 
  1. %Flex의 기능정의 가능 
  2. 변수 지정도 가능 
  3.  %{  }% 안에 C언어의 코드 작성으로 MACRO 및 user code 함수 선언
  • rules
  • user code section
Lex의 구성

... definitions ... 
  # rules에 pattern을 간단하게 하기 위한 선언과 초기 조건
  # C코드 삽입시 %{, }% 기호를 표시하고 사이에 쓸 수 있음
%%
... rules ...  
  # pattern과 action으로 이루어짐
  # C코드는 {, }로 감싸서 표시함
%%
... user code section...
  # yylex()함수 등 yy 관련과 사용자가 원하는 C 루틴으로 이루어진다. 
  # 만약 이곳에 생성을 했다면, 상위 %{ }% 안에 선언을 해주자. 



2.2 Bison의 역할 및 구조 


  https://en.wikipedia.org/wiki/Compiler-compiler


Github의 apus Project
  https://github.com/swmaestro06-apus/apus/wiki/Lex-&-Yacc-(flex-&-bison)-%EB%82%B4%EC%9A%A9-%EC%A0%95%EB%A6%AC



3.1 Flex와 Bison의 Make 구성

3.2 Flex File 구성

3.3 Bison File 구성