別人都說編譯原理難學,經過今天的學習,的確是感覺這門課的確是有點難學,困難的地方無疑是在於原理性的東西全是用數學知識去描述,還好大學的東西還記憶一點,對於今天學的東西雖然讀了幾次才對原理有了一些了解。
今天看的是編譯原理第二課:詞法分析,可以理解為對源程式的掃瞄,起主要目的就是將源程式讀作字元檔案並將其分為若干個記號,就和現實中的自然語言一樣,首先將英語文章的所有字母讀成乙個乙個單詞,每個單詞都有標號或空格分開,然後在對每個單詞的意思認識的基礎上對句子的語法上分析。掃瞄程式在掃瞄過程中的格式說明和識別方法主要是正則表示法與有窮自動機。下來詳細說明:
1、基本正則表示法,對於基本正則表示法的定義書上是這麼給的:
a、基本正則表示法由乙個單字元a,以及元字元e,或空字元,對於每種形式都有l(a)=
b、r|s格式表示式:其中r、s均是正規表示式。這種情況下:l(r|s )=l(r) l(s)
c、rs格式表示式:其中r、s均是正規表示式。這種情況下:l(rs )=l(r)l(s)
d、r*格式表示式:其中r為正規表示式。則l(r*)=l(r)*
e、括號只是調整優先順序的不影響語言。
通過書上給的定義並不能對正則表示法有乙個概括的定義,只能從邏輯上去理解,不過可以對比以前web開發的情況,正則表示法無非是描述字串集的字串,如以a開頭的並以a結尾的字串可以用正則表示為[a,*a],在掃瞄程式工作階段,可以使用正則表示法來識別識別符號、關鍵字、算術表示式等等。
2、有窮自動機,是描述特定型別演算法的數學方法。定義:
dfa定義:-乙個確定的有窮自動機(dfa)m是乙個五元組:m=(k,σ,f,s,z)其中
① k是乙個有窮集,它的每個元素稱為乙個狀態;
② σ是乙個有窮字母表,它的每個元素稱為乙個輸入符號,所以也稱σ為輸入符號字母表;
③ f是轉換函式,是k×σ→k上的對映,即,如 f(ki,a)=kj,(ki∈k,kj∈k)就意味著,當前狀態為ki,輸入符為a時,將轉換為下乙個狀態kj,我們把kj稱作ki的乙個後繼狀態;
④ s ∈ k是唯一的乙個初態;
⑤ zk是乙個終態集,終態也稱可接受狀態或結束狀態。
乙個dfa可以表示成乙個狀態圖(或稱狀態轉換圖)。假定dfa m含有m個狀態,n個輸入字元,那麼這個狀態圖含有m個結點,每個結點最多有n個弧射出,整個圖含有唯一乙個初態結點和若干個終態結點,初態結點冠以雙箭頭"=>"或標以"-",終態結點用雙圈表示或標以"+",若 f(ki,a)=kj,則從狀態結點ki到狀態結點kj畫標記為a的弧;
dfa 的狀態圖表示
(nfa)不確定的有窮自動機定義與確定的有窮自動機大致相同,僅僅是在 σ集合中增加了元字元集合,也就是說擴充套件了轉換函式,這樣每個字元都會多了幾個狀態,也就是說在串中真正被接受的是除了元字元集合e之外的所有。說明dfa 是nfa的特例。
由於對離散數學已經忘記的差不多了。對於自動機理論已經忘記的乾乾淨淨的了。所以目前只能根據書上說的定義去理解,自己的腦子裡還沒有形成自己的認識體系。所以對如何把正規表示式轉化為dfa就沒有詳細看了。因為看的腦子都是亂的。不過現在至少多正規表示式和有窮自動機有大體上的認識了。剛才下了一本離散數學的書。打算每天看一課編譯,然後再看離散爭取把編譯原理第一遍看完的同時能夠把離散數學也複習完,至少在對編譯原理進行第二遍學習的時候能夠看懂、看明白。
2023年1月20日 難忘寒潮
首先先請各位oier原諒我在這寫一些無關緊要的文章 但我實在是太激動了 安徽合肥的教育部終於有良心了 由於今年的寒潮和大雪,今天全市提前放假,期末考試延遲到下學期 這幸福來得太突然了 在一周沒有碰電腦後,我終於可以碼 了 難得摸電腦,一抒胸懷。啊啊啊啊啊啊啊啊啊啊啊啊啊啊!我竟不知道該說些什麼,可我...
2023年11月6日總結
昨天晚上外網執行了上線通知有問題,又出現了上次的問題,執行一段時間之後程式慢慢退出。查了好久,終於找到原因,特此寫下,作為乙個總結。編譯錯誤已經排除,g wall能排除大部分的錯誤 按照一般的思路,1.程式出錯退出,都會產生core檔案,分析core檔案就能查詢到 出錯了,但是由於我的程式是繼承公司...
2023年 7月9日 陰
今天是暑假中工作日的第一天,由於期末考試而暫停的專案又將重新開動。現在將此前達到的成果報告一下 1 基本 gui已經實現 2 可從外部匯入 obj模型 3 已建立便於管理的各種資料結構 主要是用 stl實現 軟體介面如下圖 接下來要做的就是這個專案中最難的一部分了,那就是物理效果的實現,準備使用 o...