๊ธฐ๋ณธ ๊ฐ๋
"flex & bison"์ ์ปดํ์ผ๋ฌ์ ์ธํฐํ๋ฆฌํฐ ๊ตฌ์ถ์ ์ฌ์ฉ๋๋ ๋๊ตฌ์ ๋๋ค. ์ด๋ฌํ ๋๊ตฌ๋ค์ ์ฃผ๋ก ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ ์คํฌ๋ฆฝํธ ์ธ์ด์ ๊ฐ์ ๊ณ ๊ธ ์ธ์ด๋ฅผ ๊ธฐ๊ณ์ด๋ก ๋ฒ์ญํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ์ํํธ์จ์ด ๊ฐ๋ฐ์๋ค์ ์์ฒด ์ธ์ด๋ฅผ ๋ง๋ค๊ณ , ์์ค ์ฝ๋๋ฅผ ๋ถ์ํ๊ฑฐ๋ ์ปดํ์ผ๋ฌ๋ฅผ ์์ฑํ๋ ๋ฐ ๋์์ ๋ฐ์ ์ ์์ต๋๋ค.
Flex (Fast Lexical Analyzer Generator)
- Flex๋ ์ ๋ ฅ์ผ๋ก๋ถํฐ ํ ํฐ์ ์ธ์ํ๊ณ ๋ถ๋ฆฌํ๋ ๋ ์(lexical analyzer)๋ฅผ ์์ฑํ๋ ๋๊ตฌ์ ๋๋ค.
- ํ ํฐ์ ์ธ์ด์์ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ ์ต์ํ์ ๋จ์๋ก, ๋ณ์, ์์, ์ฐ์ฐ์ ๋ฑ์ด ํ ํฐ์ด ๋ ์ ์์ต๋๋ค.
- Flex๋ฅผ ์ฌ์ฉํ๋ฉด ์ ๊ท ํํ์๊ณผ ์์ค ์ฝ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ๋ ์๋ฅผ ์์ฑํ์ฌ ์ธ์ด์ ๊ตฌ๋ฌธ์ ๋ถ์ํ๊ณ ํ ํฐ์ ์ถ์ถํ ์ ์์ต๋๋ค.
Bison (GNU Bison)
- Bison์ ๋ฌธ๋ฒ ๊ท์น์ ๋ฐ๋ผ ์์ค ์ฝ๋๋ฅผ ๋ถ์ํ์ฌ ์ปดํ์ผ๋ฌ ๋๋ ์ธํฐํ๋ฆฌํฐ๋ฅผ ์์ฑํ๋ ํ์(parser) ์์ฑ๊ธฐ์ ๋๋ค.
- ์ด๋ฌํ ํ์๋ฅผ ํตํด ์ธ์ด์ ๊ตฌ๋ฌธ์ ์ดํดํ๊ณ ๊ทธ์ ๋ฐ๋ผ ์ ์ ํ ์์ ์ ์ํํ ์ ์์ต๋๋ค.
- Bison์ ๋ฌธ๋ฒ ๊ท์น์ ๊ธฐ๋ฐ์ผ๋ก ์๋์ผ๋ก ํ์ฑ ํ ์ด๋ธ์ ์์ฑํ์ฌ ์์ค ์ฝ๋๋ฅผ ํ์ฑํฉ๋๋ค.
ํ๊ฒฝ์ธํ
Linux
% sudo apt-get update
% sudo apt install flex
% sudo apt install bison
Mac
// for intel chip
% brew install bison
// for m1 chip
% arch -arm64 brew install bison
Flex์ ์ฝ๋ ๊ตฌ์กฐ
Flex ํ๋ก๊ทธ๋จ์ %%์ค๋ก ๊ตฌ๋ถ๋ ์ธ ๊ฐ์ ์น์ ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค
์ฒซ ๋ฒ์งธ ์น์ ์๋ ์ ์ธ ๋ฐ ์ต์ ์ค์ ์ด ํฌํจ๋์ด ์์ต๋๋ค. ๋ ๋ฒ์งธ ์น์ ์ ํจํด ๋ฐ ์์ ๋ชฉ๋ก์ด ์ธ ๋ฒ์งธ ์น์ ์ ์์ฑ๋ ์ค์บ๋์ ๋ณต์ฌ๋๋ C ์ฝ๋์ด๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ์์ ์ ์ฝ๋๋ฅผ ํตํด ์คํ ์์๋ฅผ ๋ํ๋ ๋๋ค.
- Example 1-1. Word Count fb1-1.l
/* ์ ์ธ๋ถ */
%{
int chars = 0;
int words = 0;
int lines = 0;
%}
%%
/* ์์
๋ถ */
[a-zA-Z]+ { words++; chars += strlen(yytext); }
\\n { chars++; lines++; }
. { chars++; }
%%
/* ์คํ๋ถ */
main(int argc, char **argv)
{
yylex();
printf("%8d%8d%8d\\n", lines, words, chars);
}
1. ์ ์ธ๋ถ
์ ์ธ๋ถ์์ %{ ๋ด๋ถ์ ์ฝ๋๋ %} ์์ฑ๋ C ์์ค ํ์ผ์ ์์ ๋ถ๋ถ์ ๋ณต์ฌ๋ฉ๋๋ค. ์์ ์ฝ๋์ ๊ฒฝ์ฐ chars, words, lines์ ๋ํ ์ ์ํ ๋ณ์๋ง ์ค์ ํฉ๋๋ค.
2. ์์ ๋ถ
์์ ๋ถ์์ ๊ฐ ํจํด์ด ์ค์ ์์ ๋ถ๋ถ์ ์๊ณ ๊ทธ ๋ค์ ํจํด์ด ์ผ์นํ ๋ ์คํํ C ์ฝ๋๊ฐ ์์ต๋๋ค. C ์ฝ๋๋ ํ๋์ ๋ช ๋ น๋ฌธ์ด๊ฑฐ๋ ์ค๊ดํธ{ }๋ก ๋ฌถ์ธ ์ฌ๋ฌ ์ค ๋ธ๋ก์ผ ์ ์์ต๋๋ค.
์์ ์ฝ๋์ ํจํด์ ๋ณด๋ฉด [a-zA-Z]+ โ ํ๋ ์ด์์ ์ํ๋ฒณ์ธ ๊ฒฝ์ฐ, words, chars์ ์๋ฅผ ์ฆ๊ฐ์ํต๋๋ค.
yytext โ ๋ฐฉ๊ธ ์ผ์นํ ์ ๋ ฅ ํ ์คํธ๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.
\\n โ ์์ค์ด ์ถ๊ฐ๋๋ ๊ฒฝ์ฐ, chars์ lines์ ์๋ฅผ ์ฆ๊ฐ์ํต๋๋ค.
. โ ๋ชจ๋ ๋ฌธ์์ ๋ํด, chars์ ์๋ฅผ ์ฆ๊ฐ์ํต๋๋ค.
3. ์คํ๋ถ
์คํ๋ถ์ C ์ฝ๋๋ flex์ ํจ๊ป ์์ฑ๋ lexical ๋ฅผ ์คํํ๋ ํ๋ก๊ทธ๋จ์ ๋๋ค.
yylex() ์ฃผ๋ก Flex์์ ์์ฑ๋ lexical๋ฅผ ํธ์ถํ๋ ์ญํ ์ ์ํํ๋ ํจ์์ ๋๋ค. ์ด ํจ์๋ ์์ค ์ฝ๋๋ ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด ๋ค์ฌ ๋ฏธ๋ฆฌ ์ ์๋ ๊ท์น์ ๋ฐ๋ผ ํ ํฐ์ผ๋ก ๋ถ๋ฆฌํ๋ ์ญํ ์ ํฉ๋๋ค.
์ฝ๋ ์คํ
$ flex fb1-1.l
$ cc lex.yy.c -lfl
$ ./a.out
The boy stood on the burning deck
shelling peanuts by the peck
^D
2 12 63
$
์ฐธ๊ณ ๋ฌธ์
https://web.iitd.ac.in/~sumeet/flex__bison.pdf
GitHub - jmparis/flex-bison-oreilly: Flex and bison sample code
GitHub - jmparis/flex-bison-oreilly: Flex and bison sample code
Flex and bison sample code. Contribute to jmparis/flex-bison-oreilly development by creating an account on GitHub.
github.com
youtube.com/@RyuJT658/videos?view=0&sort=dd&shelf_id=0
๋ฅ์ข ํ
www.youtube.com
'๐ดโโ ๏ธ CTF ๐ดโโ ๏ธ > ๐พ ํฌ๋๋ธ ๐พ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
WinRAR ์ทจ์ฝ์ ์ค์ต (0) | 2024.04.04 |
---|