- 編譯系統透視:圖解編譯原理
- 新設計團隊
- 585字
- 2019-01-04 03:30:32
1.3.2 語法分析
如果說詞法分析的作用是從連續的字符中識別出標識符、關鍵字、數字、運算符并存儲為符號(token)流,語法分析的作用就是從詞法分析識別出的符號流中識別出符合C語言語法的語句。
因為計算機無法像人那樣同時看多個標識符、關鍵字、數字、運算符,無法像人那樣一眼看出這是一個函數聲明,那是一個if語句,只能非常笨拙地一個符號一個符號去識別。與詞法分析器有些類似,語法分析器也是依據用計算機表示的語法,一個符號一個符號地識別出符合C語言語法的語句。語法的計算機表示就是產生式。在語法分析器中把通過產生式產生的C語言語法映射成一套模板,并把這套模板融匯在語法分析器的程序中。語法分析器的作用就是將詞法分析器識別出的符號(token)一個一個地與這套模板進行匹配,匹配上這套模板中的某個語法,就可以識別出一句完整的語句,并確定這條語句的語法。
我們以案例中“int fun(int a,int b);”這條函數聲明語句為例描述這個過程,它與語句模板的匹配情景如圖1-38所示。

圖1-38 fun函數聲明語句與模板匹配的結果
這段token流最終與函數聲明模板相匹配,在匹配成功后,計算機就認為此語句為函數聲明語句,并以語法樹的形式在內存中記錄下來,情景如圖1-39所示。

圖1-39 fun函數聲明語句生成的語法樹
以樹型結構來記錄分析出的語句是一個非常巧妙、深謀遠慮、通盤考慮的選擇。一方面,樹型結構能夠“記住”源程序全部的“意思”,另一方面,樹型結構更容易對應到運行時結構。
推薦閱讀
- Building a Game with Unity and Blender
- Hands-On Data Structures and Algorithms with JavaScript
- Android Development with Kotlin
- Django Design Patterns and Best Practices
- Java:Data Science Made Easy
- HTML5+CSS3+JavaScript Web開發案例教程(在線實訓版)
- Hands-On Functional Programming with TypeScript
- RabbitMQ Cookbook
- Learning OpenStack Networking(Neutron)
- Go語言底層原理剖析
- Node.js區塊鏈開發
- Photoshop智能手機APP界面設計
- Flutter之旅
- Backbone.js Patterns and Best Practices
- 計算思維與Python編程