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

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

系統(tǒng) 2003 0
接著上一次,再來分析 flex文件的下一部份:規(guī)則部份。它們由一連串帶有代碼的正則表達式組成,當匹配相對應的正則表達式時,這些代碼就會被運行。下面就一段規(guī)則的代碼:
#001?%%
這行表示規(guī)則代碼開始。
?
#002?"http://" ?????????????????? { gInternalLine++; gInternalColumn = 0; comment(); }
這里使用“ //”來表注釋一行代碼。
?
#003?
#004?"integer" ????????? { count(); return(INTEGER); }
這里識別關鍵字 integer為整數(shù)據(jù)處理。
?
#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); }
上面這段依次是識別浮點數(shù) float,字符串string,鍵key,數(shù)組vector,四元數(shù)quaternion,旋轉(zhuǎn)rotation,列表list。可以看到每識別一個關鍵字出來就返回相應的標識ID,這樣方便后面的語法分析和語義分析,以及代碼的生成。
?
其它好多的規(guī)則都是跟上面一樣的,下面再來分析一些比較特別的規(guī)則,如下:
#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); }
這兩行就是識別數(shù)字串,比如第一行是識別 16進制的數(shù)字串,例如0x12,0Xa233。第二行是識別一般的10進制的數(shù)字。
?
下面這行是識文件結束的狀態(tài):
#001?"EOF" ????????????????? { yylval.sval = new char[UUID_STR_LENGTH]; strcpy(yylval.sval, "/n/n/n"); return(STRING_CONSTANT);
#002?}
?
下面是一些比較復雜的規(guī)則:
#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); }
識別浮點數(shù)。
?
#005?{N}*"."{N}+({E})?{FS}? { count(); yylval.fval = (F32)atof(yytext); return(FP_CONSTANT); }
識別浮點數(shù)。
?
#006?{N}+"."{N}*({E})?{FS}? { count(); yylval.fval = (F32)atof(yytext); return(FP_CONSTANT); }
識別浮點數(shù)。
?
#007?
#008?L?/"(//.|[^//"])*/" ??? { parse_string(); count(); return(STRING_CONSTANT); }
識別字符串常量。
?
下面一段是識別操作符的規(guī)則:
#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規(guī)則文件的分析,可以看到構造一個詞法分析器,還是比較復雜的。如果使用手工來構造一個詞法分析器會更加復雜多了。通過一節(jié)學會怎么編寫flex詞法分析器的規(guī)則。

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


更多文章、技術交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

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

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲欧美在线观看91偷拍 | 国产亚洲精品一区999 | 亚洲在线观看 | 亚洲国产视频在线 | 九九色| 亚洲国产精品不卡毛片a在线 | 欧美日韩在线成人免费视频大全 | 九色官网 | 免费精品精品国产欧美在线 | 99久久精品视香蕉蕉er热资源 | 日本免费高清一区 | 久久se精品一区二区影院 | 国产一区二区三区视频在线观看 | 免费福利视频网 | 天天射日 | 亚洲图区综合 | 国产精品成人h片在线 | 国产高清国内精品福利99久久 | 色婷亚洲 | 日韩亚洲欧美在线观看 | 99精品欧美一区 | 成人午夜在线 | 天天搞夜夜爽 | 在线成人免费视频 | 久久成人免费 | 欧美精品久久 | 青青热久免费精品视频精品 | 欧美一区二区三区免费视频 | 成人在线视频免费 | 日本人xx视频免费视频 | 久久一区二区三区免费播放 | 欧美伦理一区二区三区 | 久草视频在线免费播放 | 中国美女一级a毛片录像在线 | 亚洲美女视频网 | 日本毛片在线观看 | 欧美日韩第二页 | 欧美另类日韩中文色综合 | 成人黄性视频 | 日本高清视频一区二区三区 | 亚洲骚片 |