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 |