- 編譯系統(tǒng)透視:圖解編譯原理
- 新設(shè)計(jì)團(tuán)隊(duì)
- 4字
- 2019-01-04 03:30:39
3.3 產(chǎn)生式
3.3.1 什么是產(chǎn)生式
現(xiàn)在我們已經(jīng)基本了解了語法分析的思路,但是要做出一個(gè)真正的語法分析器,還需要補(bǔ)充不少細(xì)節(jié)。
我們看前面示例的第一句:
int m = 10;
這句似乎很簡(jiǎn)單,沒有任何問題。仔細(xì)想想全局變量定義及初始化語法還有形式上的變化,可以寫成:
int m = 10, n = 11, ……;
這也符合C語言全局變量定義及初始化的語法。
一個(gè)計(jì)算機(jī)語言的設(shè)計(jì)者為了盡可能提高這個(gè)語言的適用范圍和解決問題的能力,就要盡可能提高這個(gè)語言的表現(xiàn)力。提高表現(xiàn)力的方法很多,其中一個(gè)方法是增加語言的基礎(chǔ)概念(如標(biāo)識(shí)符、變量、函數(shù)、參數(shù)……),增加概念肯定會(huì)使語言的表現(xiàn)力更豐富,伴隨而來的問題是這個(gè)語言難記難學(xué),不利于推廣。另一種方法是在盡量少的概念的前提下,引入少量一看就懂的規(guī)則進(jìn)行不受限制的組合、拓展。C語言就采用了這種方法,前面舉的句子:
int m = 10, n = 11, ……;
就是不受限制拓展(定義及初始化變量的個(gè)數(shù)沒有具體數(shù)目的限制)的示例。類似示例還有很多,如:
int fun(int a , int b);
還可以不受限制地拓展為:
int fun(int a , int b, int c,……);
除了這類拓展之外,還有另外一類拓展,如:
if(……)…… else……
可以拓展為:
if(……)…… else If…… else If…… else If………………… else If……
此外,還可以組合拓展,如:
if(函數(shù)(參數(shù)))……
加入這樣簡(jiǎn)單的組合、拓展規(guī)則之后,C語言在增加很少概念的前提下表現(xiàn)力得到大大增強(qiáng),可以寫出邏輯更復(fù)雜的程序。熟悉C語言的讀者根據(jù)這些規(guī)則很容易找出更多的示例。
對(duì)人而言,這是一個(gè)非常簡(jiǎn)單的規(guī)則,但如何讓計(jì)算機(jī)“理解”這個(gè)規(guī)則并能識(shí)別出千變?nèi)f化的語句,卻不是一件容易的事。計(jì)算機(jī)只能做最簡(jiǎn)單的數(shù)字邏輯運(yùn)算,讓計(jì)算機(jī)“理解”規(guī)則就要把規(guī)則轉(zhuǎn)化為數(shù)字邏輯運(yùn)算。
3.2節(jié)的方法實(shí)際上采用了固定的語法模板作為標(biāo)準(zhǔn)去識(shí)別符號(hào)串,這種方法面對(duì)可以任意組合、拓展的C語言語法來說就顯得力不從心了,因?yàn)榈却R(shí)別的語句是如何組合、拓展的不得而知,甚至語句究竟包含多少個(gè)符號(hào)也是不確定的,固定模板的方法不再適用了。既然固定的語法模板不行,就采用動(dòng)態(tài)的、按規(guī)則變化的、不斷增長(zhǎng)的語法模板來應(yīng)對(duì)任意組合、拓展、不確定符號(hào)數(shù)量的問題。
這個(gè)解決方案就是產(chǎn)生式。
- Learning LibGDX Game Development(Second Edition)
- 兩周自制腳本語言
- 深入淺出WPF
- Learning Unity 2D Game Development by Example
- Learning Raspbian
- Python忍者秘籍
- 區(qū)塊鏈底層設(shè)計(jì)Java實(shí)戰(zhàn)
- C語言程序設(shè)計(jì)
- C#程序設(shè)計(jì)教程(第3版)
- Access 2010中文版項(xiàng)目教程
- 軟件項(xiàng)目管理實(shí)用教程
- 智能手機(jī)故障檢測(cè)與維修從入門到精通
- Django 5企業(yè)級(jí)Web應(yīng)用開發(fā)實(shí)戰(zhàn)(視頻教學(xué)版)
- 新印象:解構(gòu)UI界面設(shè)計(jì)
- 網(wǎng)絡(luò)數(shù)據(jù)采集技術(shù):Java網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)