1.梳理第二章的內容,寫一篇理解與總結。正則表達式
編譯器:最基本的數學模型是有窮狀態機FSM和正則表達式。它們用來描述詞法單位(關鍵字,標識符)以及被編譯器用來識別這些單位的算法。此外,上下文無關文法用於描述程序設計語言的語法結構。算法
標識符:是一個字符串。全部的標識符都是名字,但有些名字也能夠是表達式,變量指向存儲中的某個特定位置。
一個函數一般有一個返回值,而一個過程不返回任何值。方法在OO語言中和特定類相關聯。函數
聲明:告訴咱們事務的類型,而定義告訴咱們它們的值。
語法:描述該語言的正確形式。語義定義程序的含義。設計
詞法:單元由各名字和屬性值組成,這些詞法單元也稱爲終結符號。事務
一個文法描述了程序的層次結構。文法的定義使用了稱爲終結符號的基本符號和稱爲非終結符號的變量符號。這些符號表明瞭語言的構造。文法分紅4種類型,即0型、1型、2型、3型。區別在於產生式施加的限制不一樣;以上下文無關文法文法爲例:設G(Vn,Vt,P,S),若P中的每一個產生式的形式都是A->aB或A->a,其中A和B都是非終結符,a€Vt,則G是3型文法或正規文法,每一種正規文法都是上下文無關的。字符串
語法樹,通常一個文法只存在一種語法樹,即最左推導和最右邊推導的語法樹是同樣的,不存在二義性。編譯器
詞法分析器:從輸入中逐個讀取字符,並輸出一個詞法單元的流。數學
語法分析:從一個文法開始符號推導出一個給定的終結符號串。推導的方法是反覆將某個非終結符替換爲它的某個產生式的體。
語法分析的結構是中間代碼,具體有抽象語法樹AST和三地址代碼TAC。it
詞法分析器掃描源程序並輸出一個由詞法單元組成的序列。
編譯
2. 嘗試寫出PL/0 語言的文法。(或者你認爲比較好的語言規則)
Pl/0語言文法的BNF表示:
〈程序〉→〈分程序〉.
〈分程序〉→ [<常量說明部分>][<變量說明部分>][<過程說明部分>]〈語句〉
<常量說明部分> → CONST<常量定義>{ ,<常量定義>};
<常量定義> → <標識符>=<無符號整數>
<無符號整數> → <數字>{<數字>}
<變量說明部分> → VAR<標識符>{ ,<標識符>};
<標識符> → <字母>{<字母>|<數字>}
<過程說明部分> → <過程首部><分程序>;{<過程說明部分>}
<過程首部> → procedure<標識符>;
<語句> → <賦值語句>|<條件語句>|<當型循環語句>|<過程調用語句>|<讀語句>|<寫語句>|<複合語句>|<空>
<賦值語句> → <標識符>:=<表達式>
<複合語句> → begin<語句>{;<語句>}end
<條件> → <表達式><關係運算符><表達式>|odd<表達式>
<表達式> → [+|-]<項>{<加減運算符><項>}
<項> → <因子>{<乘除運算符><因子>}
<因子> → <標識符>|<無符號整數>|(<表達式>)
<加減運符> → +|-
<乘除運算符> → *|/
<關係運算符> → =|#|<|<=|>|>=
<字母> → a|b|c…x|y|z
<數字> → 0|1|2…7|8|9
<條件語句> → if<條件>then<語句>
<過程調用語句> → call<標識符>
<當型循環語句> → while<條件>do<語句>
<讀語句> → read(<標識符>{,<標識符>})
<寫語句> → write(<表達式>{,<表達式>})