我們知道世界上存在很多種語言:我們可以把他們分為自然語言(人們日常交流的工具)和程式語言。自然語言複雜且難以描述,程式語言結構規整,便於處理。
但兩者又有共性,即核心都由語法和語義兩部分組成。那什麼是語言呢??
首先來看一下字母表定義:字母表是元素的非空有窮集合。字母表包含了語言中允許出現的全部符號。例如:英語的字母表包含了英文本母,數字,標點符號等。c語言的字母表
是一切可列印字元組成的集合。
給出語言的定義:語言是確定其字母表上字串的任何集合。例如:c語言就是符合c語法的程式組成的集合。
想要分析語言,就要知道語言的結構,文法就是一種能夠用有限規則來展現出語言的結構的形式。文法可以說是編譯原理
的基礎,是描述一門程式語言和實現其編譯器
的方法。文法的描述多用bnf(巴克斯正規化),我們熟知的正規表示式也是文法的一種形式。
乙個文法
g是乙個四元組:g= ( vn,vt,s,p )
vn:非終結符號(或語法實體,或變數)集
vt::終結符號集,組成語言的不可再分的基本符號集
s:文法的開始符號或識別符號,亦稱公理
p:產生式集,即文法的規則。其形式為a—> β
例如:設有語句 」 小孩子吃大西瓜 "
其漢語文法可表示為:
vn =
vt =
s = 句子
p =
我們用符號 => 來表示直接推導。依照上面給出的例子,有:
《句子》 =>
《主語》 《謂語》
=> 《形容詞》《名詞》《謂語》
=> 小 《名詞》
《謂語》
=> 小孩子《謂語》
=> 小孩子《動詞》《賓語》
=> 小孩子吃《賓語》
=> 小孩子吃《形容詞》《名詞》
=> 小孩子吃大
《名詞》
=> 小孩子吃大西瓜 //至此,所得到的符號串都由終結符組成,即產生了語言的乙個字串
最左推導:在推導過程中,總是對字串中最左邊的非終結符進行替換
最右推導:在推導過程中,總是對字串中最右邊的非終結符進行替換
上面的例子就是最左推導,如果我們先對謂語進行替換。。。依次取最右邊的進行替換就成為了最右推導。
例:已知文法:g [ s ] :s —> dab
a —> aa | a
b —> b
求g [ s ] 產生的語言是什麼?
解:s => dab => dab
或 s
=> dab => daab => daab
或 s
=> dab => daab => daaab => daaab
...........
最後得到 danb (a的n 次方) 其中 n 為大於等於1 的整數
語法分析樹
的每個中間結點都標記著非終結符,每個葉子結點都標記著終結符。語法分析樹的每一棵子樹都描述了句子中乙個抽象的例項。
例如:a = b * (a + c )的語法分析樹為:
其實我們在上面進行的推導過程的每一步都可以用一棵分析樹來表示。例如對於上面的 s
=> dab => dab 用語法樹來表示:
在自然語言中,我們經常碰到二義性。在漢語中對於乙個句子斷句不同都會產生各種歧義,這也是漢語難以成為計算機程式語言的原因之一。下面給出二義性的形式化表示:
對文法g,如果至少存在乙個句子,對應兩棵(及以上)不同的分析樹,則稱該句子是二義性的。也可以這樣定義:若文法中存在某個句子,它有兩個不同的最左(右)推導,則這個文法是二義的。
例如:對於g [ s ] : s—> ab
a—> a
b—> b
其分析樹一樣,即不存在不同的分析樹,所以其不是二義性的。
Itween筆記 第三節
itween關於動畫執行的補充.itween.camerafadefrom itween.hash amount 1f,time 2f 在兩秒結束後.itween.camerafadefrom itween.hash amount 1f,time 2f,oncomplete itweentest o...
面向對像第三節
提高了 的復用性 讓類與類之間發生關係有了這個關係 才有後面的多型 繼承是物件導向的三大特性之一 可以層層繼承 issubclass 檢查乙個類是否是另乙個類的子類 object是所有類的父類 如果在子類中有和父類重名的方法.通過子類的例項去呼叫方法時,會先在子類裡面找,再到父類裡面找,若還是沒有找...
第三節Servlet總結
1.request head 中的referer 屬性 防止盜鏈 2.表單提交 關鍵字 action reg.do method post parameter html檔案中的 reg.do method post text name uid placeholder 請輸入使用者名稱 passwor...