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

3.2 語法分析思路

前面的詞法分析已經(jīng)詳細(xì)講解了如何從C語言源程序文件的連續(xù)字符串中識別出一個個獨立、按序排列的符號(token)串,語法分析就要從這個符號串中識別出符合C語言語法的語句。識別的方法是:以C語言語法為模板,將符號串按序逐個匹配,如果能匹配成功,就可以確定匹配成功的符號串是一條符合C語言語法的句子,同時也就確定了這條語句的語法屬性(如函數(shù)聲明語句)及句子的各個語法成分(如返回值類型、函數(shù)名、參數(shù)列表)。如果與所有語法類型的模板都無法匹配,說明這個符號串有語法錯誤。

下面我們?nèi)砸郧懊嫣峁┑脑闯绦驗槔榻B語法分析。語法分析以句為處理單位,根據(jù)C語言語法規(guī)則,源程序中首先出現(xiàn)的是全局語句,下面列舉了幾種全局語句:

·外部變量聲明語句,如extern int a;

·全局變量聲明及初始化語句,如int a=10;

·函數(shù)聲明語句,如int fun(int a,int b);

·函數(shù)定義語句,如int fun(int a,int b){…}

這幾種全局語句的句型如圖3-2所示。

圖3-2 以模板形式展現(xiàn)的語法規(guī)則

一條實際的語句只能屬于一種具體的句型,下面我們從第一條語句開始分析,通過遍歷詞法獲得結(jié)果,分析它究竟屬于哪種句型。第一個符號是“int”,情景如圖3-3所示。

圖3-3 “int”和模板匹配的情景

從圖3-3中對句型的展示可知,外部變量聲明語句的第一個符號必須是“extern”,“int”不滿足這一條件,因此當(dāng)前句不可能是外部變量聲明語句。其他幾種句型的開頭是數(shù)據(jù)類型,“int”滿足條件,因此當(dāng)前句可能是其他幾種句型的任意一種,還需向后遍歷才能最終確定具體句型,情景如圖3-4所示。

圖3-4 “fun”和模板匹配的情景

下一個符號是標(biāo)識符“fun”。在剩下三種句型中,類型后跟著的分別是變量名、函數(shù)名、函數(shù)名,標(biāo)識符“fun”都滿足條件,所以仍然無法斷定當(dāng)前句型,還需繼續(xù)向后遍歷詞法分析結(jié)果,情景如圖3-5所示。

圖3-5 “(”和模板匹配的情景

下一個符號是“(”,顯然與全局變量定義中的“=”不匹配了,于是排除這種可能。剩余兩種句型仍然符合,還需向后遍歷,均出現(xiàn)了“(參數(shù)聲明表)”,向后遍歷到“int”、“a”、“int”、“b”、“)”時,都滿足這兩種句型的條件,無法確定當(dāng)前句型究竟是函數(shù)聲明還是函數(shù)定義,這部分遍歷的情景如圖3-6所示。

圖3-6 一直到“;”之前的符號和模板匹配的情景

再繼續(xù)向后遍歷,出現(xiàn)符號“;”,情景如圖3-7所示。

圖3-7 “;”和模板匹配的情景

此時函數(shù)聲明和函數(shù)定義的句型出現(xiàn)差異,函數(shù)聲明應(yīng)出現(xiàn)“;”,函數(shù)定義應(yīng)出現(xiàn)“{”,由此可知當(dāng)前語句型應(yīng)為函數(shù)聲明語句。

至此,在全局語句的四種句型中,我們根據(jù)詞法分析的結(jié)果,逐個詞進行匹配,最終排除了三種不符合的句型,確定了當(dāng)前語句的句型。可見,確定句型的過程是一個根據(jù)可能語句句型的全集不斷進行匹配,不斷排除錯誤可能的過程。

主站蜘蛛池模板: 额敏县| 墨玉县| 灵宝市| 新巴尔虎左旗| 吉首市| 泌阳县| 大连市| 文水县| 四子王旗| 榆社县| 泸州市| 保山市| 庆元县| 大姚县| 彭泽县| 万山特区| 望谟县| 乐至县| 青浦区| 会宁县| 运城市| 乌恰县| 蕲春县| 安塞县| 弥渡县| 什邡市| 霍邱县| 凤冈县| 双流县| 和龙市| 舟山市| 界首市| 台山市| 界首市| 香格里拉县| 潮州市| 吴旗县| 桐梓县| 石渠县| 从江县| 吴旗县|