演算法
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...