程式中,呼叫Bison和Flex結合的小例子

2021-06-19 09:52:54 字數 1992 閱讀 7471

網上的很多程式,對初次接觸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

[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]#

這個程式說明了兩個表示式: 加法(number function_plus number) 和 減法(number function_minus number)。

主程式:

1

[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]#

在主程式中,為了能夠讓 yylex讀取字串,宣告了 readinputforlexer函式。

根據yacc的約定,yyparse()會去呼叫 yylex()。而yylex()呼叫 readinputforlexer,一次一次地返回給yyparse。

編譯和執行:

yacc -d parser.y

lex lexer.l

gcc -o myparser *.c

./myparser

執行結果:

[root@lex total]# ./myparser

got 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當然可以用其他的方法...