使用bison和flex工具 zz

2021-06-19 09:52:54 字數 1351 閱讀 8724

這裡有乙個使用bison建立乙個簡單的計算器的例子:

使用bison和flex工具學習編譯原理,遠比單獨看書然後自己編寫一些程式生動的多。這樣你就不會在那些複雜的字元處理,正規表示式的處理上浪費精力,最後費盡心力,卻沒有結果,失去了學習的興趣。

我這裡有乙個簡單的計算器的程式,可以實現加、減、乘、除運算,並支援括號的處理和26個字母作為變數。以前自己使用字尾表示式方式寫過乙個這樣的程式,單單中綴表示式改為字尾表示式就是幾百行的**,反正自己現在還是不知道怎麼處理裡面複雜的堆疊的(我用了stl的list實現)。

詞法處理檔案calc.lex內容如下:%%%

/* a-z為變數 */

[a-z]   

/* 整數 */

[0-9]+   

/* 運算子 */

[-+()=\*\n]   

/* 空白被忽略 */

[ /t]    ;

/* 其他字元都是非法的 */

.    yyerror("無效的輸入字元");

%%int    yywrap(void)

詞法處理的目標就是區分出來每個成員到底是什麼,這裡有兩種 integer和variable。只要區分出來各個成分詞法分析的任務就完成了。

語法處理檔案calc.y內容如下:

%token    integer variable

%left    '+' '-'

%left    '*' '/'%%%

program:

program statement '\n'|;

statement:

expr   

|variable '=' expr   

;expr:

integer

|variable

|expr '+' expr   

|expr '-' expr   

|expr '*' expr   

|expr '/' expr   

|'('expr')'    ;%%

void yyerror(char* s)

int main(void)

語法分析檔案的寫法就是將bnf表示式描述一下即可,規則隨著條目逐漸細化,變成了可以理解的內容。這裡不用管如何實現這些語法的分析,只是需要告知如何構建這些語法。

編譯命令如下:

>bison -d calc.y

>flex calc.lex

>gcc calc.tab.c lex.yy.c -o calc

yyparse 是bison生成的函式,用於解析語法,同時yylex是flex生成的函式,用於解析詞法,bison生成的函式呼叫yylex不斷處理,處理出來適合的表示式,之後計算.

使用flex和bison實現的sql引擎解析

由於老師要求,最近在做oceanbase儲存過程的實現,在oceanbase 0.4以前是不支援儲存過程的。實現的主要步驟主要包括 現在先來說說語法解析吧,在這一塊主要是使用的flex 詞法分析器生成工具 和bison 語法分析器生成器 這兩個是對使用者輸入的儲存過程語句進行解析的 來具體說說該怎麼...

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

網上的很多程式,對初次接觸bison和flex的人而言,都有點複雜,看最簡單的例子更好些 我稍微修改一下,說說自己的理解,也作為乙個備忘 flex程式 1 root lex total cat lexer.l 2 12 13 digit 0 9 14 1516 17 18 19 2021 22voi...

利用 flex 和 bison 寫乙個計算器

實現實數範圍內的加減乘除 乘方 開方,三角函式sin cos運算 a 在命令提示符下依次執行一下兩行命令 flex 檔名.lex bison o檔名.c 檔名.y編譯的話,可用命令提示符,不過需要自己搭建環境 gcc o 可執行程式名稱 lex.yy.c bison生成的檔名.c當然可以用其他的方法...