锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
鍦ㄧ綉涓婃悳绱?/span>flex錛屽畨瑁?/span>flex錛屽厛涓嬭澆flex錛堝師鏈墦綆楁斁涓婃潵鐨勶紝浣嗘槸鑰冭檻鍒扮増鏉冪殑闂錛岃繕鏄笉瑕佷簡銆傞渶瑕佺殑鏈嬪弸錛屾垜鍙互鍙戠粰浣狅級(jí)錛岀劧鍚庢寜鐓ч粯璁ょ殑姝ラ閫愭瀹夎銆?/span>
瀹夎鍚庯紝璁劇疆鐜鍙橀噺錛屽皢Path鎸囧悜flex.exe鎵鍦ㄧ殑鏂囦歡澶癸紙鏈満涓婁負(fù)錛?/span>C:\Program Files\GnuWin32\bin錛屼竴鑸寜榛樿鏂瑰紡瀹夎鍚?/span>flex.exe閮藉湪璇ユ枃浠跺す鍐咃級(jí)錛屽叿浣撴楠わ細(xì)
→瀵?#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鐨勬渶鍚庢坊鍔狅細(xì)
int yywrap()
{
return 1;
}
鐢ㄦ潵緇撴潫鎵弿
2. 鍦?/span>console涓婅緭鍏?/span>flex tiny.l錛岀敓鎴?/span>lex.yy.c錛屽皢鍏舵浛鎹?/span>scan.c錛岀紪璇戦摼鎺ョ敓鎴?/span>tiny鐨勭紪璇戝櫒銆?/span>
鍙傝冩枃鐚細(xì)
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瀛︿範(fàn)鏍忕洰涓婏紝璇風(fēng)湅錛?a href="http://www.shnenglu.com/Plator/category/7159.html">http://www.shnenglu.com/Plator/category/7159.html錛夛紝鑰楄垂浜嗘垜涓ゅぉ鐨勬椂闂磋В鍐寵繖浜涢棶棰樸傚洜姝ゆ垜鎯沖啓鏈枃錛屽皢鎶婁竴浜涙敞鎰忛棶棰樺彊榪板涓嬶紝甯屾湜瀵逛竴浜涙湅鍙嬫湁鎵甯姪銆?/span>
1. 瑕佸皢lex.yy.c鏀逛負(fù)CPP鏂囦歡錛?/span>lex.yy.cpp銆傚洜涓?/span>MFC鏄?/span>C++宸ョ▼錛岃嫢涓嶄慨鏀瑰垯浼?xì)鍑虹幇閿欒锛?/span>
2. 灝?/span>#include <stdio.h>鏀逛負(fù)#include <stdafx.h>錛屼笉鐒朵細(xì)鍑虹幇濡備笅閿欒錛?/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>錛屼負(fù)#include "unistd.h"銆傚洜涓?/span>unistd.h鏂囦歡涓畾涔変簡璇嶆硶鍒嗘瀽闇瑕佺敤鍒頒竴浜涘ご鏂囦歡銆?/span>
4. 濡傛灉lex婧愭枃浠墮渶瑕佺敤input璇誨彇瀛楃錛屽垯搴旇鎹㈢敤yyinput錛屽洜涓?/span>input浼?xì)涓?/span>C++涓殑嫻佸悕璇嶉噸澶嶏紝浼?xì)鍑虹幇缂栬瘧閿欒锛?/span>
5. 娉ㄦ剰涓浜?/span>I/O渚嬬▼鐨勫簲鐢紝鍏蜂綋璇瘋錛?a href="http://www.shnenglu.com/Plator/archive/2008/05/24/50940.html">http://www.shnenglu.com/Plator/archive/2008/05/24/50940.html
鍙槸鐭煭鍑犱釜閿欒錛屼絾鏄В鍐崇殑榪囩▼鍙傝冧簡澶ч噺璧勬枡錛岃櫧鐒朵笉鐭ラ亾榪欎簺璧勬枡鍑鴻嚜浣曚漢涔嬫墜錛屼絾鏄湪姝ゆ劅璋㈣繖浜涗綔鑰咃紒
瀹氫箟
%%
瑙勫垯
%%
鐢ㄦ埛浠g爜
涓涓?Lex 紼嬪簭鍒嗕負(fù)涓変釜孌碉細(xì)絎竴孌墊槸 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 鏉ュ畾涔夋爣璁板尮閰嶅悗鐨勫姩浣溿傦級(jí)緇х畫鐪嬫垜浠殑瀛楁暟緇熻紼嬪簭錛屼笅闈㈡槸鏍囪鍖歸厤鐨勮鍒欍?
瀛楁暟緇熻紼嬪簭涓殑 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銆備竴鑸潵璇達(dá)紝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 鏈夊嚑涓嚱鏁板拰鍙橀噺鎻愪緵浜嗕笉鍚岀殑淇℃伅錛屽彲浠ョ敤鏉ョ紪璇戝疄鐜板鏉傚嚱鏁扮殑紼嬪簭銆備笅琛ㄤ腑鍒楀嚭浜嗕竴浜涘彉閲忓拰鍑芥暟錛屼互鍙?qiáng)瀹冧滑鐨勪娇鐢ㄣ?璇﹀敖鐨勫垪琛ㄨ鍙傝?Lex 鎵嬪唽銆?
Lex 鍙橀噺
yyin FILE* 綾誨瀷銆?瀹冩寚鍚?lexer 姝e湪瑙f瀽鐨勫綋鍓嶆枃浠躲?br> yyout FILE* 綾誨瀷銆?瀹冩寚鍚戣褰?lexer 杈撳嚭鐨勪綅緗?緙虹渷鎯呭喌涓嬶紝yyin 鍜?yyout 閮芥寚鍚戞爣鍑嗚緭鍏ュ拰杈撳嚭銆?br> yytext 鍖歸厤妯″紡鐨勬枃鏈瓨鍌ㄥ湪榪欎竴鍙橀噺涓紙char*錛夈?br> yyleng 緇欏嚭鍖歸厤妯″紡鐨勯暱搴︺?br> yylineno 鎻愪緵褰撳墠鐨勮鏁頒俊鎭傦紙lexer涓嶄竴瀹氭敮鎸併傦級(jí)
Lex 鍑芥暟
yylex() 榪欎竴鍑芥暟寮濮嬪垎鏋愩?瀹冪敱 Lex 鑷姩鐢熸垚銆?br> yywrap() 榪欎竴鍑芥暟鍦ㄦ枃浠訛紙鎴栬緭鍏ワ級(jí)鐨勬湯灝捐皟鐢ㄣ傚鏋滃嚱鏁扮殑榪斿洖鍊兼槸1錛屽氨鍋滄瑙f瀽銆?鍥犳瀹冨彲浠ョ敤鏉ヨВ鏋愬涓枃浠躲備唬鐮佸彲浠ュ啓鍦ㄧ涓夋錛岃繖灝辮兘澶熻В鏋愬涓枃浠躲?鏂規(guī)硶鏄嬌鐢?yyin 鏂囦歡鎸囬拡錛堣涓婅〃錛夋寚鍚戜笉鍚岀殑鏂囦歡錛岀洿鍒版墍鏈夌殑鏂囦歡閮借瑙f瀽銆傛渶鍚庯紝yywrap() 鍙互榪斿洖 1 鏉ヨ〃紺鴻В鏋愮殑緇撴潫銆?br> yyless(int n) 榪欎竴鍑芥暟鍙互鐢ㄦ潵閫佸洖闄や簡鍓?n? 涓瓧絎﹀鐨勬墍鏈夎鍑烘爣璁般?br> yymore() 榪欎竴鍑芥暟鍛婅瘔 Lexer 灝嗕笅涓涓爣璁伴檮鍔犲埌褰撳墠鏍囪鍚庛?
鍒版涓烘錛屽彲鑳戒綘鐪嬪埌l(fā)ex紼嬪簭榪樹細(xì)鑼冩檿錛屾病鍏崇郴錛屼笅闈㈡垜浠帴鐫鏉ワ紝鍒嗘瀽涓涓被pascal璇硶鐨勬瀬綆鏋愬櫒錛?
/* 榪欎釜灝辨槸娉ㄩ噴浜?/
/* scanner for a toy Pascal-like language */
鐢蟲槑閮ㄥ垎寮濮?br>%{ 鍐呯殑涓滆タ浼?xì)鍘煘畞涓嶅姩鍦板嚭鐜板湪杈撳嚭鏂囦欢涓?}%
%{
/* 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á)紝閭d箞錛屽姩浣滃皢浼?xì)鎸伨l埌},濡傛灉鍔ㄤ綔涓嚭鐜頒簡鎷彿{},寮濮嬮噰鐢?%{ %}鏉ヨ〃紺哄姩浣滃幓鍖烘銆傚姩浣滈儴鍒嗗鏋滄椂 |,灝辮〃紺轟笌涓嬩竴鏉¤鍒欐墽琛岀浉鍚岀殑鍔ㄤ綔銆?
濂界殑錛屾垜浠潵鐪嬩竴涓洿涓哄疄鐢ㄤ竴鐐圭殑lex紼嬪簭銆?br>鎴戜滑鍏堝畾涔変笁涓姩浣?
ECHO 灝唝ytext杈撳嚭
BEGIN 寮濮嬩竴涓潯浠跺鐞嗗潡
REJECT 鎸囩ず綆鏋愬櫒瀵瑰綋鍓嶈鍒欎笉鍋氬鐞嗭紝鑰屾槸閲囩敤絎簩鍖歸厤瑙勫垯銆?
int word_count = 0;
%%
frob special(); REJECT;
[^ \t\n]+ ++word_count;
濡傛灉frob娌℃湁REJECT鍔ㄤ綔錛宖rob灝嗕笉浼?xì)琚鏁板Q屽洜涓鴻В鏋愬櫒鍦ㄩ氬父鎯呭喌涓嬶紝姣忎釜琚尮閰嶇殑瀵硅薄鍙細(xì)瀵逛竴涓姩浣滅敓鏁堬紝澶氫釜REJECT涔熸槸鍏佽鐨勶紝浼?xì)瀵绘壘涓嬩竴涓渶閰嶇殑瑙勫垯鏉ュ仛澶勭悊銆傛墍浠ワ紝涓嬮潰鐨勮鍒欎細(xì)鎶婅緭鍏ョ殑"abcd"澶勭悊鍚庤緭鍑?abcdabcaba".
%%
a |
ab |
abc |
abcd ECHO; REJECT;
.|\n /* eat up any unmatched character */
`yymore()' 鍛婅瘔瑙f瀽鍣ㄤ笅涓嬈″尮閰嶇殑瑙勫垯錛屾弧瓚崇殑閮ㄥ垎灝嗕細(xì)娣誨姞鍒板綋鍓峺ytext鍊煎緱鍚庨潰鑰屼笉鏄浛鎹㈠畠銆?渚嬪錛屾寚瀹氱殑杈撳叆"mega-kludge"緇忚繃涓嬮潰鐨勭▼搴忓鐞嗗悗灝嗕細(xì)杈撳嚭"mega-mega-kludge"銆?
%%
mega- ECHO; yymore();
kludge ECHO;
絎竴涓?"mega-" 琚弧瓚沖茍涓旇緭鍑? 鐒跺悗 "kludge" 婊¤凍, 浣嗘槸騫舵病鏈夋浛鎹箣鍓嶇殑"mega-"鑰屾槸"kludge"闄勫姞鍒頒粬鐨勫悗闈紝鐒跺悗杈撳嚭鐨勫叾瀹炴槸"mega-kludge".
yymore()闇瑕佷袱浠朵簨鎯呴渶瑕佹敞鎰忋傜涓錛寉ymnore()渚濊禆浜庤〃鐜板綋鍓嶅尮閰嶉」鐨勯暱搴yleng鐨勫鹼紝鎵浠ヤ嬌鐢▂ymore涓嶅厑璁告敼鍙榶yleng鐨勫箋傜浜岋紝yymore()鐨勪嬌鐢ㄤ細(xì)浣胯В鏋愬櫒浠樺嚭涓鐐圭偣鎬ц兘鐨勪唬浠楓?
鏈墆ymore()灝辨湁yyless()
yyless(n) 榪斿洖褰撳墠鍖歸厤欏歸櫎浜嗗紑濮嬬殑n涓瓧絎﹀唴鐨勬墍鏈夌殑鍐呭鍒拌緭鍏ョ紦瀛樺尯錛岃В鏋愬櫒澶勭悊涓嬩竴涓尮閰嶆椂錛屽畠浠皢浼?xì)琚噸鏂拌В鏋愩倅yless灝嗕細(xì)瀵艱嚧yytext涓巠yleng鐨勮皟鏁淬傦紙yyleng灝嗕細(xì)絳変簬=n錛?濡傝緭鍏?foobar"琚笅闈㈢殑紼嬪簭澶勭悊鍚庯紝灝嗕細(xì)杈撳嚭"boobarbar". 鍥犱負(fù)鍓峮=3涓瓧絎oo澶栫殑瀛楃bar琚噸鏂拌繑鍥炲埌杈撳叆緙撳瓨鍖轟簡銆?
%%
foobar ECHO; yyless(3);
[a-z]+ ECHO;
鍙傛暟0瀵逛簬yyless灝嗕細(xì)瀵艱嚧鏁翠釜褰撳墠鍖歸厤灝嗕細(xì)琚噸鏂拌В鏋愩傞櫎闈炰綘鏀瑰彉浜嗚В鏋愬櫒鏈潵鐨勫鐞嗘祦紼?濡備嬌鐢╞egin),榪欏皢浼?xì)瀵艰嚧弩@鐜粨鏉熴傞渶瑕佹敞鎰忕殑鏄紝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()灝嗘寚瀹氱殑瀛楃娣誨姞鍒拌緭鍏ユ簮鐨勫紑澶達(dá)紝鎵浠ュ皢瀛楃涓叉坊鍔犲埌杈撳叆婧愬紑澶村繀欏諱粠鍚庨亾鍓嶅鐞嗐備竴涓瘮杈冮噸瑕佺殑娼滃湪闂鏄嬌鐢╱nput()鐨勬椂鍊欙紝濡傛灉閲囩敤浜?pointer鎸囬拡妯″紡淇濆瓨yytext,unput浼?xì)鐮村潖yytext鐨勫唴瀹癸紝浠庢渶鍙寵竟鐨勫瓧絎﹀紑濮嬪皢浼?xì)鐮村潖宸﹁竟鐨勪竴涓瓧絎︺傚鏋滃湪unput()鍚庤鐢ㄥ埌yytext,浣犻鍏堝繀欏誨鍒朵竴浠統(tǒng)ytext,鎴栬呯敤%array妯″紡鏉ヤ繚瀛榶ytext. 鏈鍚庝綘涓嶈兘鏀句竴涓狤OF鍘昏瘯鍥炬爣蹇楄緭鍏ユ祦鐨勭粨鏉熴?
input 浠庤緭鍏ユ簮涓鍙栦笅涓涓瓧絎︺備緥濡傦紝涓嬮潰鏈夌殑渚嬪瓙灝嗕細(xì)鍚冩帀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紝鍥犱負(fù)input()涓嶤++涓殑嫻佸悕縐癷nput鍐茬獊銆?
YY_FLUSH_BUFFER 鍒鋒柊瑙f瀽鍣ㄥ唴閮ㄧ紦瀛樹互渚夸簬涓嬩竴嬈$殑鍖歸厤宸ヤ綔錛岄鍏堝畠浼?xì)鋴社敤YY_INPUT濉厖緙撳瓨鍖恒傝繖鏄氱敤yy_flush_buffer()鐨勪竴涓壒渚嬶紝灝嗕細(xì)鍦ㄥ杈撳叆緙撳瓨涓弿榪般?
yyterminate()鍙互鍦ㄥ姩浣滃唴閮ㄨ繑鍥炴弿榪板尯鍩熶腑浣跨敤錛屽畠?yōu)畣缁堟瑙f瀽鍣q惰繑鍥?緇欒В鏋愬櫒璋冪敤鑰咃紝琛ㄧず鎿嶄綔瀹屾垚銆傜己鐪佹儏鍐典笅錛屽埌杈炬枃浠剁粨鏉熶綅緗篃浼?xì)琚皟鐢ㄥQ屽畠鏄竴涓畯錛屽茍涓斿彲鑳介噸瀹氫箟銆?/p>
Lex榪涢樁
妯″紡
妯″紡鍦ㄧ涓闃舵鎴栫浜屼釜闃舵浣跨敤錛屼篃灝辨槸鍦ㄧ敵鏄庢垨瑙勫垯闃舵涓嚭鐜幫紝妯″紡瀹氫箟浜嗗尮閰嶇殑鐩爣錛岀洰鏍囪鍖歸厤鍚庡皢浼?xì)鎵ц鍔ㄤ綔銆?br>瀵逛簬妯″紡涓嶆兂鍋氬お澶氳鏄庯紝浣跨敤姝e垯琛ㄨ揪寮忓畾涔夛紝鍙互鍙傜湅 regex 鎴?pcre.
寮濮嬫潯浠?br>lex鎻愪緵浜嗘牴鎹潯浠舵縺媧昏鍒欑殑鏈哄埗銆傚湪<sc>鍓嶇紑鐨勮鍒欏皢浼?xì)鍦ㄨВ鏋愬櫒鍦?sc"鐨勫紑濮嬫潯浠朵笅琚尮閰嶃?/p>
<STRING>[^"]* { /* eat up the string body ... */ ... }
灝嗕細(xì)鍦ㄥ惎鍔ㄦ潯浠?STRING"鐨勬儏鍐典笅琚縺媧匯?/p>
<INITIAL,STRING,QUOTE>\. { /* handle an escape ... */ ... }
灝嗕細(xì)鍦?"INITIAL", "STRING", "QUOTE"涓夎呬箣涓鐨勬潯浠朵笅琚縺媧匯?/p>
寮濮嬫潯浠跺湪杈撳叆婧愮殑瀹氫箟(絎竴錛夐儴鍒嗚鐢蟲槑錛屽湪‘%s' 鎴?’%x'鍚庤窡闅忕潃鍚嶅瓧鍒楄〃銆?%s鐢蟲槑浜嗗寘鍚殑寮濮嬫潯浠訛紝%x鐢蟲槑浜嗘帓浠栫殑寮濮嬫潯浠躲傚紑濮嬫潯浠惰BEGIN鍔ㄤ綔嬋媧匯傜洿鍒頒笅涓涓狟EGIN鍔ㄤ綔錛屾弧瓚沖紑濮嬫潯浠跺悕縐扮殑瑙勫垯灝嗕細(xì)琚鍒欙紝涓嶆弧瓚沖惎鍔ㄦ潯浠剁殑瑙勫垯灝嗕笉浼?xì)琚墽琛屻?/p>
濡傛灉鏄寘鍚潯浠訛紝娌℃湁寮濮嬫潯浠剁殑瑙勫垯涔熶細(xì)琚縺媧繪墽琛岋紝濡傛灉鏃舵帓浠栨潯浠訛紝鍙湁婊¤凍寮濮嬫潯浠剁殑瑙勫垯鎵嶄細(xì)琚墽琛屻?/p>
鍏鋒湁鐩稿悓鎺掍粬鏉′歡鐨勮鍒欑殑闆嗗悎鍙互浣胯В鏋愬櫒鐙珛浜庡叾浠栫殑瑙勫垯銆傚洜姝わ紝鎺掍粬鏉′歡鍙互瀹規(guī)槗鍦板垱寤哄井鍨嬭В鏋愬櫒澶勭悊杈撳叆婧愪腑鐨勭嫭绔嬩笌鍏朵粬閮ㄥ垎鐨勪竴閮ㄥ垎錛堝錛屾敞閲婏級(jí)銆傚鏋滃浜庡寘鍚笌鎺掍粬鏉′歡榪樻湁娣鋒穯錛屽彲浠ョ湅涓嬮潰鐨勪緥瀛愩?/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瑙勫垯灝嗘案榪滀笉浼?xì)琚珛葊媧匯傚鏋滀嬌鐢?lt;example>錛屽皢浼?xì)瀵艰嚧鍙兘鍦╡xmaple寮濮嬫潯浠朵笅嬋媧伙紝鑰孖NITIAL鏉′歡涓嬩笉浼?xì)琚珛葊媧匯傝岀涓涓▼搴忎腑鍦ㄤ換浣曟潯浠朵笅bar閮借浼?xì)婵媧匯傚洜涓虹涓涓▼搴忕敤example鏃?s錛屾椂鍖呭惈鏉′歡銆傞〉鍙互閫氳繃鐗規(guī)畩寮濮嬫潯浠?lt;*>鏉ラ厤緗換浣曞紑濮嬫潯浠訛紝涓婇潰鐨勭▼搴忚繕鍙互鍐欎負(fù)錛?/p>
%x example%%<example>foo do_something();<*>bar something_else();
緙虹渷瑙勫垯錛堟樉紺轟換浣曟湭琚尮閰嶇殑瀛楃錛夊湪寮濮嬫潯浠朵笅浠嶇劧鐢熸晥銆傜瓑鍚屼簬錛?/p>
<*>.|\\n ECHO;
‘BEGIN(0)’鍦ㄦ棤寮濮嬫潯浠剁殑瑙勫垯嬋媧繪潯浠朵笅榪斿洖鍘熷鐘舵侊紝榪欎釜鐘舵佸悓浜庡紑濮嬫潯浠朵笅鐨?INITIAL',鎵浠?#8216;BEGIN(INITIAL)'絳夊悓浜?#8217;BEGIN(0)'銆?br>BEGIN琛屼負(fù)鍦ㄨ鍒欓儴鍒嗙殑寮澶存槸榛樿鐨勪唬鐮侊紙BEGIN actions can also be given as indented code at the beginning of the rules section.璇風(fēng)炕璇戯級(jí)渚嬪錛屼笅闈㈢殑浠g爜灝嗕細(xì)浠呴渶SPECIAL寮濮嬫潯浠訛紝涓嶇鍚堥倅ylex()琚皟鐢ㄥ茍涓斿叏灞鍙橀噺enter_special鏄痶rue銆?/p>
int enter_special;%x SPECIAL%% if ( enter_special ) BEGIN(SPECIAL);<SPECIAL>blahblahblah...more rules follow...
涓轟簡璇存槑寮濮嬫潯浠訛紝鎴戜滑鐢ㄤ袱縐嶆柟娉曞鐞?123.456".緙虹渷灝嗕細(xì)琚В鏋愪負(fù) '123','.','456'涓変釜鏍囪錛屽鏋渆xpect-floats鍚庨潰灝嗕細(xì)琚В鏋愪負(fù)嫻偣鏁?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.
娉ㄦ剰: 寮濮嬫潯浠剁殑鍚嶅瓧瀹為檯涓婃椂涓涓暣褰㈠煎茍涓旇兘澶熻淇濆瓨錛屾墍浠ワ紝涓婇潰鐨勪唬鐮佸彲浠ユ墿灞曚負(fù)錛?/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瀹忔潵璁塊棶褰撳墠鐨勫紑濮嬫潯浠躲傚涓婇潰鐨勮祴鍊兼潯浠跺彲浠ユ敼鍐欎負(fù)
comment_caller = YY_START
YYSTATE鏄痀Y_START鐨勫埆鍚嶏紙鍥犱負(fù)AT&T lex浣跨敤浜哬YSTATE錛夈?br>娉ㄦ剰 寮濮嬫潯浠舵病鏈変粬浠殑鍚嶅瓧絀洪棿; %s 涓?%x 鐢蟲槑涓?#define褰㈠紡涓鏍楓?/p>
鍒拌繖閲岋紝鏃朵竴涓嬌鐢ㄦ帓浠栧紑濮嬫潯浠跺浣曞尮閰岰椋庢牸鐨勫紩鐢ㄥ瓧絎︿覆鐨勫鐞嗐傚寘鍚殑鎵╁睍鐨勮漿涔夛紝浣嗕笉鍖呮嫭媯(gè)鏌ワ紝鍥犱負(fù)浠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++; }
閫氬父錛屽涓婇潰鐨勪緥瀛愪腑鎵鐪嬪埌浣狅紝浼?xì)鏈夎澶氱浉鍚屽紑濮嬫潯浠剁殑澶勭悊銆傚紑濮嬫潯浠惰寖鍥村彲浠ョ畝鍖栭噸澶嶆搷浣溿?/p>
<SCs>{}
SCs 鏄竴涓垨寮濮嬫潯浠剁殑鍒楄〃銆傚湪榪欎釜寮濮嬫潯浠惰寖鍥村唴錛屾瘡涓鍒欏皢浼?xì)鑷姩鍏锋湁鍓嵕~ `<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()'
榪斿洖鏍堥《鍊鹼紝涓嶆敼鍙樻爤鍐呭銆?
寮濮嬫潯浠舵爤鍔ㄦ佸闀匡紝娌℃湁鍥哄畾闄愬埗錛屽鏋滃唴瀹圭敤灝斤紝紼嬪簭绔熶細(xì)緇堟銆?
涓轟簡浣跨敤寮濮嬫潯浠舵爤錛岄渶瑕佷嬌鐢?`%option stack' 鎸囦護(hù)銆?
澶氳緭鍏ョ紦瀛樺尯
涓浜涘厑璁竔nclude鏂囦歡瑙f瀽鍣ㄧ殑瑙f瀽鍣ㄨ姹備粠鍑犱釜杈撳叆嫻佷腑璇誨彇鍐呭銆俌Y_INPUT鍙湪緇撴潫緙撳瓨鏃惰璋冪敤錛岀鍒?include 鍚庨渶瑕佸垏鎹㈣緭鍏ユ簮錛岃岃В鏋愪竴涓弿榪頒篃璁?dāng)R渶瑕佸緢闀挎椂闂淬備負(fù)浜嗚В鍐蟲綾婚棶棰橈紝瑙f瀽鍣ㄦ彁渚涗簡鍒涘緩騫跺湪澶氫釜杈撳叆緙撳瓨涓垱寤虹殑鏈哄埗銆傝緭鍏ョ紦瀛樺彲浠ラ氳繃涓嬮潰鐨勬柟寮忓垱寤?
YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )
鍙傛暟涓轟笌緙撳瓨鍏寵仈鐨勮緭鍏ユ枃浠舵寚閽堬紝浠ュ強(qiáng)瓚沖鐨勫彲緇存寔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瀽鍣ㄧ殑杈撳叆緙撳瓨灝嗕細(xì)瀵艱嚧璁版帴涓嬫潵鐨勫尮閰嶉」鏉ヨ嚜浜庢柊鐨勭紦瀛樹腑銆倅y_switch_to_buffer鍙兘鍑虹幇鍦▂ywrap涓負(fù)緇х畫瑙f瀽鍋氬噯澶囷紝鏇挎崲鎵撳紑涓涓柊鐨勬枃浠跺茍鎵цyyin. 閫氳繃yy_switch_to_buffer 鎴?yywrap鍒囨崲杈撳叆婧愪笉鏀瑰彉寮濮嬫潯浠躲?
void yy_delete_buffer( YY_BUFFER_STATE buffer )
鐢ㄤ簬鏀跺洖涓庣紦瀛樺叧鑱旂殑絀洪棿銆備綘鍙互浣跨敤涓嬮潰鐨勫嚱鏁版竻絀哄綋鍓嶅唴瀹?
void yy_flush_buffer( YY_BUFFER_STATE buffer )
姝ゅ嚱鏁板簾寮冪紦瀛樺唴瀹癸紝涓嬩竴涓В鏋愬櫒璇曞浘鍖歸厤涓涓唴瀹規(guī)椂灝嗕細(xì)浣跨敤YY_INPUT鏉ユ洿鏂扮紦瀛樺尯銆?/p>
`yy_new_buffer()' 鏄?`yy_create_buffer()' 鐨勪竴涓埆鍚嶏紝鐢ㄤ簬鎻愪緵C++浣跨敤new 涓?delete鎿嶄綔鍒涘緩涓庨攢姣佸姩鎬佸璞$殑鍏煎鎬с?/p>
鏈鍚? YY_CURRENT_BUFFER 瀹忚繑鍥?YY_BUFFER_STATE 鎸囬拡錛岃〃紺哄綋鍓嶇殑緙撳瓨銆?/p>
榪欓噷鏄竴涓墿灞昳nclude浣跨敤鐨勪竴涓В鏋愬櫒 (`<<EOF>>' 鐗規(guī)у皢浼?xì)鍦ㄤ互鍚庤璁?:
/* "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()' 灝嗕細(xì)瑙f瀽瀛楃涓層?/p>
`yy_scan_string(const char *str)' 瑙f瀽0緇撳熬瀛楃涓層?br>`yy_scan_bytes(const char *bytes, int len)' 瑙f瀽bytes寮濮嬬殑len涓瓧絎?鍙兘鍖呭惈 0 瀛楃)
娉ㄦ剰錛屼笂闈㈢殑涓や釜鍑芥暟浼?xì)鍒涘缓瀛椊W︿覆鎴栧瓧鑺備覆鐨勫壇鏈?榪欎篃璁告椂鏈熸湜鐨勶紝鍥犱負(fù)`yylex()' 浼?xì)淇敼琚В鏋惥~撳瓨鐨勫唴瀹? 鍙互浣跨敤涓嬮潰鐨勬柟寮忔潵鎷掔粷浣跨敤鍓湰:
`yy_scan_buffer(char *base, yy_size_t size)'
灝嗕細(xì)浠巄ase寮濮嬭В鏋愶紝鍖呭惈size涓瓧鑺? 鏈鍚庣殑涓や釜瀛楄妭蹇呴』鏄?YY_END_OF_BUFFER_CHAR (ASCII NUL)銆備粬浠笉浼?xì)琚В鏋? 瑙f瀽鑼冨洿浠?`base[0]' 鍒?`base[size-2]'錛堝寘鍚級(jí)銆傚鏋滀綘娌¤兘鎸夌収榪欑瑙勫畾浣跨敤base錛堝錛屽繕璁頒簡鏈鍚庣殑涓や釜YY_END_OF_BUFFER_CHAR瀛楄妭), `yy_scan_buffer()' 灝嗕細(xì)榪斿洖絀烘寚閽堣屼笉鍒涘緩YY_BUFFER_STATE銆倅y_size_t綾誨瀷鏄釜鏁村瀷錛屽彲浠ヨ漿鍖栦負(fù)鏁存暟鏉ュ弽鏄燽uffer鐨勯暱搴︺?/p>
鏂囦歡緇撴潫瑙勫垯
鐗規(guī)畩瑙勫垯 "<<EOF>>" 鍙槸瑙勫垯鍦ㄦ枃浠剁粨鏉熶綅緗彂鐢熶笖yywrap()榪斿洖闈?鍊箋?濡傦紝娌℃湁鏇村鐨勬枃浠惰澶勭悊). 榪欎釜鍔ㄤ綔蹇呴』瀹屾垚涓嬮潰鍥涗歡浜嬫儏涔嬩竴:
璧嬪肩粰yyin涓涓柊鐨勬枃浠?(鏃╂湡鐗堟湰鐨刦lex, 姝ゆ搷浣滃悗蹇呴』璋冪敤鐗規(guī)畩鍔ㄤ綔 YY_NEW_FILE; 榪欎釜鎿嶄綔宸茬粡涓嶉渶瑕佷簡);
鎵ц涓涓繑鍥炵敵鏄?
鎵ц涓涓壒孌婄殑`yyterminate()' 鍔ㄤ綔;
鎴栬呬嬌鐢╜yy_switch_to_buffer()' 鍒囨崲鍒頒竴涓柊鐨勮緭鍏ョ紦瀛樺尯.
<<EOF>> 涓嶈兘涓庡叾浠栨ā寮忎竴璧蜂嬌鐢紱瀹冧篃璁鎬粎鍦ㄥ紑濮嬫潯浠跺垪琛ㄧ敵鏄庛傚鏋滄寚瀹氫簡涓嶅悎娉?<<EOF>> 瑙勫垯, 瀹冨皢浼?xì)搴旂敤鍒版墍鏈夌殑寮濮嬫潯浠惰屼笉浠呮槸 <<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涓嶈兘瀹屾垚鍚戝墠鎼滅儲(chǔ)鐨勬搷浣溿侺ex鍦ㄤ笉闇瑕佺殑鏃跺欎笉浼?xì)鍚戝墠鎼滅储锛屼絾鏄瘡涓涓互+*?$緇撳熬鐨勩佹垨鑰呭惈鏈?鐨勮鍒欓渶瑕佽繖涓姛鑳姐傚悓鏍鳳紝褰撲竴涓〃杈懼紡鏄彟涓涓殑鍓嶇紑鏃訛紝鍚戝墠鎼滅儲(chǔ)涔熸槸蹇呬笉鍙皯鐨勩傚弬闃呬笅鏂囦腑鏈夊叧Lex浣跨敤鐨勫瓧絎﹂泦鐨勮璁恒傞粯璁ょ殑Lex搴撲嬌鐢?00涓瓧絎︿綔涓哄鐢ㄩ檺鍒躲?