본문 바로가기

S-DEV/Anti-Virus

Flex & bison

728x90

• 실습

/* just like Unix wc */
%{
int chars=0;
int words=0;
int lines=0;
%}

%%
/* 정규표현식을 이용한 파일내의 글자 갯수 확인 */
[a-zA-Z]+   { words++; chars += strlen(yytext); /* yytext는 앞의 패턴과 일치하는 문자열 */}
\n          { chars++; lines++; }
.           { chars++;}

%%

int main (int argc, char **argv){
    yylex(); /* %%와 %%사이에 있는 패턴 규칙대로 매칭, 동작하는 함수 */
    printf("%8d%8d%8d\n", lines, words, chars);
    return 0;
}

 

 

/* English -> American */

/* 구역 나누기용 => %% */
%%
"colour" { printf("color"); }
"flavour" { printf("flavor"); }
"clever" { printf("smart"); }
"smart" { printf("elegant"); }
"conservative" { printf("liberal"); }


. { printf("%s", yytext); }
%%

/* 위 단어를 제외한 단어들 은 yytext로 들어감 */

 

 

%%
"+" { printf("PLUS\n");}
"-" { printf("MINUS\n");}
"*" { printf("TIMES\n");}
"/" { printf("DIVIDE\n");}
"|" { printf("ABS\n");}
[0-9]+ { printf("NUMBER %s\n", yytext); }
\n { printf("NEWLINE\n"); }
[ \t] { }
. { printf("Mystery character %s\n", yytext); }
%%

 

 

%{
	enum yytokentype {
	NUMBER	=	258,
	ADD	=	259,
	SUB	=	260,
	MUL	=	261,
	DIV	=	262,
	ABS	=	263,
	EOL	=	264
	};

	int	yylval;
%}

%%
"+"	{	return	ADD;}
"-"	{	return	SUB;}
"*"	{	return	MUL;}
"/"	{	return	DIV;}
"|"	{	return	ABS;}
[0-9]+	{	yylval	=	atoi(yytext);	return	NUMBER;}
\n	{	return	EOL;}
[ \t] { /* ignore whitespace */ }
. { printf("Mystery character %c\n", *yytext); }
%%
int main(int argc, char **argv)
{
 int tok;
 while(tok = yylex()) {
 printf("%d", tok);
 if(tok == NUMBER) printf(" = %d\n", yylval);
 else printf("\n");
 }
}

 

• 계산기 

 

/* fb1-5.y 파일 */
/* simplest version of calculator */
%{
#include <stdio.h>
%}
/* declare tokens */
%token NUMBER
%token ADD SUB MUL DIV ABS
%token EOL
%token OP CP
/*괄호 닫고 여는 토큰값 추가*/
%%
/* 계산식 시작 */
calclist: /* nothing */ 
 | calclist exp EOL { printf("= %d\n", $2); }
 | calclist EOL { }
 ; /* ;(세미콜론) 이 조건이 끝남을 의미; $2 : 2번째 인자 ; 공백도 처리*/
exp: factor 
 | exp ADD factor { $$ = $1 + $3; }
 | exp SUB factor { $$ = $1 - $3; }
 ; /*$$: 자기 자신을 표현함 */
factor: term
 | factor MUL term { $$ = $1 * $3; }
 | factor DIV term { $$ = $1 / $3; }
 ;
term: NUMBER 
 | ABS term { $$ = $2 >= 0? $2 : - $2; }
 | OP exp CP { $$ = $2;}
;  /* term 은 절대값을 의미함*/
%%
int main(int argc, char **argv)
{
 yyparse();
 return 0;
}
yyerror(char *s)
{
 fprintf(stderr, "error: %s\n", s);
}/*stderr : 표준 에러: -> 에러의 내용을 출력해주도록 함*/
/* fb1-5.l 파일 */
%{
# include "fb1-5.tab.h"
%}

%%
"+"	{	return	ADD;}
"-"	{	return	SUB;}
"*"	{	return	MUL;}
"/"	{	return	DIV;}
"|"	{	return	ABS;}
[0-9]+	{	yylval	=	atoi(yytext);	return	NUMBER;}
\n	{	return	EOL;}
"(" { return OP; }
")" { return CP; }
"//".* /* ignore comments */
[ \t] { /* ignore whitespace */ }
. { printf("Mystery character %c\n", *yytext); }
%%
# Makefile 파일 
fb1-5: fb1-5.l fb1-5.y
	bison -d fb1-5.y
	flex fb1-5.l
	gcc -o $@ fb1-5.tab.c lex.yy.c -lfl
# 직접 칠때는 아래처럼
# gcc -o fb1-5 fb1-5.tab.c lex.yy.c -lfl

make 할때 에러가 출력되지만 암묵적 선언이라는 에러이므로 상관 없다.

 

'S-DEV > Anti-Virus' 카테고리의 다른 글

Yara 프로젝트  (0) 2023.10.29
Anti-Virus - 1  (0) 2023.07.30
Anit-Virus - 0  (0) 2023.07.30