**:
(2)擴充計算器
加入對括號和注釋的支援,
首先修改flex
檔案,在第二部分加入更多的詞法規則
(對於注釋直接忽略):
"("
")"
"#".* /*忽略注釋*/
然後,修改bison
term:number
|abs term
|leftbracket exp rightbracket
;我們的注釋以「#
」表示
測試結果
myhaspl@myhaspl:~/flex_bison/2$ make
bison -d calculator.y
flex calculator.l
gcc calculator.tab.c lex.yy.c -lfl
myhaspl@myhaspl:~/flex_bison/2$ ls
a.out calculator.tab.c calculator.y makefile
calculator.l calculator.tab.h lex.yy.c
myhaspl@myhaspl:~/flex_bison/2$ ./a.out
12-36*10/(1+2+3)#compute
=-48
^cmyhaspl@myhaspl:~/flex_bison/2$
前面都是以鍵盤輸入 的方式進行計算器運算,我們下面以檔案方式提供給該直譯器進行計算,首先,將flex檔案改為(將其中中文去除,然後對於非法字元的出現進行忽略):%%%
"+"
"-"
"*"
"/"
"|"
"("
")"
"#".* /*comment*/
[0-9]+
\n
[ \t] /*blank*/
. /*invalid char*/
%接著,改bison檔案,加入對檔案的讀寫
%%token number
%token add sub mul div abs leftbracket rightbracket
%token eol
%%calclist:/**/
|calclist exp eol
;exp:factor
|exp add factor
|exp sub factor
;factor:term
|factor mul term
|factor div term
;term:number
|abs term
|leftbracket exp rightbracket ;%%
main(int argc,char **argv)
else{
for(i=1;i
最後 測試一下
root@myhaspl:~/test/3# make
bison -d calculator.y
flex calculator.l
gcc calculator.tab.c lex.yy.c -lfl
root@myhaspl:~/test/3# ./a.out mycpt1.cpt mycpt2.cpt
=158
=-8root@myhaspl:~/test/3#
其中兩個cpt檔案內容類似 為:
12*66/(10-5)
C指標原理 5
plain view plain copy print?section data myvalue byte 67,68,69,70,0 mygs asciz c n section text globl main main 基位址 偏移位址 必須為暫存器 資料元素變址,資料元素長度 必須為暫存器 基...
C指標原理 6
內聯彙編的重要性體現在它能夠靈活操作,而且可以使其輸出通過 c 變數顯示出來。因為它具有這種能力,所以 asm 可以用作彙編指令和包含它的 c 程式之間的介面。簡單得說,內聯彙編,就是可以讓程式設計師在c語言中直接嵌入彙編 並與彙編 互動c程式中的c表示式,享受彙編的高執行效率。內聯彙編的格式是直接...
C指標原理(18) C指標基礎
5 指標陣列 指標陣列就是陣列裡存放的是指標。include int main void for i 0 i 10 i return 1 上面定義了乙個指標陣列,陣列的每個元素都是指標,每個指標指向x陣列的相應元素。其中,p x為指標陣列,通過for迴圈中的p x i x i完成指標陣列每個元素的賦...