C指標原理 12

2021-06-19 15:11:52 字數 1761 閱讀 999

**:

(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完成指標陣列每個元素的賦...