實現以下步驟, 掌握 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 結構...