亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

第二人生的源碼分析(104)腳本的詞法分析(2)

系統 1690 0
接著上一次,再來分析 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詞法分析器的規則。

第二人生的源碼分析(104)腳本的詞法分析(2)


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 韩国女主播一区二区三区视频 | 中文字幕在线观看 | 国产成人8x视频一区二区 | 国产一区在线视频观看 | 国产女人视频 | 99视频在线看观免费 | 国产欧美视频一区二区三区 | 99精品热线在线观看免费视频 | 成人欧美日韩高清不卡 | 男人的天堂在线精品视频 | 久久国产香蕉 | 久久66热这里只会有精品 | 激情影院免费看 | 第四色婷婷基地 | 欧美性猛交xxxxx按摩欧美 | 日韩免费片 | 久久精品国产亚洲综合色 | 日韩高清一区二区 | 最新国产福利在线 | 99精品福利| 久久久久99精品成人片三人毛片 | 亚欧有色亚欧乱色视频 | 久久加久久 | 婷婷综合久久狠狠色99h | 91视频专区 | 欧美一区二区三区成人看不卡 | 99在线观看免费 | 热灸灸这里只有精品 | 五月婷婷视频在线 | 国产午夜亚洲精品国产 | 国产一区二区免费播放 | 在线 v亚洲 v欧美v 专区 | 精品久久久久久中文字幕欧美 | 亚洲男人天堂久久 | 色偷偷资源网 | 四虎麻豆 | 亚洲成人高清在线观看 | 69精品久久久久 | 精品国产91在线网 | 欧美日本视频在线观看 | 在线亚洲精品国产成人二区 |