接著上一次,再來分析
flex文件的下一部份:規則部份。它們由一連串帶有代碼的正則表達式組成,當匹配相對應的正則表達式時,這些代碼就會被運行。下面就一段規則的代碼:
#001?%%
這行表示規則代碼開始。
?
#002?"http://"
?????????????????? { gInternalLine++; gInternalColumn = 0; comment(); }
這里使用“
//”來表注釋一行代碼。
?
#003?
#004?"integer"
????????? { count(); return(INTEGER); }
這里識別關鍵字
integer為整數據處理。
?
#005?"float"
??????????????? { count(); return(FLOAT_TYPE); }
#006?"string"
?????????? { count(); return(STRING); }
#007?"key"
????????????? { count(); return(LLKEY); }
#008?"vector"
?????????? { count(); return(VECTOR); }
#009?"quaternion"
?????? { count(); return(QUATERNION); }
#010?"rotation"
???????? { count(); return(QUATERNION); }
#011?"list"
???????????? { count(); return(LIST); }
上面這段依次是識別浮點數
float,字符串string,鍵key,數組vector,四元數quaternion,旋轉rotation,列表list。可以看到每識別一個關鍵字出來就返回相應的標識ID,這樣方便后面的語法分析和語義分析,以及代碼的生成。
?
其它好多的規則都是跟上面一樣的,下面再來分析一些比較特別的規則,如下:
#001?0[xX]{H}+
????????? { count(); yylval.ival = strtoul(yytext, NULL, 0);?return(INTEGER_CONSTANT); }
#002?{N}+
?????????????? { count(); yylval.ival = strtoul(yytext, NULL, 10); return(INTEGER_CONSTANT); }
這兩行就是識別數字串,比如第一行是識別
16進制的數字串,例如0x12,0Xa233。第二行是識別一般的10進制的數字。
?
下面這行是識文件結束的狀態:
#001?"EOF"
????????????????? { yylval.sval = new char[UUID_STR_LENGTH]; strcpy(yylval.sval, "/n/n/n"); return(STRING_CONSTANT);
#002?}
?
下面是一些比較復雜的規則:
#001?
#002?{L}({L}|{N})*
????? { count(); yylval.sval = new char[strlen(yytext) + 1]; strcpy(yylval.sval, yytext); return(IDENTIFIER); }
這行是識別腳本定義的變量標識符。
?
#003?
#004?{N}+{E}
??????????????????? { count(); yylval.fval = (F32)atof(yytext); return(FP_CONSTANT); }
識別浮點數。
?
#005?{N}*"."{N}+({E})?{FS}?
{ count(); yylval.fval = (F32)atof(yytext); return(FP_CONSTANT); }
識別浮點數。
?
#006?{N}+"."{N}*({E})?{FS}?
{ count(); yylval.fval = (F32)atof(yytext); return(FP_CONSTANT); }
識別浮點數。
?
#007?
#008?L?/"(//.|[^//"])*/"
??? { parse_string(); count(); return(STRING_CONSTANT); }
識別字符串常量。
?
下面一段是識別操作符的規則:
#001?"++"
?????????????? { count(); return(INC_OP); }
#002?"--"
?????????????? { count(); return(DEC_OP); }
#003?"+="
?????????????? { count(); return(ADD_ASSIGN); }
#004?"-="
?????????????? { count(); return(SUB_ASSIGN); }
#005?"*="
?????????????? { count(); return(MUL_ASSIGN); }
#006?"/="
?????????????? { count(); return(DIV_ASSIGN); }
#007?"%="
?????????????? { count(); return(MOD_ASSIGN); }
?
?
下面兩行:
#001?[ /t/v/n/f]
??????????? { count(); }
這行是處理制表符。
?
#002?.
????????????????? { /* ignore bad characters */ }
處理不能正確處理的字符。
?
通過上面這段
flex規則文件的分析,可以看到構造一個詞法分析器,還是比較復雜的。如果使用手工來構造一個詞法分析器會更加復雜多了。通過一節學會怎么編寫flex詞法分析器的規則。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
