摘要:考慮一個非終結符,如果對于另一個符號,存在如下產生式。則對于而言,它可以表示非終結符重復多次的各種形式。以上三個式子展現了將任意非終結符關于重復次數的多種形式。
式子中的符號,我還允許使用數量詞來修飾。
考慮一個非終結符 A,如果對于另一個符號 α,存在如下產生式。
α → αA | ε
則對于 α 而言,它可以表示非終結符 A 重復 0 、1、多次的各種形式。
現在稍稍改變這個式子,使之變成:
α → αA | A
這時,α 不再可能產生空,此時它只能表示非終結符 A 重復 1次或多次。
當然還有這個式子。
α → A | ε
這個α 表示 A 出現 0 次 或 1 次。
以上三個式子展現了將任意非終結符 A 關于重復次數的多種形式。這些形式很有用,至少對于我寫 Parser 很有用。因此,可以使用數量詞符號來描述。
A* (重復 0、1 次或多次)
A+ (重復 1 次或多次)
A? (出現 0 次或 1 次)
至此,我們已經得到了寫一個 Parser 所需的所有理論工具了。但是,等等,其實我們還可以深入的探討一下某些特別的東西。
我在上一章提及,對于每一個非終結符而言,它是否能導出 ε 是必須被判斷清楚的。特別的,當然某個非終結符 A 可以導出 ε 時,我可以發現有如下等式。
A = A?
A+ = A*
嚴格意義上說,等號左右的式子還有是有區別的,他們雖然展開的最終結果完全相同,但展開的形式卻有所差別。但對于我而言,我只關心結果,我將它們視作相等一點都不影響我的 Parser 正常運行。
這兩個等式令我寫程序更加方便,試想我該在程序中如何表現 ε ?我只需寫一個 A? 就行了,因為 A? 一定可以導出 ε。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/65502.html
摘要:是的,這個系列將呈現一個完整的編譯器從無到有的過程。但在寫這個編譯器的過程中,我可不會偷工減料,該有的一定會寫上的。該語言的虛擬機將運行于之上,同時編譯器將使用實現。我早有寫編譯器的想法之前沒寫過,故希望一邊寫編譯器一邊完成這個系列。 是的,這個系列將呈現一個完整的編譯器從無到有的過程。當然,為了保證該系列內容的簡潔(也為了降低難度),僅僅保證編譯器的最低要求,即僅能用。但在寫這個編譯...
摘要:在之前的章節第章從零開始寫個編譯器吧開始寫詞法分析器中我有說,我將函數設計成主動調用的形式,而則是被動調用的形式。接下來本系列將進入編寫語法分析器的階段,不過在此之前,我將抽出一點時間介紹一下語言本身。 上周周末旅游去了,就沒更新了,雖然回到海拔0m的地區,不過目前似乎還在缺氧,所以本次就少更點吧。 這章將結束詞法分析的部分。 在之前的章節(第7章從零開始寫個編譯器吧 - 開始寫詞...
摘要:要為語言設計詞法分析器,首先得知道語言是一種什么樣的語言。,不過首先我們得把詞法分析器能生成的單詞類型定義好了。 要為 tao 語言設計詞法分析器,首先得知道 tao 語言是一種什么樣的語言。不過呢,我腦海里還沒有 tao 語言具體形象。我還是先貼一段 tao 語言的代碼,大概展示下這是怎么回事吧。 def say_hello_world(who) print hello ...
摘要:即創建一個文件,并寫下如下內容。然后以此緩存一個字符串,然后,通過調用來將這個字符串分割成一個一個運算符,并生成。語言中根據運算符長度分開儲存的。具體來說,如果運算符對應的字符串最短的是,最長的是。 上一章留下的那個大大的 TODO 表明,似乎還有什么東西沒寫完。沒錯,所以這一章我們來寫 Sign 狀態下的代碼。 所謂 Sign 狀態,即是用來處理和生成 Sign 類型的 Token...
摘要:而,稱之為非終結符。而這個展開方案中對各個非終結符產生式的選擇過程,即是對源代碼中每一個部分的定性過程。這個過程讓能夠理解源代碼各個部分表示的含義,并以此生成對應的語法樹。 我需要定義出 tao 語言的細節,在此,需要引出文法這一概念。所謂文法,即是用于描述語言的一種工具。 例如,一個賦值語句可能寫成如下形式: variable = 1 + 3 如何充分定義這個賦值語句的形...
閱讀 2234·2021-11-17 09:33
閱讀 2774·2021-11-12 10:36
閱讀 3395·2021-09-27 13:47
閱讀 884·2021-09-22 15:10
閱讀 3485·2021-09-09 11:51
閱讀 1392·2021-08-25 09:38
閱讀 2757·2019-08-30 15:55
閱讀 2608·2019-08-30 15:53