編譯原理第二章學習總結
編譯原理第二章學習總結
編譯原理是一門獨立於其他學科之外的理論性科目,第二章的知識內容首先交代語言程式是一定字符集上的一字串。如今多數的程式語言可以通過上下文無關文法來作為有效工具描述程式語言的語法規則。
一.知識梳理
/首先是程式語言的定義:任何語言實現的基礎是語言的定義。程式語言主要由語法和語義兩方面定義。語法分為詞法規則和語法規則,而語義是指一門語言除去詞法語義規則外還要定義它的單詞符號和語法單位的意義。
/其次是高階語言的分類,高階語言分為四種:
①強制性語言:也稱過程式語言 特點是命令驅動,面向語句
②應用式語言:更注重程式所表示的功能
③基於規則的語言
④面嚮物件語言:主要特徵是支援封裝性、繼承性和多型性
/程式結構:FORTRAN Pascal Ada Java
/資料型別與操作:
資料型別通常包括三要素:①用於區別這種型別的資料物件的屬性 ②此型別資料物件可以具有的值 ③可作用於這種型別的資料物件的操作
分類為 ——初等資料型別 常見的初等資料型別:數值資料、邏輯資料、字元資料、指標型別
——資料結構 常見的定義方式:陣列、記錄、字串、表格、棧和佇列
——抽象資料型別 包括:資料物件的一個集合、作用於這些資料物件的抽象運算的集合、這種型別物件的封裝
/語句與控制結構
控制結構定義了語句在其中的執行次序,語言所提供的控制結構的集合對可讀和可維護的軟體編寫有很大的影響。
①表示式:一個表示式由運算量和算符組成
②語句:不同程式語言含不同形式和功能的各種語句
/程式語言的語法描述
①上下文無關文法:文法是描述語言的語法結構的形式規則。這些規則必須是準確的、易於理解的、有相當強的描述能力足以描述各種不同的結構。上下文無關文法所定義的語法範疇是完全獨立於這種範疇可能出現的環境的,包括四個組成部分:一組終結符號,一組非終結符號,一個開始符號以及一組產生式。
/語法分析樹 可以用一張圖來表示一個句型的推導
語法樹的根結由開始符號所標記。隨著推導的展開,當某個非終結符被他的某個候選式所替換時,這個非終結符的相應結就產生出下一代新結,候選式中自左至右的每個符號對應一個新結,並用這些符號標記其相應的新結。
*在一棵語法樹生長過程中的任何時刻,所有那些沒有後代的端末結自左至右排列起來就是一個句型。
/二義性
如果一個文法存在某個句子對應兩棵不同的語法樹,則稱這個文法是二義的。也就是說若一個文發中存在某個句子有兩個不同的最左(最右)推導,則這個文法是二義的。
二.課後練習與知識運用
★第四題中按第一小問的題目要求來看,在按優先順序為+ * ↑同時優先採用左結合的要求來做,便解為1+1*2↑2*1↑2 = 2*2↑2*1 ↑2 = 4↑4↑2 = 16↑2 = 256 ②問中採用優先順序為↑+ * 的順序同時採用右結合,則解為 原式=1+1*2↑2*1 = 1+1*4*1 = 2*4*1 = 2*4 = 8
★第六題中由題意得文法G6可表示出所有自然數 ②中0127 34 568的最左推導依次為
N→ND→NDD→NDDD→DDDD→0DDD→01DD→012D→0127
N→ND→DD→3D→34
N→ND→NDD→DDD→5DD→56D→568
最右推導依次為
N→ND→N7→ND7→N27→ND27→N127→D127→0127
N→ND→N4→D4→34
N→ND→N8→ND8→N68→D68→568
★第七題中 由題目可產生思路為從各奇數的位數入手進行推導,則首先設立所有奇數共有的尾數J
J→1|3|5|7|9 O→2|4|6|8 A→J|O B→BA|J C→J|BJ
★第八題中主要注意最左推導與最右推導的區別
i+i*i的最左推導由 E→E+T→T+T→F+T→i+T→i+T*F→i+F*F→i+i*F
i+i*i的最右推導由 E→E+T→E+T*F→E+T*i→E+F*i→E+i*i→T+i*i→F+i*i→i+i*i
★第九題中的文法二義需要從尋找具有不同最左或最右推導句子的思路來解答
★第十題中主要涉及非終結符的替換
三.學習感悟
在學習完編譯原理第二章的內容後,瞭解到第二章的大題內容是對知識要點的解釋以及不同概念的介紹與分類,理論性的知識內容還是較多的,很多內容都很抽象,以至於有的知識還有些難以熟練的理解運用;同時也覺得老師要求我們通過部落格來記錄學習內容的方式也是不錯的,能夠有效督促我們複習知識,強化對知識點的記憶,並通過習題的練習來得到知識點的實踐與鞏固。由於步入大三下學期後,每個人要學習的其他東西開始佔用大部分時間,無論是考公、考研、還是就業,都容易讓我們在忙於這些個人事務上而忽略了對學校所開設課程的學習。所以當在為自己夢想努力的同時,也不能忘記要走好腳下的每一步,提高課堂效率,改進學習方法,由於我對於很多知識的掌握還不夠牢固,所以需要更多的複習加練習。
相關文章
- 《編譯原理》學習心得編譯原理
- 學習編譯原理的步驟編譯原理
- 編譯ROCKSDB總結編譯
- 編譯、連結學習筆記(一)簡述編譯連結過程編譯筆記
- JS學習系列 01 - 編譯原理和作用域JS編譯原理
- 編譯原理作業小結編譯原理
- 0909 關於編譯原理學習的想法編譯原理
- Rust 交叉編譯與條件編譯總結Rust編譯
- 編譯器後端總結編譯後端
- 《計算機組成原理/CSAPP》網課總結(二)——編譯原理基礎計算機APP編譯原理
- 學習心得 TCP/IP攻擊原理分析總結TCP
- 0909初學編譯原理編譯原理
- 編譯原理編譯原理
- 程式的編譯和連結原理分析編譯
- android反編譯工具總結Android編譯
- 學習總結
- 【編譯openjdk學習筆記】編譯JDK筆記
- 學習Ant編譯指令碼編譯指令碼
- Flutter 編譯原理Flutter編譯原理
- 編譯原理概述編譯原理
- 整合學習原理小結
- Android原始碼編譯整理總結Android原始碼編譯
- idea編譯golang外掛總結Idea編譯Golang
- centos5.1編譯2.6.24.5核心總結CentOS編譯
- dumping_oracle_blocks翻譯(一)個人翻譯,學習總結用OracleBloC
- mysqlimport學習總結MySqlImport
- Maven學習總結Maven
- MyBatis 學習總結MyBatis
- awk 學習總結
- JNI 學習總結
- tkinter學習總結
- SVG學習總結SVG
- vue學習總結Vue
- WorkFlow學習總結
- HTML學習總結HTML
- Mybatis學習總結MyBatis
- Kafka 總結學習Kafka
- Typescript學習總結TypeScript