锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
涓嬮潰鏄竴涓緥瀛愶細
//紼嬪簭錛歴et婕旂ず
//鐩殑錛氱悊瑙TL涓殑闆嗗悎錛坰et錛?br>
#include 錛渟tring錛?br>#include 錛渟et錛?br>#include 錛渋ostream錛?br>using namespace std;
int main(int argc, char* argv[])
{
set 錛渟tring錛?strset;
set 錛渟tring錛?:iterator si;
strset.insert("cantaloupes");
strset.insert("apple");
strset.insert("orange");
strset.insert("banana");
strset.insert("grapes");
strset.insert("grapes");
for (si=strset.begin(); si!=strset.end(); si++)
{ cout 錛滐紲 *si 錛滐紲 " "; }
cout 錛滐紲 endl;
return 0;
}
// 杈撳嚭錛?apple banana cantaloupes grapes orange
//娉ㄦ剰錛氳緭鍑虹殑闆嗗悎涓殑鍏冪礌鏄寜瀛楁瘝澶у皬欏哄簭鎺掑垪鐨勶紝鑰屼笖姣忎釜鍊奸兘涓嶉噸澶嶃?
濡傛灉浣犳劅鍏磋叮鐨勮瘽錛屼綘鍙互灝嗚緭鍑哄驚鐜敤涓嬮潰鐨勪唬鐮佹浛鎹細
copy(strset.begin(), strset.end(), ostream_iterator錛渟tring錛?cout, " "));
.闆嗗悎錛坰et錛夎櫧鐒舵洿寮哄ぇ錛屼絾鎴戜釜浜鴻涓哄畠鏈変簺涓嶆竻鏅扮殑鍦版柟鑰屼笖鏇村鏄撳嚭閿欙紝濡傛灉浣犳槑鐧戒簡榪欎竴鐐癸紝浣犱細鐭ラ亾鐢ㄩ泦鍚堬紙set錛夊彲浠ュ仛浠涔堛?br>
鎵鏈夌殑STL瀹瑰櫒
瀹瑰櫒錛圕ontainer錛夌殑姒傚康鐨勫嚭鐜版棭浜庢ā鏉匡紙template錛夛紝瀹冨師鏈槸涓涓綆楁満縐戝棰嗗煙涓殑涓涓噸瑕佹蹇碉紝浣嗗湪榪欓噷錛屽畠鐨勬蹇靛拰STL娣峰悎鍦ㄤ竴璧蜂簡銆備笅闈㈡槸鍦⊿TL涓嚭鐜扮殑7縐嶅鍣細
vector錛堝悜閲忥級鈥斺擲TL涓爣鍑嗚屽畨鍏ㄧ殑鏁扮粍銆傚彧鑳藉湪vector 鐨?#8220;鍓嶉潰”澧炲姞鏁版嵁銆?br>
deque錛堝弻绔槦鍒梔ouble-ended queue錛夆斺斿湪鍔熻兘涓婂拰vector鐩鎬技錛屼絾鏄彲浠ュ湪鍓嶅悗涓ょ鍚戝叾涓坊鍔犳暟鎹?
list錛堝垪琛級鈥斺旀父鏍囦竴嬈″彧鍙互縐誨姩涓姝ャ傚鏋滀綘瀵歸摼琛ㄥ凡緇忓緢鐔熸?zhèn)夊Q岄偅涔圫TL涓殑list鍒欐槸涓涓弻鍚戦摼琛紙姣忎釜鑺傜偣鏈夋寚鍚戝墠椹卞拰鎸囧悜鍚庣戶鐨勪袱涓寚閽堬級銆?br>
set錛堥泦鍚堬級鈥斺斿寘鍚簡緇忚繃鎺掑簭浜嗙殑鏁版嵁錛岃繖浜涙暟鎹殑鍊?value)蹇呴』鏄敮涓鐨勩?br>
map錛堟槧灝勶級鈥斺旂粡榪囨帓搴忎簡鐨勪簩鍏冪粍鐨勯泦鍚堬紝map涓殑姣忎釜鍏冪礌閮芥槸鐢變袱涓肩粍鎴愶紝鍏朵腑鐨刱ey錛堥敭鍊鹼紝涓涓猰ap涓殑閿煎繀欏繪槸鍞竴鐨勶級鏄湪鎺掑簭 鎴栨悳绱㈡椂浣跨敤錛屽畠鐨勫煎彲浠ュ湪瀹瑰櫒涓噸鏂拌幏鍙栵紱鑰屽彟涓涓兼槸璇ュ厓绱犲叧鑱旂殑鏁板箋傛瘮濡傦紝闄や簡鍙互ar[43] = "overripe"榪欐牱鎵懼埌涓涓暟鎹紝map榪樺彲浠ラ氳繃ar["banana"] = "overripe"榪欐牱鐨勬柟娉曟壘鍒頒竴涓暟鎹傚鏋滀綘鎯寵幏寰楀叾涓殑鍏冪礌淇℃伅錛岄氳繃杈撳叆鍏冪礌鐨勫叏鍚嶅氨鍙互杞繪澗瀹炵幇銆?br>
multiset錛堝閲嶉泦錛夆斺斿拰闆嗗悎錛坰et錛夌浉浼鹼紝鐒惰屽叾涓殑鍊間笉瑕佹眰蹇呴』鏄敮涓鐨勶紙鍗沖彲浠ユ湁閲嶅錛夈?br>
multimap錛堝閲嶆槧灝勶級鈥斺斿拰鏄犲皠錛坢ap錛夌浉浼鹼紝鐒惰屽叾涓殑閿間笉瑕佹眰蹇呴』鏄敮涓鐨勶紙鍗沖彲浠ユ湁閲嶅錛夈?br>娉ㄦ剰錛氬鏋滀綘闃呰寰蔣鐨勫府鍔╂枃妗o紝浣犱細閬囧埌瀵規(guī)瘡縐嶅鍣ㄧ殑鏁堢巼鐨勯檲榪般傛瘮濡傦細log(n*n)鐨勬彃鍏ユ椂闂淬傞櫎闈炰綘瑕佸鐞嗗ぇ閲忕殑鏁版嵁錛屽惁鍒欒繖浜涙椂闂寸殑褰卞搷鏄彲 浠ュ拷鐣ョ殑銆傚鏋滀綘鍙戠幇浣犵殑紼嬪簭鏈夋槑鏄劇殑婊炲悗鎰熸垨鑰呴渶瑕佸鐞嗘椂闂存敻鍏籌紙time critical錛夌殑浜嬫儏錛屼綘鍙互鍘諱簡瑙f洿澶氭湁鍏沖悇縐嶅鍣ㄨ繍琛屾晥鐜囩殑璇濋銆?br>
鎬庢牱鍦ㄤ竴涓猰ap涓嬌鐢ㄧ被錛?br>
Map鏄竴涓氳繃key錛堥敭錛夋潵鑾峰緱value(鍊?鐨勬ā鏉跨被銆?br>
鍙︿竴涓棶棰樻槸浣犲笇鏈涘湪map涓嬌鐢ㄨ嚜宸辯殑綾昏屼笉鏄凡鏈夌殑鏁版嵁綾誨瀷錛屾瘮濡傜幇鍦ㄥ凡緇忕敤榪囩殑int銆傚緩绔嬩竴涓?#8220;涓烘ā鏉垮噯澶囩殑錛坱emplate-ready錛?#8221;綾伙紝浣犲繀欏葷‘淇濆湪璇ョ被涓寘鍚竴浜涙垚鍛樺嚱鏁板拰閲嶈澆鎿嶄綔絎︺備笅闈㈢殑涓浜涙垚鍛樻槸蹇呴』鐨勶細
緙虹渷鐨勬瀯閫犲嚱鏁幫紙閫氬父涓虹┖錛?br>
鎷瘋礉鏋勯犲嚱鏁?br>
閲嶈澆鐨?#8221;=”榪愮畻絎?br>
浣犲簲璇ラ噸杞藉敖鍙兘澶氱殑榪愮畻絎︽潵婊¤凍鐗瑰畾妯℃澘鐨勯渶瑕侊紝姣斿錛屽鏋滀綘鎯沖畾涔変竴涓被浣滀負 map涓殑閿紙key錛夛紝浣犲繀欏婚噸杞界浉鍏崇殑榪愮畻絎︺備絾鍦ㄨ繖閲屼笉瀵歸噸杞借繍綆楃鍋氳繃澶氳璁轟簡銆?br>
//紼嬪簭錛氭槧灝勮嚜瀹氫箟鐨勭被銆?br>//鐩殑錛氳鏄庡湪map涓庢牱浣跨敤鑷畾涔夌殑綾匯?br>
#include 錛渟tring錛?br>#include 錛渋ostream錛?br>#include 錛渧ector錛?br>#include 錛渕ap錛?br>using namespace std;
class CStudent
{
public :
int nStudentID;
int nAge;
public :
//緙虹渷鏋勯犲嚱鏁扳斺旈氬父涓虹┖
CStudent() { }
// 瀹屾暣鐨勬瀯閫犲嚱鏁?br>CStudent(int nSID, int nA) { nStudentID=nSID; nAge=nA; }
//鎷瘋礉鏋勯犲嚱鏁?br>CStudent(const CStudent& ob)
{
nStudentID=ob.nStudentID; nAge=ob.nAge; }
// 閲嶈澆“=”
void operator = (const CStudent& ob)
{
nStudentID=ob.nStudentID; nAge=ob.nAge;
}
};
int main(int argc, char* argv[])
{
map 錛渟tring, CStudent錛?mapStudent;
mapStudent["Joe Lennon"] = CStudent(103547, 22);
mapStudent["Phil McCartney"] = CStudent(100723, 22);
mapStudent["Raoul Starr"] = CStudent(107350, 24);
mapStudent["Gordon Hamilton"] = CStudent(102330, 22);
// 閫氳繃濮撳悕鏉ヨ闂瓹student綾諱腑鐨勬垚鍛?br>cout 錛滐紲 "The Student number for Joe Lennon is " 錛滐紲
(mapStudent["Joe Lennon"].nStudentID) 錛滐紲 endl;
return 0;
}
TYPEDEF
濡傛灉浣犲枩嬈嬌鐢╰ypedef鍏抽敭瀛楋紝涓嬮潰鏄釜渚嬪瓙錛?br>
typedef set 錛渋nt錛?SET_INT;
typedef SET_INT::iterator SET_INT_ITER
緙栧啓浠g爜鐨勪竴涓範鎯氨鏄嬌鐢ㄥぇ鍐欏瓧姣嶅拰涓嬪垝綰挎潵鍛藉悕鏁版嵁綾誨瀷銆?br>
ANSI / ISO瀛楃涓?br>
ANSI/ISO瀛楃涓插湪STL瀹瑰櫒涓嬌鐢ㄥ緱寰堟櫘閬嶃傝繖鏄爣鍑嗙殑瀛楃涓茬被錛屽茍寰楀埌浜嗗箍娉涘湴鎻愬★紝鐒惰屽湪緙轟箯鏍煎紡澹版槑鐨勬儏鍐典笅灝變細鍑洪棶棰樸備綘蹇呴』浣跨敤“錛滐紲”鍜岃緭鍏ヨ緭鍑烘祦錛坕ostream錛変唬鐮侊紙濡俤ec, width絳夛級灝嗗瓧絎︿覆涓茶仈璧鋒潵銆?br>
鍙湪蹇呰鐨勬椂鍊欎嬌鐢╟_str()鏉ラ噸鏂拌幏寰楀瓧絎︽寚閽堛?
]]>
榪欐槸鍙︿竴閮ㄥ洜灝侀潰寰楀悕鐨勪功--“榫欎功”錛屼篃灝辨槸Aho絳変漢鎵钁楃殑銆婄紪璇戝師鐞嗘妧鏈笌宸ュ叿銆嬶紙Addison錛峎esley錛?986錛屼漢姘戦偖鐢?shù)鍑虹増绀?002騫村獎鍗扮増錛夈侫ho鏄疉CM浼氬憳濂栧緱涓伙紝榪樹笌涓婅堪Hopcroft鍚堣憲榪囥婃暟鎹粨鏋勪笌綆楁硶銆嬬瓑鍚嶄綔錛屼絾浠栨渶浜嗕笉璧風殑钁椾綔鎭愭曡繕鏄繖涓閮ㄣ傛墍璋?#8220;榫欎功”錛岃鍏ㄤ簡搴旇鏄?#8220;灞犻緳瀹濅功”錛屽洜涓哄皝闈笂鐢葷潃涓鏉$孩榫欏拰涓浣嶉獞澹傝タ鏂逛漢鐪奸噷錛岄緳閮芥槸鎭墮緳錛屾槸濡栭偑涔嬬墿錛岃岃繖鏉¢緳韜笂鍗村啓鐫“緙栬瘧鍣ㄨ璁″鏉傚害”鐨勫瓧鏍鳳紒閭d箞楠戝+鍙堜細鐢ㄤ綍縐嶆硶瀹濊繋鎴樺憿錛熷彧瑙佷粬鎶潃“鏁版嵁嫻佸垎鏋?#8221;閾犵敳錛屾専鐫“LALR鍒嗘瀽鍣ㄧ敓鎴愬櫒”闀垮墤錛屾蹇欑潃鍦ㄤ竴鍙扮粓绔墠杈撳叆鍛紝鏁㈡儏鏄釜楂樼鎶姝﹀+錛佽繖閮?#8220;榫欎功”錛屼漢浜鴻皥璧烽兘瑕佺毐鐪夛紝鍒楀嚭涓鍫嗙墷楠氾紙姒傚康瀹氫箟涓嶆竻鏅板憖錛屽浣嶄綔鑰呭垎宸ヤ笉鏄庣‘鍛錛夛紝浣嗘病浜鴻兘緇曡繃瀹冭皥緙栬瘧鍘熺悊錛氭瘯绔?#8220;緙栬瘧鍣ㄨ璁?#8221;榪欐潯鎭墮緳澶姣掞紝鑰屾涔﹁繕鏄睜榫欑殑鏈浣蟲寚鍗椼?
鏈夋剰鎬濈殑鏄紝璇ヤ功3浣嶄綔鑰呬腑鐨勪袱浣嶆鍓嶈繕鍚堜綔榪囧彟涓鏈婄紪璇戝櫒璁捐鍘熷垯銆嬶紝灝侀潰涓婂悓鏍鋒槸瀵瑰硻鐨勬伓榫欏拰鍕囧+錛屽彧涓嶈繃閭f椂浠栦滑榪樻病寮鎵擄紝浠呬粎鎬掔洰鐩稿悜鑰屽凡銆備負浜嗗尯鍒紝浜轟滑鎶婃棭鍏堢殑榪欐湰縐頒負“緇塊緳涔?#8221;錛岃屽悗鏉ュ悕澹版洿澶х殑榪樻槸“綰㈤緳涔?#8221;銆備粠緇塊緳鍒扮孩榫欙紝浠庢掕鍒頒氦鎵嬶紝涔熻灝侀潰涓婄殑鍐茬獊紼嬪害涔熶綋鐜頒簡緙栬瘧鍣ㄩ鍩熺殑鐮旂┒榪涘睍鍚с?nbsp;

鏌愭棩灝忔槑涓婃暟瀛﹁錛屼粬鐨勮佸笀緇欎簡寰堝涓笉鍚岀殑鐩磋涓夎鏉胯灝忔槑鐢ㄥ昂瀛愬幓閲忎笁瑙掓澘鐨勪笁涓竟錛屽茍灝嗛暱搴﹁褰曚笅鏉ャ備袱涓皬鏃惰繃鍘伙紝灝忔槑瀹屾垚浠誨姟錛屾妸鏁版嵁鎷跨粰鑰佸笀銆傝佸笀緇欎粬璇達紝榪樻湁涓涓換鍔″氨鏄瀵熶笁鏉¤竟涔嬮棿鐨勬暟閲忓叧緋匯傚張鏄袱涓皬鏃訛紝鑱槑鐨勫皬鏄庤繛韞﹀甫璺寵蛋榪涗簡鍔炲叕瀹わ紝璇達細“鑰佸笀錛屾垜鎵懼埌浜嗭紝涓夋潯杈逛箣涓湁涓ゆ潯錛屽畠浠殑騫蟲柟鍜岀害絳変簬鍙﹀涓鏉$殑騫蟲柟銆?#8221;鑰佸笀鎷嶆媿灝忔槑鐨勫ご錛?#8220;浣犱粖澶╁浼氫簡涓涓畾鐞嗭紝鍕捐偂瀹氱悊銆傚畠?yōu)鏄鐩磋涓夎迮炴湁涓よ竟邈^鏂瑰拰絳変簬絎笁杈圭殑騫蟲柟鍜?#8221;銆?/span>
鍙︿竴涓晠浜嬶紝鏌愭棩鑰佸笀鍛婅瘔灝忔槑“浠婂ぉ瑕佹暀浣犱竴涓畾鐞嗭紝鍕捐偂瀹氱悊銆?#8221;灝忔槑璇達紝“浠涔堟槸鍕捐偂瀹氱悊鍛紵”“鍕捐偂瀹氱悊鏄錛岀洿瑙掍笁瑙掑艦涓湁涓ゆ潯杈圭殑騫蟲柟鍜岀瓑浜庣涓夎竟鐨勫鉤鏂廣?#8221;鐒?st1:personname w:st="on" ProductID="鍚?>鍚?/st1:personname>鑰佸笀緇欎簡涓澶у爢鐩磋涓夎鏉跨粰灝忔槑錛岃浠栧幓楠岃瘉銆備袱涓皬鏃跺悗錛屽皬
涓や釜鏁呬簨鍒氬ソ鏄娉曞垎鏋愰噷闈㈠搴旂殑涓や釜鏂規(guī)硶錛氱涓涓晠浜嬭鐨勬槸鑷簳鍚戜笂鐨勫垎鏋愭柟娉曪紝絎簩涓晠浜嬭鐨勬槸鑷《鑰屼笅鐨勫垎鏋愭柟娉曘傚洖鍒拌紼嬬殑鍐呭錛岀敤涓や釜渚嬪瓙璇存槑榪欎釜闂錛?/span>
璁炬煇璇█鐨勬枃娉曟槸錛?/span>
錛?/span>1錛?/span>E → E+n 錛?/span>2錛?/span>E → n
鍒嗘瀽杈撳叆涓詫細n+n+n
鑷簳鍚戜笂鐨勫垎鏋愭濇兂錛?/span>
浠庡乏鍒板彸鐪嬪緟鍒嗘瀽涓詫細
鍏堟槸n錛岀敱錛?/span>2錛夋娊璞′負E錛涚戶緇+銆?/span>n錛屽緱鍒?/span>E+n錛岀敱錛?/span>1錛夋娊璞′負E錛涚戶緇?/span>+n錛屾湁E+n錛屽皢涓?/span>E+n鎶借薄涓?/span>E銆傜敱浜庤緭鍏ヤ負絀猴紝鎴愬姛鍒嗘瀽錛?/span>
鑷《鍚戜笅鐨勫垎鏋愭濇兂錛?/span>
浠庡乏寰鍙寵瀵熶覆錛屽垎鏋愶紙鎺ㄥ錛夎繃紼嬩負錛?/span>
E => E+n ( using (1) )
=> E+n+n ( using (1) )
=> n+n+n ( using (2) )
鎺ㄥ緇撴潫錛屽垎鏋愭垚鍔燂紒
璇ユ帹瀵艱繃紼嬪埄鐢ㄤ簡鏈宸︽帹瀵箋?/span>
涓ょ鍒嗘瀽鏂規(guī)硶鐨勬牴鏈尯鍒槸錛氳嚜搴曞悜涓婄殑鍒嗘瀽錛屼粠鍏蜂綋鍒版娊璞★紱鑷《鍚戜笅鐨勫垎鏋愶紝浠庢娊璞″埌鍏蜂綋銆備袱縐嶅垎鏋愭濊礬鎭版伆鍙堟槸鍝插鎬濊冮棶棰樼殑涓ゅぇ鏂瑰悜銆傝綆楁満縐戝涓庡摬瀛︽伆濂藉湪姝ょ粨鍚堣搗鏉ャ傝綆楁満縐戝鎬濊冮棶棰樻湁寰堝鏃跺欐槸涓庡摬瀛︾浉綾諱技錛屼笂榪板氨鏄竴涓緥璇併?/span>
鍦ㄧ綉涓婃悳绱?/span>flex錛屽畨瑁?/span>flex錛屽厛涓嬭澆flex錛堝師鏈墦綆楁斁涓婃潵鐨勶紝浣嗘槸鑰冭檻鍒扮増鏉冪殑闂錛岃繕鏄笉瑕佷簡銆傞渶瑕佺殑鏈嬪弸錛屾垜鍙互鍙戠粰浣狅級錛岀劧鍚庢寜鐓ч粯璁ょ殑姝ラ閫愭瀹夎銆?/span>
瀹夎鍚庯紝璁劇疆鐜鍙橀噺錛屽皢Path鎸囧悜flex.exe鎵鍦ㄧ殑鏂囦歡澶癸紙鏈満涓婁負錛?/span>C:\Program Files\GnuWin32\bin錛屼竴鑸寜榛樿鏂瑰紡瀹夎鍚?/span>flex.exe閮藉湪璇ユ枃浠跺す鍐咃級錛屽叿浣撴楠わ細
→瀵?#8220;鎴戠殑鐢?shù)鑴?#8221;鍥炬爣鎸夊彸閿?#8594;閫夋嫨“灞炴?#8221;→閫夋嫨“楂樼駭”→鍗曞嚮“鐜鍙橀噺”→鍦?#8220;緋葷粺鍙橀噺”涓煡鎵?/span>Path欏癸紝騫墮夋嫨涔?#8594;鎸?#8220;緙栬緫”→鍦?#8220;鍙橀噺鍊?#8221;鐨勬渶鍚庝竴欏規(guī)坊鍔?#8220;;C:\Program Files\GnuWin32\bin”錛屾寜紜畾瀹屾垚銆?/span>

鏈榪戞垜鏄厛浠庤鏈?/span>TINY璇█寮濮嬶紝TINY璇█鐨?/span>lex鏂囦歡鍦ㄦ簮浠g爜鐨?/span>LEX鏂囦歡澶瑰唴
1. 鍦?/span>tiny.l鐨勬渶鍚庢坊鍔狅細
int yywrap()
{
return 1;
}
鐢ㄦ潵緇撴潫鎵弿
2. 鍦?/span>console涓婅緭鍏?/span>flex tiny.l錛岀敓鎴?/span>lex.yy.c錛屽皢鍏舵浛鎹?/span>scan.c錛岀紪璇戦摼鎺ョ敓鎴?/span>tiny鐨勭紪璇戝櫒銆?/span>
鍙傝冩枃鐚細
http://course.cugnc.com/bianyi/shiyan/CHAPTER/f1.htm
http://blog.csdn.net/litchh/archive/2004/07/14/40983.aspx
http://www.cnscn.org/read.php?tid-10862.html
鎴戜滑寰寰鍙槸灝嗕駭鐢熺殑lex.yy.c鐩存帴娣誨姞鍒?/span>MFC宸ョ▼灝卞畬浜嬶紝浣嗘槸緙栬瘧鏃訛紝鐢變簬鍚勭鍚勬牱鐨勫師鍥狅紝鑰屼駭鐢熷ぇ閲忕殑璇硶閿欒錛岄毦浠ヤ慨鏀廣傛湰浜烘渶榪戝湪MFC涓嬫瀯閫犱竴涓墿鍏?/span>TINY璇█鐨勮瘝娉曞垎鏋愪篃鏄亣鍒頒簡涓浜涢棶棰橈紝鏌ラ槄浜嗗ぇ閲忚祫鏂欙紙宸茬粡灝嗕富瑕佺殑鍙傝冭祫鏂欐斁鍒?/span>lex瀛︿範鏍忕洰涓婏紝璇風湅錛?a href="http://m.shnenglu.com/Plator/category/7159.html">http://m.shnenglu.com/Plator/category/7159.html錛夛紝鑰楄垂浜嗘垜涓ゅぉ鐨勬椂闂磋В鍐寵繖浜涢棶棰樸傚洜姝ゆ垜鎯沖啓鏈枃錛屽皢鎶婁竴浜涙敞鎰忛棶棰樺彊榪板涓嬶紝甯屾湜瀵逛竴浜涙湅鍙嬫湁鎵甯姪銆?/span>
1. 瑕佸皢lex.yy.c鏀逛負CPP鏂囦歡錛?/span>lex.yy.cpp銆傚洜涓?/span>MFC鏄?/span>C++宸ョ▼錛岃嫢涓嶄慨鏀瑰垯浼氬嚭鐜伴敊璇紱
2. 灝?/span>#include <stdio.h>鏀逛負#include <stdafx.h>錛屼笉鐒朵細鍑虹幇濡備笅閿欒錛?/span>unexpected end of file while looking for precompiled header directive錛?/span>
3. 灝?/span>flex瀹夎鐩綍涓?/span>include鏂囦歡澶圭殑unistd.h娣誨姞鍒?/span>MFC宸ョ▼鍐咃紝騫朵慨鏀?/span>#include <unistd.h>錛屼負#include "unistd.h"銆傚洜涓?/span>unistd.h鏂囦歡涓畾涔変簡璇嶆硶鍒嗘瀽闇瑕佺敤鍒頒竴浜涘ご鏂囦歡銆?/span>
4. 濡傛灉lex婧愭枃浠墮渶瑕佺敤input璇誨彇瀛楃錛屽垯搴旇鎹㈢敤yyinput錛屽洜涓?/span>input浼氫笌C++涓殑嫻佸悕璇嶉噸澶嶏紝浼氬嚭鐜扮紪璇戦敊璇紱
5. 娉ㄦ剰涓浜?/span>I/O渚嬬▼鐨勫簲鐢紝鍏蜂綋璇瘋錛?a href="http://m.shnenglu.com/Plator/archive/2008/05/24/50940.html">http://m.shnenglu.com/Plator/archive/2008/05/24/50940.html
鍙槸鐭煭鍑犱釜閿欒錛屼絾鏄В鍐崇殑榪囩▼鍙傝冧簡澶ч噺璧勬枡錛岃櫧鐒朵笉鐭ラ亾榪欎簺璧勬枡鍑鴻嚜浣曚漢涔嬫墜錛屼絾鏄湪姝ゆ劅璋㈣繖浜涗綔鑰咃紒
瀹氫箟
%%
瑙勫垯
%%
鐢ㄦ埛浠g爜
涓涓?Lex 紼嬪簭鍒嗕負涓変釜孌碉細絎竴孌墊槸 C 鍜?Lex 鐨勫叏灞澹版槑錛岀浜屾鍖呮嫭妯″紡錛圕 浠g爜錛夛紝絎笁孌墊槸琛ュ厖鐨?C 鍑芥暟銆?榪欎簺孌典互%%鏉ュ垎鐣屻?涓嬮潰鏄竴涓鏁頒笌瀛楁暟鐨勭粺璁″伐鍏楓?/p>
int num_lines = 0, num_chars = 0;
%%
\n ++num_lines; ++num_chars;
. ++num_chars;
%%
main()
{
yylex();
printf( "# of lines = %d, # of chars = %d\n",
num_lines, num_chars );
}
Second!
瀵笷irst鍐呭鐨勫洖欏?
C 鍜?Lex 鐨勫叏灞澹版槑
榪欎竴孌典腑鎴戜滑鍙互澧炲姞 C 鍙橀噺澹版槑銆傝繖閲屾垜浠皢涓哄瓧鏁扮粺璁$▼搴忓0鏄庝竴涓暣鍨嬪彉閲忥紝鏉ヤ繚瀛樼▼搴忕粺璁″嚭鏉ョ殑瀛楁暟銆傛垜浠繕灝嗚繘琛?Lex 鐨勬爣璁板0鏄庛?
瀛楁暟緇熻紼嬪簭鐨勫0鏄?/p>
%{
int wordCount = 0;
%}
chars [A-za-z\_\'\.\"]
numbers ([0-9])+
delim [" "\n\t]
whitespace {delim}+
words {chars}+
%%
涓や釜鐧懼垎鍙鋒爣璁版寚鍑轟簡 Lex 紼嬪簭涓繖涓孌電殑緇撴潫鍜屼笁孌典腑絎簩孌電殑寮濮嬨?
Lex 鐨勬ā寮忓尮閰嶈鍒?
璁╂垜浠湅涓涓?Lex 鎻忚堪鎴戜滑鎵瑕佸尮閰嶇殑鏍囪鐨勮鍒欍傦紙鎴戜滑灝嗕嬌鐢?C 鏉ュ畾涔夋爣璁板尮閰嶅悗鐨勫姩浣溿傦級緇х畫鐪嬫垜浠殑瀛楁暟緇熻紼嬪簭錛屼笅闈㈡槸鏍囪鍖歸厤鐨勮鍒欍?
瀛楁暟緇熻紼嬪簭涓殑 Lex 瑙勫垯
{words} { wordCount++; /*
increase the word count by one*/ }
{whitespace} { /* do
nothing*/ }
{numbers} { /* one may
want to add some processing here*/ }
%%
C 浠g爜
Lex 緙栫▼鐨勭涓夋錛屼篃灝辨槸鏈鍚庝竴孌佃鐩栦簡 C 鐨勫嚱鏁板0鏄庯紙鏈夋椂鏄富鍑芥暟錛夈傛敞鎰忚繖涓孌靛繀欏誨寘鎷?yywrap() 鍑芥暟銆?Lex 鏈変竴濂楀彲渚涗嬌鐢ㄧ殑鍑芥暟鍜屽彉閲忋?鍏朵腑涔嬩竴灝辨槸 yywrap銆備竴鑸潵璇達紝yywrap() 鐨勫畾涔夊涓嬩緥銆傛垜浠皢鍦?楂樼駭 Lex 涓帰璁ㄨ繖涓闂銆?
瀛楁暟緇熻紼嬪簭鐨?C 浠g爜孌?/p>
void main()
{
yylex(); /* start the
analysis*/
printf(" No of words:
%d\n", wordCount);
}
int yywrap()
{
return 1;
}
Lex 緙栫▼鐨勫熀鏈厓绱犲氨榪欐牱鎼炲畾浜嗭紝瀹冨皢甯姪浣犵紪鍐欑畝鍗曠殑璇嶆硶鍒嗘瀽紼嬪簭銆?
Third
楂樼駭Lex
Lex 鏈夊嚑涓嚱鏁板拰鍙橀噺鎻愪緵浜嗕笉鍚岀殑淇℃伅錛屽彲浠ョ敤鏉ョ紪璇戝疄鐜板鏉傚嚱鏁扮殑紼嬪簭銆備笅琛ㄤ腑鍒楀嚭浜嗕竴浜涘彉閲忓拰鍑芥暟錛屼互鍙婂畠浠殑浣跨敤銆?璇﹀敖鐨勫垪琛ㄨ鍙傝?Lex 鎵嬪唽銆?
Lex 鍙橀噺
yyin FILE* 綾誨瀷銆?瀹冩寚鍚?lexer 姝e湪瑙f瀽鐨勫綋鍓嶆枃浠躲?br> yyout FILE* 綾誨瀷銆?瀹冩寚鍚戣褰?lexer 杈撳嚭鐨勪綅緗?緙虹渷鎯呭喌涓嬶紝yyin 鍜?yyout 閮芥寚鍚戞爣鍑嗚緭鍏ュ拰杈撳嚭銆?br> yytext 鍖歸厤妯″紡鐨勬枃鏈瓨鍌ㄥ湪榪欎竴鍙橀噺涓紙char*錛夈?br> yyleng 緇欏嚭鍖歸厤妯″紡鐨勯暱搴︺?br> yylineno 鎻愪緵褰撳墠鐨勮鏁頒俊鎭傦紙lexer涓嶄竴瀹氭敮鎸併傦級
Lex 鍑芥暟
yylex() 榪欎竴鍑芥暟寮濮嬪垎鏋愩?瀹冪敱 Lex 鑷姩鐢熸垚銆?br> yywrap() 榪欎竴鍑芥暟鍦ㄦ枃浠訛紙鎴栬緭鍏ワ級鐨勬湯灝捐皟鐢ㄣ傚鏋滃嚱鏁扮殑榪斿洖鍊兼槸1錛屽氨鍋滄瑙f瀽銆?鍥犳瀹冨彲浠ョ敤鏉ヨВ鏋愬涓枃浠躲備唬鐮佸彲浠ュ啓鍦ㄧ涓夋錛岃繖灝辮兘澶熻В鏋愬涓枃浠躲?鏂規(guī)硶鏄嬌鐢?yyin 鏂囦歡鎸囬拡錛堣涓婅〃錛夋寚鍚戜笉鍚岀殑鏂囦歡錛岀洿鍒版墍鏈夌殑鏂囦歡閮借瑙f瀽銆傛渶鍚庯紝yywrap() 鍙互榪斿洖 1 鏉ヨ〃紺鴻В鏋愮殑緇撴潫銆?br> yyless(int n) 榪欎竴鍑芥暟鍙互鐢ㄦ潵閫佸洖闄や簡鍓?n? 涓瓧絎﹀鐨勬墍鏈夎鍑烘爣璁般?br> yymore() 榪欎竴鍑芥暟鍛婅瘔 Lexer 灝嗕笅涓涓爣璁伴檮鍔犲埌褰撳墠鏍囪鍚庛?
鍒版涓烘錛屽彲鑳戒綘鐪嬪埌l(fā)ex紼嬪簭榪樹細鑼冩檿錛屾病鍏崇郴錛屼笅闈㈡垜浠帴鐫鏉ワ紝鍒嗘瀽涓涓被pascal璇硶鐨勬瀬綆鏋愬櫒錛?
/* 榪欎釜灝辨槸娉ㄩ噴浜?/
/* scanner for a toy Pascal-like language */
鐢蟲槑閮ㄥ垎寮濮?br>%{ 鍐呯殑涓滆タ浼氬師灝佷笉鍔ㄥ湴鍑虹幇鍦ㄨ緭鍑烘枃浠朵腑 }%
%{
/* need this for the call to atof() below */
#include <math.h>
%}
DIGIT [0-9]
ID [a-z][a-z0-9]*
%%
妯″紡閮ㄥ垎寮濮?
{DIGIT}+ {
printf( "An integer: %s (%d)\n", yytext,
atoi( yytext ) );
}
{DIGIT}+"."{DIGIT}* {
printf( "A float: %s (%g)\n", yytext,
atof( yytext ) );
}
if|then|begin|end|procedure|function {
printf( "A keyword: %s\n", yytext );
}
{ID} printf( "An identifier: %s\n", yytext );
"+"|"-"|"*"|"/" printf( "An operator: %s\n", yytext );
"{"[^}\n]*"}" /* eat up one-line comments */
[ \t\n]+ /* eat up whitespace */
. printf( "Unrecognized character: %s\n", yytext );
%%
琛ュ厖閮ㄥ垎寮濮?
main( argc, argv )
int argc;
char **argv;
{
++argv, --argc; /* skip over program name */
if ( argc > 0 )
yyin = fopen( argv[0], "r" );
else
yyin = stdin;
yylex();
}
鎯寵鐪熸浜嗚Вlex, [[姝e垯琛ㄨ揪寮廬] 鏄叧閿?
Four
yytext 鍖歸厤妯″紡鐨勬枃鏈瓨鍌ㄥ彉閲? 鍙互閫氳繃鍦ㄧ敵鏄庨樁孌典嬌鐢?pointer鎴?array鏉ユ帶鍒舵槸涓涓瓧絎︽寚閽堣繕鏄竴涓瓧絎︽暟緇勩傛寚閽堟ā寮忎笌鏁扮粍妯″紡鍚勬湁鐗圭偣錛屽鑷村湪yytex鐢蟲槑涓婁篃涓嶄竴鏍鳳紝鍏蜂綋璇峰弬鑰僱ex鎵嬪唽錛?
鍦ㄦā寮忛樁孌典腑
妯″紡 鍔ㄤ綔
[ \t]+ putchar( ' ' );
[ \t]+$ /* ignore this token */
妯″紡閮ㄥ垎鏄鍒欒〃杈懼紡錛屽姩浣滈儴鍒嗘槸澶勭悊鏂規(guī)硶錛屽姩浣滈儴鍒嗗鏋滄椂{寮澶達紝閭d箞錛屽姩浣滃皢浼氭寔緇埌},濡傛灉鍔ㄤ綔涓嚭鐜頒簡鎷彿{},寮濮嬮噰鐢?%{ %}鏉ヨ〃紺哄姩浣滃幓鍖烘銆傚姩浣滈儴鍒嗗鏋滄椂 |,灝辮〃紺轟笌涓嬩竴鏉¤鍒欐墽琛岀浉鍚岀殑鍔ㄤ綔銆?
濂界殑錛屾垜浠潵鐪嬩竴涓洿涓哄疄鐢ㄤ竴鐐圭殑lex紼嬪簭銆?br>鎴戜滑鍏堝畾涔変笁涓姩浣?
ECHO 灝唝ytext杈撳嚭
BEGIN 寮濮嬩竴涓潯浠跺鐞嗗潡
REJECT 鎸囩ず綆鏋愬櫒瀵瑰綋鍓嶈鍒欎笉鍋氬鐞嗭紝鑰屾槸閲囩敤絎簩鍖歸厤瑙勫垯銆?
int word_count = 0;
%%
frob special(); REJECT;
[^ \t\n]+ ++word_count;
濡傛灉frob娌℃湁REJECT鍔ㄤ綔錛宖rob灝嗕笉浼氳璁℃暟錛屽洜涓鴻В鏋愬櫒鍦ㄩ氬父鎯呭喌涓嬶紝姣忎釜琚尮閰嶇殑瀵硅薄鍙細瀵逛竴涓姩浣滅敓鏁堬紝澶氫釜REJECT涔熸槸鍏佽鐨勶紝浼氬鎵句笅涓涓渶閰嶇殑瑙勫垯鏉ュ仛澶勭悊銆傛墍浠ワ紝涓嬮潰鐨勮鍒欎細鎶婅緭鍏ョ殑"abcd"澶勭悊鍚庤緭鍑?abcdabcaba".
%%
a |
ab |
abc |
abcd ECHO; REJECT;
.|\n /* eat up any unmatched character */
`yymore()' 鍛婅瘔瑙f瀽鍣ㄤ笅涓嬈″尮閰嶇殑瑙勫垯錛屾弧瓚崇殑閮ㄥ垎灝嗕細娣誨姞鍒板綋鍓峺ytext鍊煎緱鍚庨潰鑰屼笉鏄浛鎹㈠畠銆?渚嬪錛屾寚瀹氱殑杈撳叆"mega-kludge"緇忚繃涓嬮潰鐨勭▼搴忓鐞嗗悗灝嗕細杈撳嚭"mega-mega-kludge"銆?
%%
mega- ECHO; yymore();
kludge ECHO;
絎竴涓?"mega-" 琚弧瓚沖茍涓旇緭鍑? 鐒跺悗 "kludge" 婊¤凍, 浣嗘槸騫舵病鏈夋浛鎹箣鍓嶇殑"mega-"鑰屾槸"kludge"闄勫姞鍒頒粬鐨勫悗闈紝鐒跺悗杈撳嚭鐨勫叾瀹炴槸"mega-kludge".
yymore()闇瑕佷袱浠朵簨鎯呴渶瑕佹敞鎰忋傜涓錛寉ymnore()渚濊禆浜庤〃鐜板綋鍓嶅尮閰嶉」鐨勯暱搴yleng鐨勫鹼紝鎵浠ヤ嬌鐢▂ymore涓嶅厑璁告敼鍙榶yleng鐨勫箋傜浜岋紝yymore()鐨勪嬌鐢ㄤ細浣胯В鏋愬櫒浠樺嚭涓鐐圭偣鎬ц兘鐨勪唬浠楓?
鏈墆ymore()灝辨湁yyless()
yyless(n) 榪斿洖褰撳墠鍖歸厤欏歸櫎浜嗗紑濮嬬殑n涓瓧絎﹀唴鐨勬墍鏈夌殑鍐呭鍒拌緭鍏ョ紦瀛樺尯錛岃В鏋愬櫒澶勭悊涓嬩竴涓尮閰嶆椂錛屽畠浠皢浼氳閲嶆柊瑙f瀽銆倅yless灝嗕細瀵艱嚧yytext涓巠yleng鐨勮皟鏁淬傦紙yyleng灝嗕細絳変簬=n錛?濡傝緭鍏?foobar"琚笅闈㈢殑紼嬪簭澶勭悊鍚庯紝灝嗕細杈撳嚭"boobarbar". 鍥犱負鍓峮=3涓瓧絎oo澶栫殑瀛楃bar琚噸鏂拌繑鍥炲埌杈撳叆緙撳瓨鍖轟簡銆?
%%
foobar ECHO; yyless(3);
[a-z]+ ECHO;
鍙傛暟0瀵逛簬yyless灝嗕細瀵艱嚧鏁翠釜褰撳墠鍖歸厤灝嗕細琚噸鏂拌В鏋愩傞櫎闈炰綘鏀瑰彉浜嗚В鏋愬櫒鏈潵鐨勫鐞嗘祦紼?濡備嬌鐢╞egin),榪欏皢浼氬鑷村驚鐜粨鏉熴傞渶瑕佹敞鎰忕殑鏄紝yyless鏄竴涓畯錛屽茍涓斿湪flex杈撳叆鏂囦歡涓嬌鐢紝涓嶈兘鍦ㄥ叾浠栨簮鏂囦歡涓嬌鐢ㄣ?
unput(c) 灝嗗瓧絎鏀懼洖鍒拌緭鍏ユ祦涓紝璇ュ瓧絎﹀彲浠ラ噸鏂拌瑙f瀽銆備笅闈㈢殑鍔ㄤ綔灝嗗綋鍓嶇殑鍖歸厤鍊奸檮涓婃嫭鍙峰悗閲嶆柊榪涜鍖歸厤銆?
{
int i;
/* Copy yytext because unput() trashes yytext */
char *yycopy = strdup( yytext );
unput( ')' );
for ( i = yyleng - 1; i >= 0; --i )
unput( yycopy[i] );
unput( '(' );
free( yycopy );
}
娉ㄦ剰: 鐢變簬姣忔unput()灝嗘寚瀹氱殑瀛楃娣誨姞鍒拌緭鍏ユ簮鐨勫紑澶達紝鎵浠ュ皢瀛楃涓叉坊鍔犲埌杈撳叆婧愬紑澶村繀欏諱粠鍚庨亾鍓嶅鐞嗐備竴涓瘮杈冮噸瑕佺殑娼滃湪闂鏄嬌鐢╱nput()鐨勬椂鍊欙紝濡傛灉閲囩敤浜?pointer鎸囬拡妯″紡淇濆瓨yytext,unput浼氱牬鍧弝ytext鐨勫唴瀹癸紝浠庢渶鍙寵竟鐨勫瓧絎﹀紑濮嬪皢浼氱牬鍧忓乏杈圭殑涓涓瓧絎︺傚鏋滃湪unput()鍚庤鐢ㄥ埌yytext,浣犻鍏堝繀欏誨鍒朵竴浠統(tǒng)ytext,鎴栬呯敤%array妯″紡鏉ヤ繚瀛榶ytext. 鏈鍚庝綘涓嶈兘鏀句竴涓狤OF鍘昏瘯鍥炬爣蹇楄緭鍏ユ祦鐨勭粨鏉熴?
input 浠庤緭鍏ユ簮涓鍙栦笅涓涓瓧絎︺備緥濡傦紝涓嬮潰鏈夌殑渚嬪瓙灝嗕細鍚冩帀C璇█娉ㄩ噴
%%
"/*" {
register int c;
for ( ; ; )
{
while ( (c = input()) != '*' &&
c != EOF )
; /* eat up text of comment */
if ( c == '*' )
{
while ( (c = input()) == '*' )
;
if ( c == '/' )
break; /* found the end */
}
if ( c == EOF )
{
error( "EOF in comment" );
break;
}
}
}
娉ㄦ剰: 濡傛灉綆鏋愬櫒閲囩敤鐢–++緙栬瘧錛宨nput()琚珁yinput()鐨勬浛浠o紝鍥犱負input()涓嶤++涓殑嫻佸悕縐癷nput鍐茬獊銆?
YY_FLUSH_BUFFER 鍒鋒柊瑙f瀽鍣ㄥ唴閮ㄧ紦瀛樹互渚夸簬涓嬩竴嬈$殑鍖歸厤宸ヤ綔錛岄鍏堝畠浼氫嬌鐢╕Y_INPUT濉厖緙撳瓨鍖恒傝繖鏄氱敤yy_flush_buffer()鐨勪竴涓壒渚嬶紝灝嗕細鍦ㄥ杈撳叆緙撳瓨涓弿榪般?
yyterminate()鍙互鍦ㄥ姩浣滃唴閮ㄨ繑鍥炴弿榪板尯鍩熶腑浣跨敤錛屽畠?yōu)畣缁堟瑙f瀽鍣q惰繑鍥?緇欒В鏋愬櫒璋冪敤鑰咃紝琛ㄧず鎿嶄綔瀹屾垚銆傜己鐪佹儏鍐典笅錛屽埌杈炬枃浠剁粨鏉熶綅緗篃浼氳璋冪敤錛屽畠鏄竴涓畯錛屽茍涓斿彲鑳介噸瀹氫箟銆?/p>
Lex榪涢樁
妯″紡
妯″紡鍦ㄧ涓闃舵鎴栫浜屼釜闃舵浣跨敤錛屼篃灝辨槸鍦ㄧ敵鏄庢垨瑙勫垯闃舵涓嚭鐜幫紝妯″紡瀹氫箟浜嗗尮閰嶇殑鐩爣錛岀洰鏍囪鍖歸厤鍚庡皢浼氭墽琛屽姩浣溿?br>瀵逛簬妯″紡涓嶆兂鍋氬お澶氳鏄庯紝浣跨敤姝e垯琛ㄨ揪寮忓畾涔夛紝鍙互鍙傜湅 regex 鎴?pcre.
寮濮嬫潯浠?br>lex鎻愪緵浜嗘牴鎹潯浠舵縺媧昏鍒欑殑鏈哄埗銆傚湪<sc>鍓嶇紑鐨勮鍒欏皢浼氬湪瑙f瀽鍣ㄥ湪"sc"鐨勫紑濮嬫潯浠朵笅琚尮閰嶃?/p>
<STRING>[^"]* { /* eat up the string body ... */ ... }
灝嗕細鍦ㄥ惎鍔ㄦ潯浠?STRING"鐨勬儏鍐典笅琚縺媧匯?/p>
<INITIAL,STRING,QUOTE>\. { /* handle an escape ... */ ... }
灝嗕細鍦?"INITIAL", "STRING", "QUOTE"涓夎呬箣涓鐨勬潯浠朵笅琚縺媧匯?/p>
寮濮嬫潯浠跺湪杈撳叆婧愮殑瀹氫箟(絎竴錛夐儴鍒嗚鐢蟲槑錛屽湪‘%s' 鎴?’%x'鍚庤窡闅忕潃鍚嶅瓧鍒楄〃銆?%s鐢蟲槑浜嗗寘鍚殑寮濮嬫潯浠訛紝%x鐢蟲槑浜嗘帓浠栫殑寮濮嬫潯浠躲傚紑濮嬫潯浠惰BEGIN鍔ㄤ綔嬋媧匯傜洿鍒頒笅涓涓狟EGIN鍔ㄤ綔錛屾弧瓚沖紑濮嬫潯浠跺悕縐扮殑瑙勫垯灝嗕細琚鍒欙紝涓嶆弧瓚沖惎鍔ㄦ潯浠剁殑瑙勫垯灝嗕笉浼氳鎵ц銆?/p>
濡傛灉鏄寘鍚潯浠訛紝娌℃湁寮濮嬫潯浠剁殑瑙勫垯涔熶細琚縺媧繪墽琛岋紝濡傛灉鏃舵帓浠栨潯浠訛紝鍙湁婊¤凍寮濮嬫潯浠剁殑瑙勫垯鎵嶄細琚墽琛屻?/p>
鍏鋒湁鐩稿悓鎺掍粬鏉′歡鐨勮鍒欑殑闆嗗悎鍙互浣胯В鏋愬櫒鐙珛浜庡叾浠栫殑瑙勫垯銆傚洜姝わ紝鎺掍粬鏉′歡鍙互瀹規(guī)槗鍦板垱寤哄井鍨嬭В鏋愬櫒澶勭悊杈撳叆婧愪腑鐨勭嫭绔嬩笌鍏朵粬閮ㄥ垎鐨勪竴閮ㄥ垎錛堝錛屾敞閲婏級銆傚鏋滃浜庡寘鍚笌鎺掍粬鏉′歡榪樻湁娣鋒穯錛屽彲浠ョ湅涓嬮潰鐨勪緥瀛愩?/p>
%s example%%<example>foo do_something();bar something_else();
絳夊悓浜?/p>
%x example%%<example>foo do_something();<INITIAL,example>bar something_else();
涓婇潰鐨勭▼搴忎腑濡傛灉娌℃湁<INITIAL,example>錛屽湪example鏉′歡涓媌ar瑙勫垯灝嗘案榪滀笉浼氳嬋媧匯傚鏋滀嬌鐢?lt;example>錛屽皢浼氬鑷村彧鑳藉湪exmaple寮濮嬫潯浠朵笅嬋媧伙紝鑰孖NITIAL鏉′歡涓嬩笉浼氳嬋媧匯傝岀涓涓▼搴忎腑鍦ㄤ換浣曟潯浠朵笅bar閮借浼氭縺媧匯傚洜涓虹涓涓▼搴忕敤example鏃?s錛屾椂鍖呭惈鏉′歡銆傞〉鍙互閫氳繃鐗規(guī)畩寮濮嬫潯浠?lt;*>鏉ラ厤緗換浣曞紑濮嬫潯浠訛紝涓婇潰鐨勭▼搴忚繕鍙互鍐欎負錛?/p>
%x example%%<example>foo do_something();<*>bar something_else();
緙虹渷瑙勫垯錛堟樉紺轟換浣曟湭琚尮閰嶇殑瀛楃錛夊湪寮濮嬫潯浠朵笅浠嶇劧鐢熸晥銆傜瓑鍚屼簬錛?/p>
<*>.|\\n ECHO;
‘BEGIN(0)’鍦ㄦ棤寮濮嬫潯浠剁殑瑙勫垯嬋媧繪潯浠朵笅榪斿洖鍘熷鐘舵侊紝榪欎釜鐘舵佸悓浜庡紑濮嬫潯浠朵笅鐨?INITIAL',鎵浠?#8216;BEGIN(INITIAL)'絳夊悓浜?#8217;BEGIN(0)'銆?br>BEGIN琛屼負鍦ㄨ鍒欓儴鍒嗙殑寮澶存槸榛樿鐨勪唬鐮侊紙BEGIN actions can also be given as indented code at the beginning of the rules section.璇風炕璇戯級渚嬪錛屼笅闈㈢殑浠g爜灝嗕細浠呴渶SPECIAL寮濮嬫潯浠訛紝涓嶇鍚堥倅ylex()琚皟鐢ㄥ茍涓斿叏灞鍙橀噺enter_special鏄痶rue銆?/p>
int enter_special;%x SPECIAL%% if ( enter_special ) BEGIN(SPECIAL);<SPECIAL>blahblahblah...more rules follow...
涓轟簡璇存槑寮濮嬫潯浠訛紝鎴戜滑鐢ㄤ袱縐嶆柟娉曞鐞?123.456".緙虹渷灝嗕細琚В鏋愪負 '123','.','456'涓変釜鏍囪錛屽鏋渆xpect-floats鍚庨潰灝嗕細琚В鏋愪負嫻偣鏁?123.456
%{#include <math.h>%}%s expect%%expect-floats BEGIN(expect);<expect>[0-9]+"."[0-9]+ { printf( "found a float, = %f\n", atof( yytext ) ); }<expect>\n { /* that's the end of the line, so * we need another "expect-number" * before we'll recognize any more * numbers */ BEGIN(INITIAL); }[0-9]+ { printf( "found an integer, = %d\n", atoi( yytext ) ); }"." printf( "found a dot\n" );
涓嬮潰鐨勪唬鐮佽兘澶熸槸琚獵璇█娉ㄩ噴騫朵笖緇熻琛屾暟銆?/p>
%x comment%% int line_num = 1;"/*" BEGIN(comment);<comment>[^*\n]* /* eat anything that's not a '*' */<comment>"*"+[^*/\n]* /* eat up '*'s not followed by '/'s */<comment>\n ++line_num;<comment>"*"+"/" BEGIN(INITIAL);
瀹為檯涓婏紝緙栧啓楂橀熻В鏋愮▼搴忕殑鍔炴硶鏃跺湪姣忎釜瑙勫垯涓仛灝藉彲鑳藉鐨勫尮閰嶃?/p>
This scanner goes to a bit of trouble to match as much text as possible with each rule. In general, when attempting to write a high-speed scanner try to match as much possible in each rule, as it's a big win.
娉ㄦ剰: 寮濮嬫潯浠剁殑鍚嶅瓧瀹為檯涓婃椂涓涓暣褰㈠煎茍涓旇兘澶熻淇濆瓨錛屾墍浠ワ紝涓婇潰鐨勪唬鐮佸彲浠ユ墿灞曚負錛?/p>
%x comment foo%% int line_num = 1; int comment_caller;"/*" { comment_caller = INITIAL; BEGIN(comment); }...<foo>"/*" { comment_caller = foo; BEGIN(comment); }<comment>[^*\n]* /* eat anything that's not a '*' */<comment>"*"+[^*/\n]* /* eat up '*'s not followed by '/'s */<comment>\n ++line_num;<comment>"*"+"/" BEGIN(comment_caller);
鑰屼笖錛屽彲鑳芥槗浣跨敤YY_START瀹忔潵璁塊棶褰撳墠鐨勫紑濮嬫潯浠躲傚涓婇潰鐨勮祴鍊兼潯浠跺彲浠ユ敼鍐欎負
comment_caller = YY_START
YYSTATE鏄痀Y_START鐨勫埆鍚嶏紙鍥犱負AT&T lex浣跨敤浜哬YSTATE錛夈?br>娉ㄦ剰 寮濮嬫潯浠舵病鏈変粬浠殑鍚嶅瓧絀洪棿; %s 涓?%x 鐢蟲槑涓?#define褰㈠紡涓鏍楓?/p>
鍒拌繖閲岋紝鏃朵竴涓嬌鐢ㄦ帓浠栧紑濮嬫潯浠跺浣曞尮閰岰椋庢牸鐨勫紩鐢ㄥ瓧絎︿覆鐨勫鐞嗐傚寘鍚殑鎵╁睍鐨勮漿涔夛紝浣嗕笉鍖呮嫭媯鏌ワ紝鍥犱負浠g爜澶暱銆?/p>
%x str%% char string_buf[MAX_STR_CONST]; char *string_buf_ptr;\" string_buf_ptr = string_buf; BEGIN(str);<str>\" { /* saw closing quote - all done */ BEGIN(INITIAL); *string_buf_ptr = '\0'; /* return string constant token type and * value to parser */ }<str>\n { /* error - unterminated string constant */ /* generate error message */ }<str>\\[0-7]{1,3} { /* octal escape sequence */ int result; (void) sscanf( yytext + 1, "%o", &result ); if ( result > 0xff ) /* error, constant is out-of-bounds */ *string_buf_ptr++ = result; }<str>\\[0-9]+ { /* generate error - bad escape sequence; something * like '\48' or '\0777777' */ }<str>\\n *string_buf_ptr++ = '\n';<str>\\t *string_buf_ptr++ = '\t';<str>\\r *string_buf_ptr++ = '\r';<str>\\b *string_buf_ptr++ = '\b';<str>\\f *string_buf_ptr++ = '\f';<str>\\(.|\n) *string_buf_ptr++ = yytext[1];<str>[^\\\n\"]+ { char *yptr = yytext; while ( *yptr ) *string_buf_ptr++ = *yptr++; }
閫氬父錛屽涓婇潰鐨勪緥瀛愪腑鎵鐪嬪埌浣狅紝浼氭湁璁稿鐩稿悓寮濮嬫潯浠剁殑澶勭悊銆傚紑濮嬫潯浠惰寖鍥村彲浠ョ畝鍖栭噸澶嶆搷浣溿?/p>
<SCs>{}
SCs 鏄竴涓垨寮濮嬫潯浠剁殑鍒楄〃銆傚湪榪欎釜寮濮嬫潯浠惰寖鍥村唴錛屾瘡涓鍒欏皢浼氳嚜鍔ㄥ叿鏈夊墠緙 `<SCs>' 鐩村埌 `}' 涓庡紑濮嬬殑 `{' 鍖歸厤. 渚嬪
<ESC>{ "\\n" return '\n'; "\\r" return '\r'; "\\f" return '\f'; "\\0" return '\0';}
絳変環(huán)浜?
<ESC>"\\n" return '\n';<ESC>"\\r" return '\r';<ESC>"\\f" return '\f';<ESC>"\\0" return '\0';
寮濮嬫潯浠墮〉鍙互宓屽錛屼笅闈㈡椂涓変釜綆$悊寮濮嬫潯浠跺爢鏍堢殑鍙傛暟銆?
`void yy_push_state(int new_state)'
灝嗗綋鍓嶇殑寮濮嬫潯浠跺帇鏍堬紝鍒囨崲鍒?new_state 涓庝嬌鐢?`BEGIN new_state'綾諱技銆?
`void yy_pop_state()'
浠庢爤欏跺脊鍑猴紝綾諱技浜?BEGIN.
`int yy_top_state()'
榪斿洖鏍堥《鍊鹼紝涓嶆敼鍙樻爤鍐呭銆?
寮濮嬫潯浠舵爤鍔ㄦ佸闀匡紝娌℃湁鍥哄畾闄愬埗錛屽鏋滃唴瀹圭敤灝斤紝紼嬪簭绔熶細緇堟銆?
涓轟簡浣跨敤寮濮嬫潯浠舵爤錛岄渶瑕佷嬌鐢?`%option stack' 鎸囦護銆?
澶氳緭鍏ョ紦瀛樺尯
涓浜涘厑璁竔nclude鏂囦歡瑙f瀽鍣ㄧ殑瑙f瀽鍣ㄨ姹備粠鍑犱釜杈撳叆嫻佷腑璇誨彇鍐呭銆俌Y_INPUT鍙湪緇撴潫緙撳瓨鏃惰璋冪敤錛岀鍒?include 鍚庨渶瑕佸垏鎹㈣緭鍏ユ簮錛岃岃В鏋愪竴涓弿榪頒篃璁擱渶瑕佸緢闀挎椂闂淬備負浜嗚В鍐蟲綾婚棶棰橈紝瑙f瀽鍣ㄦ彁渚涗簡鍒涘緩騫跺湪澶氫釜杈撳叆緙撳瓨涓垱寤虹殑鏈哄埗銆傝緭鍏ョ紦瀛樺彲浠ラ氳繃涓嬮潰鐨勬柟寮忓垱寤?
YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )
鍙傛暟涓轟笌緙撳瓨鍏寵仈鐨勮緭鍏ユ枃浠舵寚閽堬紝浠ュ強瓚沖鐨勫彲緇存寔size瀛楃錛堝鏋滀笉紜畾錛宻ize鍙互浣跨敤YY_BUF_SIZE)銆傝繑鍥炰竴涓猋Y_BUFFER_STATE,鍙互浼犻掑埌鍏朵粬鐨勫鐞嗚繃紼嬨俌Y_BUFFER_STATE鏄竴涓笉鍙緇撴瀯yy_buffer_state鐨勬寚閽堬紝鎵浠ュ彲浠ュ畨鍏ㄥ湴浣跨敤`((YY_BUFFER_STATE) 0)'鏉ュ垵濮嬪寲YY_BUFFER_STATE錛屽鏋滀綘鎰挎剰錛屼綘鍙互鍦ㄨВ鏋愬櫒涔嬪鐨勬簮紼嬪簭涓紩鐢ㄨ繖涓笉閫忔槑緇撴瀯鏉ユ紜殑鐢蟲槑杈撳叆緙撳瓨銆傚彲浠ラ氳繃涓嬮潰鐨勫弬鏁版潵閫夋嫨涓涓紦瀛樺尯銆?
void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )
鍒囨崲瑙f瀽鍣ㄧ殑杈撳叆緙撳瓨灝嗕細瀵艱嚧璁版帴涓嬫潵鐨勫尮閰嶉」鏉ヨ嚜浜庢柊鐨勭紦瀛樹腑銆倅y_switch_to_buffer鍙兘鍑虹幇鍦▂ywrap涓負緇х畫瑙f瀽鍋氬噯澶囷紝鏇挎崲鎵撳紑涓涓柊鐨勬枃浠跺茍鎵цyyin. 閫氳繃yy_switch_to_buffer 鎴?yywrap鍒囨崲杈撳叆婧愪笉鏀瑰彉寮濮嬫潯浠躲?
void yy_delete_buffer( YY_BUFFER_STATE buffer )
鐢ㄤ簬鏀跺洖涓庣紦瀛樺叧鑱旂殑絀洪棿銆備綘鍙互浣跨敤涓嬮潰鐨勫嚱鏁版竻絀哄綋鍓嶅唴瀹?
void yy_flush_buffer( YY_BUFFER_STATE buffer )
姝ゅ嚱鏁板簾寮冪紦瀛樺唴瀹癸紝涓嬩竴涓В鏋愬櫒璇曞浘鍖歸厤涓涓唴瀹規(guī)椂灝嗕細浣跨敤YY_INPUT鏉ユ洿鏂扮紦瀛樺尯銆?/p>
`yy_new_buffer()' 鏄?`yy_create_buffer()' 鐨勪竴涓埆鍚嶏紝鐢ㄤ簬鎻愪緵C++浣跨敤new 涓?delete鎿嶄綔鍒涘緩涓庨攢姣佸姩鎬佸璞$殑鍏煎鎬с?/p>
鏈鍚? YY_CURRENT_BUFFER 瀹忚繑鍥?YY_BUFFER_STATE 鎸囬拡錛岃〃紺哄綋鍓嶇殑緙撳瓨銆?/p>
榪欓噷鏄竴涓墿灞昳nclude浣跨敤鐨勪竴涓В鏋愬櫒 (`<<EOF>>' 鐗規(guī)у皢浼氬湪浠ュ悗璁ㄨ):
/* "incl" 鐘舵佺敤浜庤幏鍙杋nclude鐨勬枃浠跺悕 */
%x incl
%{
#define MAX_INCLUDE_DEPTH 10
YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH];
int include_stack_ptr = 0;
%}
%%
include BEGIN(incl);
[a-z]+ ECHO;
[^a-z\n]*\n? ECHO;
<incl>[ \t]* /* eat the whitespace */
<incl>[^ \t\n]+ { /* got the include file name */
if ( include_stack_ptr >= MAX_INCLUDE_DEPTH )
{
fprintf( stderr, "Includes nested too deeply" );
exit( 1 );
}
include_stack[include_stack_ptr++] =
YY_CURRENT_BUFFER;
yyin = fopen( yytext, "r" );
if ( ! yyin )
error( ... );
yy_switch_to_buffer(
yy_create_buffer( yyin, YY_BUF_SIZE ) );
BEGIN(INITIAL);
}
<<EOF>> {
if ( --include_stack_ptr < 0 )
{
yyterminate();
}
else
{
yy_delete_buffer( YY_CURRENT_BUFFER );
yy_switch_to_buffer(
include_stack[include_stack_ptr] );
}
}
鎻愪緵涓変釜榪囩▼鏉ュ疄鐜板唴瀛樺瓧絎︿覆鑰屼笉鏄枃浠惰緭鍏ョ紦瀛樼殑瑙f瀽銆傚畠浠兘瑕佸垱寤轟竴涓緭鍏ョ紦瀛樻潵瑙f瀽瀛楃涓詫紝騫朵笖榪斿洖YY_BUFFER_STATE (鍙互鍦ㄥ畬鎴愯В鏋愬悗鐢?`yy_delete_buffer()' 鍒犻櫎).錛屼篃鍙互閫氳繃`yy_switch_to_buffer()'鏉ュ垏鎹? 涓嬩竴嬈¤皟鐢╜yylex()' 灝嗕細瑙f瀽瀛楃涓層?/p>
`yy_scan_string(const char *str)' 瑙f瀽0緇撳熬瀛楃涓層?br>`yy_scan_bytes(const char *bytes, int len)' 瑙f瀽bytes寮濮嬬殑len涓瓧絎?鍙兘鍖呭惈 0 瀛楃)
娉ㄦ剰錛屼笂闈㈢殑涓や釜鍑芥暟浼氬垱寤哄瓧絎︿覆鎴栧瓧鑺備覆鐨勫壇鏈?榪欎篃璁告椂鏈熸湜鐨勶紝鍥犱負`yylex()' 浼氫慨鏀硅瑙f瀽緙撳瓨鐨勫唴瀹? 鍙互浣跨敤涓嬮潰鐨勬柟寮忔潵鎷掔粷浣跨敤鍓湰:
`yy_scan_buffer(char *base, yy_size_t size)'
灝嗕細浠巄ase寮濮嬭В鏋愶紝鍖呭惈size涓瓧鑺? 鏈鍚庣殑涓や釜瀛楄妭蹇呴』鏄?YY_END_OF_BUFFER_CHAR (ASCII NUL)銆備粬浠笉浼氳瑙f瀽, 瑙f瀽鑼冨洿浠?`base[0]' 鍒?`base[size-2]'錛堝寘鍚級銆傚鏋滀綘娌¤兘鎸夌収榪欑瑙勫畾浣跨敤base錛堝錛屽繕璁頒簡鏈鍚庣殑涓や釜YY_END_OF_BUFFER_CHAR瀛楄妭), `yy_scan_buffer()' 灝嗕細榪斿洖絀烘寚閽堣屼笉鍒涘緩YY_BUFFER_STATE銆倅y_size_t綾誨瀷鏄釜鏁村瀷錛屽彲浠ヨ漿鍖栦負鏁存暟鏉ュ弽鏄燽uffer鐨勯暱搴︺?/p>
鏂囦歡緇撴潫瑙勫垯
鐗規(guī)畩瑙勫垯 "<<EOF>>" 鍙槸瑙勫垯鍦ㄦ枃浠剁粨鏉熶綅緗彂鐢熶笖yywrap()榪斿洖闈?鍊箋?濡傦紝娌℃湁鏇村鐨勬枃浠惰澶勭悊). 榪欎釜鍔ㄤ綔蹇呴』瀹屾垚涓嬮潰鍥涗歡浜嬫儏涔嬩竴:
璧嬪肩粰yyin涓涓柊鐨勬枃浠?(鏃╂湡鐗堟湰鐨刦lex, 姝ゆ搷浣滃悗蹇呴』璋冪敤鐗規(guī)畩鍔ㄤ綔 YY_NEW_FILE; 榪欎釜鎿嶄綔宸茬粡涓嶉渶瑕佷簡);
鎵ц涓涓繑鍥炵敵鏄?
鎵ц涓涓壒孌婄殑`yyterminate()' 鍔ㄤ綔;
鎴栬呬嬌鐢╜yy_switch_to_buffer()' 鍒囨崲鍒頒竴涓柊鐨勮緭鍏ョ紦瀛樺尯.
<<EOF>> 涓嶈兘涓庡叾浠栨ā寮忎竴璧蜂嬌鐢紱瀹冧篃璁鎬粎鍦ㄥ紑濮嬫潯浠跺垪琛ㄧ敵鏄庛傚鏋滄寚瀹氫簡涓嶅悎娉?<<EOF>> 瑙勫垯, 瀹冨皢浼氬簲鐢ㄥ埌鎵鏈夌殑寮濮嬫潯浠惰屼笉浠呮槸 <<EOF>> 鍔ㄤ綔. 鎸囧畾 <<EOF>> 瑙勫垯浠呭湪 initial 寮濮嬫潯浠朵笅鍖歸厤錛屽氨鏄敤:
<INITIAL><<EOF>>
涓嬮潰鐨勮鍒欏彲浠ュ彂鐜拌薄涓嶅叧闂殑娉ㄩ噴綾葷殑闂銆?/p>
%x quote
%%
...other rules for dealing with quotes...
<quote><<EOF>> {
error( "unterminated quote" );
yyterminate();
}
<<EOF>> {
if ( *++filelist )
yyin = fopen( *filelist, "r" );
else
yyterminate();
}
榪欎簺渚嬬▼閮芥湁榛樿鐨勫畯瀹氫箟錛屼絾鏄敤鎴峰彲浠ラ噸鍐欏畠浠互閫傚簲涓嶅悓鐨勯渶姹傘傝繖浜涗緥紼嬪畾涔変簡澶栭儴鏂囦歡鍜屽唴閮ㄥ瓧絎︿箣闂寸殑鍏崇郴錛屽茍涓斿彧鑳藉悓鏃跺瓨鍦ㄦ垨鏇存敼銆傚畠浠彲浠ヨ閲嶅啓浣垮緱杈撳叆鎴栬呰緭鍑鴻瀹氬悜鍒扮壒孌婄殑浣嶇疆錛屽寘鎷叾浠栫殑紼嬪簭鎴栬呭唴瀛橈紱浣嗘槸瀛楃闆嗙殑浣跨敤蹇呴』鍦ㄦ暣涓緥紼嬩腑淇濇寔緇熶竴錛?strong>input蹇呴』榪斿洖0浠ヨ〃紺烘枃浠剁粨鏉燂紱unput鍜?strong>input涔嬮棿鐨勫叧緋誨繀欏諱繚鐣欙紝鍚﹀垯Lex涓嶈兘瀹屾垚鍚戝墠鎼滅儲鐨勬搷浣溿侺ex鍦ㄤ笉闇瑕佺殑鏃跺欎笉浼氬悜鍓嶆悳绱紝浣嗘槸姣忎竴涓互+*?$緇撳熬鐨勩佹垨鑰呭惈鏈?鐨勮鍒欓渶瑕佽繖涓姛鑳姐傚悓鏍鳳紝褰撲竴涓〃杈懼紡鏄彟涓涓殑鍓嶇紑鏃訛紝鍚戝墠鎼滅儲涔熸槸蹇呬笉鍙皯鐨勩傚弬闃呬笅鏂囦腑鏈夊叧Lex浣跨敤鐨勫瓧絎﹂泦鐨勮璁恒傞粯璁ょ殑Lex搴撲嬌鐢?00涓瓧絎︿綔涓哄鐢ㄩ檺鍒躲?
T1 → T1' 'T2 | T2
T2 → T2* | T3
T3 → (rexp) | letter
letter = [a-zA-Z]
鍒╃敤璇炬湰P119欏電▼搴忔竻鍗?/span>4-3鐨勭畻娉曪紝娑堥櫎涓婅堪瑙勫垯涓殑宸﹂掑綊錛岀粨鏋滃涓嬶細
rexp → T1exp'
exp' → '|' T1rexp' | ε
T1 → T2T1'
T1' → ' 'T2T1' | ε
T2 → T3T2'
T2' → *T2'|ε
T3 → (rexp) | letter
鏍規(guī)嵁涓婅堪瑙勫垯涔﹀啓紼嬪簭錛?br>

bool flag;
char formula[100];
int i;
void rexp();
void rexp1();
void t1();
void t11();
void t2();
void t21();
void t3();
void match(char expectedToken);
void error()

{
fprintf(stderr,"IS NOT A REGULAR EXPRESSION!\n");
exit(1);
}
void match(char expectedToken)

{
if(formula[i]==expectedToken)
i++; //get the next token
else
error();
}
void rexp()

{
t1();
rexp1();
}
void rexp1()

{
if(formula[i]=='|')
{
match('|');
t1();
rexp1(); //update by Plator
}
}
void t1()

{
t2();
t11();
}
void t11()

{
if(formula[i]==' ')
{
match(' ');
t2();
t11();
}
}
void t2()

{
t3();
t21();
}
void t21()

{
if(formula[i]=='*')
{
match('*');
t21(); //update by Plator
}
}
void t3()

{
if(formula[i]=='(')
{
match('(');
rexp();
if(formula[i]==')')
match(')');
}
else if(formula[i]>='a' && formula[i]<='z')
match(formula[i]);
else
error();
}
int main()

{
while(cin.getline(formula,100))
{
flag=1;
i=0;
rexp();
if(formula[i]=='\0')
cout<<"IS A REGULAR EXPRESSION!"<<endl;
else
error();
}
return 0;
}
瀹屾暣浠g爜錛?/Files/Plator/rexp.rar