網上的很多程式,對初次接觸bison和flex的人而言,都有點複雜,看最簡單的例子更好些:
我稍微修改一下,說說自己的理解,也作為乙個備忘:
flex程式:
1這個程式說明了數字、加號、減號的識別規則[root@lex total]# cat lexer.l
2 %12
13 digit [0-9
]14 %%
1516 \+
17 \-
18 *
19 %%
2021
22void yyerror(char*s)
2526
intyywrap()
29 [root@lex total]#
同時,為了讓yylex()可以讀入字串而不是讀入檔案,覆蓋了 yy_input。
bison(yacc)程式:
1這個程式說明了兩個表示式: 加法(number function_plus number) 和 減法(number function_minus number)。[root@lex total]# cat parser.y
2 %8
9 %token function_plus function_minus number
1011 %%
1213
expression:
14 number function_plus number
15 |
16 number function_minus number 17;
18 %%
19 [root@lex total]#
主程式:
1在主程式中,為了能夠讓 yylex讀取字串,宣告了 readinputforlexer函式。[root@lex total]# cat myparser.c
2 #include 3 #include 45
intyyparse();
6int readinputforlexer( char *buffer, int *numbytesread, int
maxbytestoread );78
static
intglobalreadoffset;9//
text to read:
10static
const
char *globalinputtext = "
23 - 5";
1112
intmain()
1718
int readinputforlexer( char *buffer, int *numbytesread, int
maxbytestoread )
23for ( i = 0; i < numbytestoread; i++)
26 *numbytesread =numbytestoread;
27 globalreadoffset +=numbytestoread;
28return0;
29}30 [root@lex total]#
根據yacc的約定,yyparse()會去呼叫 yylex()。而yylex()呼叫 readinputforlexer,一次一次地返回給yyparse。
編譯和執行:
yacc -d parser.y執行結果:lex lexer.l
gcc -o myparser *.c
./myparser
[root@lex total]# ./myparsergot number
got minus
got number
got minus expression! yay![root@lex total]#
使用bison和flex工具 zz
這裡有乙個使用bison建立乙個簡單的計算器的例子 使用bison和flex工具學習編譯原理,遠比單獨看書然後自己編寫一些程式生動的多。這樣你就不會在那些複雜的字元處理,正規表示式的處理上浪費精力,最後費盡心力,卻沒有結果,失去了學習的興趣。我這裡有乙個簡單的計算器的程式,可以實現加 減 乘 除運算...
使用flex和bison實現的sql引擎解析
由於老師要求,最近在做oceanbase儲存過程的實現,在oceanbase 0.4以前是不支援儲存過程的。實現的主要步驟主要包括 現在先來說說語法解析吧,在這一塊主要是使用的flex 詞法分析器生成工具 和bison 語法分析器生成器 這兩個是對使用者輸入的儲存過程語句進行解析的 來具體說說該怎麼...
利用 flex 和 bison 寫乙個計算器
實現實數範圍內的加減乘除 乘方 開方,三角函式sin cos運算 a 在命令提示符下依次執行一下兩行命令 flex 檔名.lex bison o檔名.c 檔名.y編譯的話,可用命令提示符,不過需要自己搭建環境 gcc o 可執行程式名稱 lex.yy.c bison生成的檔名.c當然可以用其他的方法...