棧的應用 編譯器的符號匹配

2021-07-03 04:03:21 字數 1022 閱讀 8982

演算法

1   從第乙個字元開始掃瞄

2   當遇見普通字元時候忽略,遇見做字元壓入棧。

3    當遇見右符號時候從棧中彈出棧頂符號

匹配成功,繼續讀入下一字元

匹配失敗,立即停止並報錯

成功:所有字元掃瞄完畢,且棧為空

失敗:匹配失敗或者所有字元掃瞄完畢但棧不是空的。

偽**:

int scanner(const char* code)

if( 右符號 )

}i++;

}if( (判斷是否匹配完成,而且棧是空的)

else

消除棧return ret;}**

int scanner(const char* code)

if( isright(code[i]) )//如果是右符號

}i++;

}if( (linkstack_size(stack) == 0) && (code[i] == '\0') )

else

linkstack_destroy(stack);//清空

return ret;

}int isleft(char c)

return ret;

}int isright(char c)

':case '\'':

case '\"':

ret = 1;

break;

default:

ret = 0;

break;

}return ret;

}int match(char left, char right)

');break;

case '\'':

ret = (right == '\'');

break;

case '\"':

ret = (right == '\"');

break;

default:

ret = 0;

break;

}return ret;

}

棧的應用 左右符號匹配

在編譯器中,都有這麼乙個左右符號匹配的功能,這裡通過棧來模擬實現這一功能 這裡採用了 復用的方法,即使用了linkstack鏈棧,詳見 linkstack鏈棧 main.c include include include linkstack.h 判斷是否為左符號 int isleft char c ...

編譯器的符號修飾規則

編譯器編譯源 生成目標檔案時,需要為每乙個變數 函式生成符號,儲存到符號表。在符號表中,每乙個符號必須唯一,因此要求源 中不能存在與其它檔案中的變數名 函式名相同的函式,包括使用到的庫中的函式。為了解決符號名衝突的問題,編譯器會對源 中的符號進行修飾,如unix下編譯生成的符號會在符號名前加下劃線 ...

C語言編譯器的預定義符號

c語言編譯器的預定義符號 line 當前 源 檔案 行號 整數 file 當前正在編譯的檔案的檔名 字串 date 當前日期,以 月月 日日 年年年年 的形式給出 字串 time 當前時間,以 hh mm ss 的格式給出 字串 stdc 如果編譯器符合ansi c標準,該巨集為1,否則為0 std...