官术网_书友最值得收藏!

2.2 詞法分析過程

詞法分析從第一個字符開始遍歷,識別出字符“i”,如圖2-4所示。

圖2-4 識別出字符“i”

根據(jù)C語言的詞法規(guī)則,以字母或下劃線開頭的符號是標識符,所以根據(jù)“i”就可以確定當前分析的符號是一個標識符,但這個標識符的全部內(nèi)容是什么現(xiàn)在還無法確定,需要繼續(xù)向后遍歷。下面識別出“n”,如圖2-5所示。

圖2-5 識別出字符“n”

根據(jù)詞法規(guī)則,標識符的后續(xù)字符可以是字母、數(shù)字或下劃線,“n”符合規(guī)則,它屬于當前這個符號,繼續(xù)遍歷。下面識別出“t”,如圖2-6所示。

圖2-6 識別出字符“t”

仍然符合規(guī)則。繼續(xù)遍歷,識別出“空格”,如圖2-7所示。

圖2-7 識別出空格并確定符號“int”

它不再是字母、數(shù)字或下劃線,這意味著,當前這個標識符的全部內(nèi)容是“int”。下一個字符是空格,如圖2-8所示。

圖2-8 繼續(xù)識別空格

這個空格為什么要被再次識別呢?這是因為第一次識別的空格是“int”這個標識符的后續(xù),意味著“int”是一個標識符的完整內(nèi)容。完成“int”的識別后,詞法分析進入對下一個符號的識別,識別的起始位置從上一個符號的終結(jié)位置的下一個字符算起,在此就是空格,于是此時再次識別這個空格。可見,對這個空格的兩次識別,性質(zhì)是不一樣的,分別對應(yīng)著對前后兩個符號的處理。對于其他可以確定前一個標識符終結(jié)的分隔符,也會進行這樣的第二次處理。

根據(jù)C語言規(guī)則,空格是間隔符,不是任何符號的起始,于是跳過它,繼續(xù)向后遍歷,陸續(xù)識別出“f”、“u”、“n”、“(”。當發(fā)現(xiàn)“(”時,不再符合標識符“字母、數(shù)字、下劃線”的規(guī)則,于是可以確定,“fun”是一個完整的標識符,如圖2-9所示。

圖2-9 識別出“(”后確定符號“fun”

繼續(xù)準備識別下面的符號,對下一個字符“(”也進行了前后兩次識別。這與前面我們介紹的對空格的兩次識別是相同的,差異是,根據(jù)C語言詞法規(guī)則,“(”是個符號,不能忽略,如圖2-10所示。

圖2-10 繼續(xù)識別出“(”確定符號“(”

根據(jù)前面的方式繼續(xù)遍歷,識別出符號“int”、“a”、“int”、“b”、“)”、“;”,直到識別出“\n”,“\n”可跳過,如圖2-11所示。

圖2-11 識別出“\n”之前不斷確定符號

繼續(xù)遍歷,識別出符號“int”、“m”,之后遍歷到“=”,如圖2-12所示。

圖2-12 剛識別到“=”還不能確定符號全部內(nèi)容

這時候還不能確定當前符號就是“=”,也有可能是“==”的前半部分,根據(jù)C語言的詞法規(guī)則,“=”和“==”的含義是不一樣的,所以還要往后遍歷,發(fā)現(xiàn)后續(xù)字符是“1”,不是“=”,如圖2-13所示。

圖2-13 剛識別到“1”確定符號“=”

現(xiàn)在可以確定,當前符號是“=”,它是個運算符,在確定的符號“=”后繼續(xù)遍歷,還是剛才的字符“1”,如圖2-14所示。

圖2-14 識別到“1”后確定符號“=”

根據(jù)詞法規(guī)則,以數(shù)字開頭的符號是數(shù)字,說明當前符號是數(shù)字,繼續(xù)遍歷,識別到“0”,如圖2-15所示。

圖2-15 識別到“0”

繼續(xù)遍歷到“;”,如圖2-16所示。

圖2-16 識別到“;”后確定符號“10”

“;”不屬于數(shù)字,說明前面的數(shù)字已經(jīng)完結(jié),“10”就是當前數(shù)字符號的全部。從“10”后繼續(xù)遍歷,也就是“;”,如圖2-17所示。

圖2-17 確定符號“;”

最后識別到換行符“\n”,如圖2-18所示。

圖2-18 識別到“\n”

跳過換行符,繼續(xù)按照前面的方式對后續(xù)的字符串進行遍歷,切分出符號并提取信息。這就是詞法分析的大致過程。

主站蜘蛛池模板: 中宁县| 千阳县| 江山市| 丹江口市| 黑山县| 唐山市| 建瓯市| 东宁县| 吴旗县| 华池县| 东城区| 东丰县| 牡丹江市| 台山市| 唐河县| 建阳市| 霍邱县| 琼中| 阿拉尔市| 丁青县| 郑州市| 凤凰县| 遂溪县| 汾阳市| 宁津县| 汝州市| 静安区| 乐至县| 垦利县| 南京市| 陆川县| 兴义市| 行唐县| 仙游县| 大方县| 通辽市| 项城市| 纳雍县| 唐山市| 泰顺县| 澄迈县|