본문 바로가기

Programming/LEX & YACC

(6)
LEX 와 YACC 의 동작 원리 LEX Lex 는 기본적으로 단어들로 이루어진 문장에서 지정한 Token을 하나하나 꺼내오게 된다. yylex() 라는 함수는 lex 에 의하여 구성된 lexer 의 호출 함수 이다. 다시 말해 yylex() 함수를 호출하면 lexer 는 주어진 문장에서 정해진 규칙에 의하여 토큰을 하나하나 꺼내어 온다. 이렇게 꺼내어 오면서 특정한 등록된, 즉 각 토큰에 정해놓은 함수 또는 문장( c 함수 또는 c 문장) 을 호출하게 된다. 즉 lexer 는 yylex() 에 의하여 문장에서 토콘을 꺼내오는 것을 시작하며 모든 토큰이 다 읽혀 질때까지 yylex() 를 끝내지 않는다. Lex 혼자서도 어느정도 구문 분석을 하여 수행할 수 있다. Lex 에 의하여 만들어진 lexer 자신도 얼마든지 yacc 없이 특정한..
SQL parser ( 간단한 몇 가지 구문을 토큰으로 나누고 stack 에 넣어 출력 ) 테스트용으로 한번 만들어 본것 파서에서는 각 문법을 인식했을 때마다 씨언어로 동작을 작성할 수 있다. 평소에 코딩이 할 일이 있을 때 lex yacc이 필요하면 이런식으로 활용 할 수 있다. /************************************** * 렉스 select.l **************************************/ %{ #include "y.tab.h" int lineno = 1; %} %% CREATE { return CREATE; } TABLE { return TABLE; } VIEW { return VIEW; } SELECT { return SELECT; } FROM { return FROM; } WHERE { return WHERE; } AND { ret..
간단한 렉스 프로그램 ( Flex & C++ ) 아직 C++ 이 익숙하지 않아서 문법이 기억이 안나는건 C로 처리했다. ( new 안쓰고 malloc을 썼다든지.. ) 공백과 ' ' 기준으로 토큰을 나눤서 vector에 저장하고 그 vertor를 리턴하는 함수를 이용 하는 코드 main은 테스트용으로 Tokenize함수를 외부에서 불러와 쓸 수있따. %{ #include #include #include #include #undef YY_INPUT #define YY_INPUT(b, r, ms) ( r = my_yyinput(b, ms) ) #ifndef min #define min(a, b) ((a > b) ? b : a) #endif using namespace std; vector& Tokenize(char* pString); int my_yyin..
YACC 문법 구조 Yacc 문법은 세 부분으로 구성되며 각각 정의절, 규칙절, 그리고 사용자 서브루틴절 이라고 한다. {% .. C 코드 ( 변수 선언 등 ) %} 정의절 %% 규칙절 %% 사용자 서브루틴 각 부분은 퍼센트 기호 두개를 담고있는 행으로 구분된다. 처음 두 부분은 그 안에 내용이 없더라도 반드시 존재해야 한다. 세번째 부분과 그 앞에 있는 %% 행은 생략할 수 있다. (Lex같은 동일한 구조를 갖는다.) 기호 Yacc 문법은 언어에서 문법을 구성하는 "단어"에 해당하는 기호들로 이루어 진다. 기호란 글자, 숫자, 마침표, 그리고 밑줄 등으로 이루어진 문자열이며, 첫 문자가 숫자이면 기호가 아니다. error라는 기호는 에러 복구를 위해서 예약되어 있다. 이렇게 미치 예약된 기호를 제외한 나머지 기호들에는 미..
LEX 의 정규 표현식 LEX 의 정규 표현식 정규식은 메타 언어를 사용한 패턴의 기술(description)을 말한다. 하나의 수식은 기호들로 구성되어 있다. 기호들은 보통 문자와 숫자이다. 그러나 Lex에서 특별한 의미를 지니는 기호들이 있다. 다음 두 표는 Lex에서 사용되는 여러 기호를 규정하고 있으며 약간의 전형적인 예제를 제시한다. Lex에서의 레귤러 표현 규정 문자 의미 A-Z, 0-9, a-z 패턴의 일부를 구성하는 문자와 숫자. . \n을 제외한 어느 문자와도 일치. - 범위를 표시할 때 사용. 예: A-Z은 문자 A부터 Z까지를 의미. [ ] 문자 클래스. 괄호 안의 어느 문자와도 일치. 첫 문자가 ^이면 부정 패턴을 나타냄. 예: [abC]는 a,b 혹은 C와 일치. * 선행 패턴의 발생이 0 이상. + 선..
LEX 의 구조 lex 프로그램은 크게 세 부분으로 구분된다. 정의절 규칙절 사용자 서브루틴절 실제 코드에서의 형태는 다음과 같다 {% 정의절 %} %% 규칙절 %% 사용자 서브루틴 각 부분은 %% 즉 % 두개를 담고 있는 행으로 구분한다. 처음 두 부분은 내용이 없더라도 반드시 있어야 한다. 즉 정의절 과 규칙절 은 반드시 있어야 한다. 세번째 부분과 그앞에 있는 %% 행은 생략할 수 있다. 정의절 정의절은 리터럴 블록, 정의, 내부 테이블 선언, 시작조건, 변환 등을 포함할 수 있다. 공백으로 시작하는 행은 C 파일에 복사될 때 공백이 제거된다. 이는 주로 /* */ 로 둘러싸인 주석을 포함할 때 앞의 공백을 제거하기 위한 기능이다. 규칙절 규칙절은 패턴으로 이루어진 행과 C 코드를 담고 있다. 공백 또는 %{ 와 ..