編譯原理 Lex和Bison實現計算器

2021-07-11 03:26:12 字數 1808 閱讀 5351

實現以下步驟, 掌握 flex 和 bison 的工作過程

a) 在 dos 命令提示符下依次執行以下兩行命令 

flex  calc.lex

bison  -ocalc.c  calc.y

b) 編譯執行 calc.c

編譯執行完後:

題目要求:

用 flex 和 bison 實現乙個功能更為強大的計算器,包含以下運算:

a) 加、減、乘、除運算

b) 乘方、開方運算

c) 位運算     – 與 & 、或 |、非 ~...

d) 階乘運算 !  

進一步完善計算器功能,實現對以下語法結構的分析。還可以進一步擴充功能。

12+23*34+sin(45)/cos(56)-67

%

%% /* a-z為變數 */

[a-z]

/* 整數或浮點數 */

[0-9]+\.?|[0-9]*\.[0-9]+

/* 運算子 */

[-+()=/*^@&|~!\n]

sin

cos

/* 空白被忽略 */

[ \t] ;

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

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

%%int yywrap(void)

%token    integer variable sin cos

%left '+' '-'

%left '*' '/'

%left '&'

%left '|'

%right sin cos

%left '^'

%right '@' '~'

%left '!'%%%

program:

program statement '\n'|;

statement:

expr

|variable '=' expr

;expr:

integer

|variable

|expr '+' expr

|expr '-' expr

|expr '*' expr

|expr '/' expr

|expr '^' expr

|'@' expr

|expr '&' expr

|expr '|' expr

|'~' expr

|expr '!' $$ = s;}

|sin '('expr ')'

|cos '('expr ')'

|'('expr')'

;%%void yyerror(char* s)

#include "lex.yy.c"

int main(void)

執行結果:

前端編譯原理 筆記 BISON

bsion文件,下面是中文的位址 上面的是左遞迴,下面的是右遞迴,推薦的是盡量左遞迴的寫法 使用 left,right或者 nonassoc 可以一次宣告乙個記號並指明它的優先順序和結合性.這些被稱做優先順序宣告 precedence declarations 解決中衝突的方法是比較正在考慮的規則和...

編譯原理之初學Lex

初學編譯原理,老師布置了乙個小task 計算乙個文字中的字元數和行數。想著應該沒多難,結果最後因為種種也是搗鼓了蠻久的。不過有一說一倒是感覺這種先寫出一段 再用別的程式跑出來生成新的 之後執行的感覺蠻有意思的。等過兩天寫個yacc看看 或許到時候就不那麼想了。注意以下為.l檔案中的 a z 0 9 ...

編譯原理之 Bison 原始檔結構原理

0x01 參考 我們需要按照bison的要求,書寫bison的源程式 gramma.y 然後由bison把它翻譯為c檔案。因此,bison是編譯程式的翻譯器。bison的原始檔通常由八個部分組成 一.自由定義部分 這部分被bison原封不動地複製到輸出的.c檔案中。二 語法棧的聯合 union 結構...