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

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)生式。

主站蜘蛛池模板: 汉寿县| 高青县| 宁津县| 长白| 定兴县| 安龙县| 逊克县| 阿勒泰市| 金溪县| 新郑市| 南澳县| 昭苏县| 绥德县| 军事| 丰县| 邛崃市| 安康市| 扎囊县| 曲水县| 山西省| 多伦县| 泽州县| 科技| 黎城县| 凌源市| 桑日县| 怀化市| 阳西县| 梅州市| 潼南县| 商河县| 阿克苏市| 儋州市| 泰来县| 墨玉县| 惠来县| 乐亭县| 云浮市| 元氏县| 商丘市| 台安县|