在unix中lex and yacc是內建,但在ubuntu中要自己install flex 和 bison(據說flex and biosn 比 lex and yacc好)
sudo apt-get install flex
sudo apt-get install bison
並使用以下的指令來編譯:
flex test.l
bison -d test.y
gcc -g lex.yy.c y.tab.c -lfl -lm其中,第二行-d是為了產生y.tab.h,給*.l檔include用;第三行 -lm不是必然要寫,若你寫的程式中包含了math.h中等數學函式,可能就要加 -lm,而-lfl是為了include lex library
code
寫完心得:
lex - 定義有意義的字串,將input的字串分類,並將yacc需要的字串傳給yacc。
yacc - 定義需要的字串(token),並將接收到的字串放入stack中,透過BNF,pop 需要計算的element和operator,計算完畢後再push到stack中,直到stack只剩下一個element,其值即為計算結果。
卡最久的大概就是 $$,$1,$2,.. 的使用,以下列為例:
expression '+' term { $$ = $1 + $3; }$1:為 expression (pop stack[top-2])
$2:為 + (pop stack[top-1])
$3:為 term (pop stack[top])
$$:為計算後的值 (push stack)
