欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

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

系統 1760 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條評論
主站蜘蛛池模板: 天天插天天舔 | 婷婷久久爱www | 国产精品久久久久久久久久久久 | 极品一级片| 伊人久久精品成人网 | 久久99国产精一区二区三区 | 免费看欧美成人性色生活片 | 波多野结衣全集在线观看 | 国产在线自在拍91精品黑人 | 九色成人蝌蚪国产精品电影在线 | 欧美大片欧美大片 | 欧美激情精品久久久久 | 视频一区二区中文字幕 | 亚洲国产成人精彩精品 | 99热在这里只有精品 | 欧美一区二区在线播放 | 一级视频免费观看 | 好吊日在线观看 | 九九热精 | 日本www视频在线观看 | 草久在线视频 | 中文字幕视频一区 | 小明看片成人永久在线观看 | 国产在线看片 | 国内精品免费一区二区观看 | 成人国产精品免费视频 | 欧美成人免费高清网站 | 成人黄色网址 | 成人免费看片视频 | 国产综合久久久久 | 国产精品视频1区 | 久草视频手机在线 | 国产精品人妻无码免费久久一 | 午夜av免费 | 97久久精品| 亚洲国产成人av好男人在线观看 | 91网页在线观看 | 中文字幕一区二区三区四区五区 | 亚洲综合激情另类小说区 | 久久久人成影片一区二区三区 | 九九全国免费视频 |