일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 836
- 언어모델
- 랩실일기
- 객체지향설계
- 오픈소스웹소프트웨어
- DB
- 정보검색
- 데이터베이스
- 벡터
- 자연어처리
- 웹소프트웨어
- 프로세스
- 가상메모리
- 컴파일
- 데이터분석
- 클래스
- 애자일
- 운영체제
- css
- Linear Algebra
- NLP
- OS
- 컴파일러
- Agile
- 스케줄러
- 파싱테이블
- React
- 소프트웨어공학
- C언어
- 파싱
Archives
- Today
- Total
observe_db
[컴파일러] Lex 실습 본문
4/14
일단 이친구가 예제이다.
%{
#define IF 100
#define ID 101
#define RELOP 102
#define LE 201
int yylval, tok;
%}
delim [ \t\n]
ws {delim}+
letter [A-Za-z]
digit [0-9]
id {letter}({letter}|{digit})*
%%
{ws} (/*do nothing */}
if {yylval = 0; return(IF); }
{id} {yylval = install_id(); return(ID); }
"<=" {yylval = LE; return(RELOP); }
%%
int install_id() {return(1);}
int yywrap() {return(0);}
main(){while(1){tok = yylex(); printf("%d %d\n", tok, yylval);}}
이 친구를 winflexbison이라는 프로그램을 통해 .c 파일로 변환하고, 그 파일을 빌드하여 .exe 실행파일을 만들어낸다.
그리고 여기에서
while, for, switch, case 토큰을 추가하고,
주석 처리하는 것이 오늘의 실습.
%{
#define WHILE 103
#define FOR 104
#define SWITCH 105
#define CASE 106
%}
%%
if {yylval = 0; return(WHILE); }
for {yylval = 0; return(FOR); }
switch {yylval = 0; return(SWITCH); }
case {yylval = 0; return(CASE); }
각각 이렇게 추가시켜주면 토큰은 처리되고
"//"(.)* (/*do nothing*/)
이렇게 추가시켜주면 주석 처리를 할 수 있다.
--해석--
"//"는 //를 명령어로 해석하지 않고, 글자로 처리한다는 의미
.은 개행이 아닌 모든 문자
*이 붙으면 앞의 문자가 0번 이상 반복
즉, //로 시작하여 개행이 아닌 어떤 문자라도 0번이상 반복되면, 처리하지 않음이다.
'학교 공부 > 컴파일러(3-1)' 카테고리의 다른 글
[컴파일러] 11. 정규언어 (0) | 2023.05.31 |
---|---|
[컴파일러] 10. 형식언어 (0) | 2023.05.30 |
[컴파일러] 9. Yacc (0) | 2023.04.14 |
[컴파일러] 8. Lex (0) | 2023.04.07 |
[컴파일러] 5. 어휘분석 (0) | 2023.03.30 |
Comments