- 編譯系統(tǒng)透視:圖解編譯原理
- 新設(shè)計團隊
- 1099字
- 2019-01-04 03:30:39
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ù)可能語句句型的全集不斷進行匹配,不斷排除錯誤可能的過程。
- 大話PLC(輕松動漫版)
- Embedded Linux Projects Using Yocto Project Cookbook
- Web應(yīng)用系統(tǒng)開發(fā)實踐(C#)
- Getting Started with React
- Docker進階與實戰(zhàn)
- 控糖控脂健康餐
- OpenNI Cookbook
- Groovy for Domain:specific Languages(Second Edition)
- 精通Python自動化編程
- Go語言精進之路:從新手到高手的編程思想、方法和技巧(1)
- Python爬蟲、數(shù)據(jù)分析與可視化:工具詳解與案例實戰(zhàn)
- 匯編語言編程基礎(chǔ):基于LoongArch
- Instant Zurb Foundation 4
- Spring Boot從入門到實戰(zhàn)
- 每個人的Python:數(shù)學(xué)、算法和游戲編程訓(xùn)練營