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