編譯原理文法擴展
① 編譯原理為什麼存在遞歸文法
編譯原理中存在遞歸文法是因為編程語言的語法和結構往往具有遞歸性質。遞歸文法是一種用來描述編程語言語法的形式化表示方法,其中規則可以包含對同一語法結構的遞歸引用。這種遞歸性質反映了編程語言中常見的嵌套和遞歸結構。
以下是一些原因,說明為什麼編譯原理中存在遞歸文法:
1. 語法結構的嵌套:編程語言中的語法結構通常可以嵌套在其他語法結構中,例如,一個函數可以包含其他函數,一個條件語句可以包含另一個條件語句,等等。遞歸文法可以很自然地表示這種嵌套結構。
2. 語法的可擴展性:編程語言通常需要具有可擴展性,允許程序員定義新的語法結構或數據類型。遞歸文法可以輕松地擴展以包括新的語法規則。
3. 函數調用和表達式求值:編程語言中的函數調用和表達式求值通常是遞歸的過程。遞歸文法可以用於清晰地描述這些遞歸計算過程。
4. 簡潔性和可讀性:遞歸文法可以幫助編譯器設計者更簡潔地表示語言的語法,這有助於提高編譯器的可讀性和維護性。
5. 符合語言設計的自然表示:遞歸文法使得語法規則的表示更符合編程語言設計的自然結構,因為它們允許對語法結構進行遞歸定義,而不需要多次重復相似的規則。
雖然遞歸文法在編譯原理中非常有用,但它們也需要謹慎使用,以避免無限遞歸或歧義性。編譯器設計者需要確保遞歸文法能夠被正確解析和處理,通常需要使用遞歸下降解析器或其他技術來處理遞歸文法。
② 編譯原理
編譯原理):利用編譯程序從源語言編寫的源程序產生目標程序的過程; 用編譯程序產生目標程序的動作。 編譯就是把高級語言變成計算機可以識別的2進制語言,計算機只認識1和0,編譯程序把人們熟悉的語言換成2進制的。
編譯程序把一個源程序翻譯成目標程序的工作過程分為五個階段:詞法分析;語法分析;語義檢查和中間代碼生成
(2)編譯原理文法擴展擴展閱讀:
編譯程序的語法分析器以單詞符號作為輸入,分析單詞符號串是否形成符合語法規則的語法單位,如表達式、賦值、循環等,最後看是否構成一個符合要求的程序,按該語言使用的語法規則分析檢查每條語句是否有正確的邏輯結構,程序是最終的一個語法單位。
編譯程序的語法規則可用上下文無關文法來刻畫。語法分析的方法分為兩種:自上而下分析法和自下而上分析法。自上而下就是從文法的開始符號出發,向下推導,推出句子。
而自下而上分析法採用的是移進歸約法,基本思想是:用一個寄存符號的先進後出棧,把輸入符號一個一個地移進棧里,當棧頂形成某個產生式的一個候選式時,即把棧頂的這一部分歸約成該產生式的左鄰符號。
③ 編譯原理中的語法和文法一樣嗎
編譯原理中的語法和文法是不一樣的,但卻融會貫通。
在計算機科學中,文法是編譯原理的基礎,是描述一門程序設計語言和實現其編譯器的方法。
文法分成四種類型,即0型、1型、2型和3型。這幾類文法的差別在於對產生式施加不同的限制。
形式語言,這種理論對計算機科學有著深刻的影響,特別是對程序設計語言的設計、編譯方法和計算復雜性等方面更有重大的作用。
多數程序設計語言的單詞的語法都能用正規文法或3型文法(3型文法G=(VN,VT,P,S)的P中的規則有兩種形式:一種是前面定義的形式,即:A→aB或A→a其中A,B∈VN ,a∈VT*,另一種形式是:A→Ba或A→a,前者稱為右線性文法,後者稱為左線性文法。正規文法所描述的是VT*上的正規集)來描述。
四個文法類的定義是逐漸增加限制的,因此每一種正規文法都是上下文無關的,每一種上下文無關文法都是上下文有關的,而每一種上下文有關文法都是0型文法。稱0型文法產生的語言為0型語言。上下文有關文法、上下文無關文法和正規文法產生的語言分別稱為上下文有關語言、上下文無關語言和正規語言。
④ 在編譯原理中: 文法S——>SS+|SS*|a能產生什麼語言,並驗證! 求高人指導!
為了使問題簡化,我們考慮文法S->ss+|a,考慮s->ss*時,只要把+換成*即可。
0層遞歸是,s->a,文法的語言是{a}。是後綴表達式。
1層以內遞歸時,文法語言是{a,aa+}。是後綴表達式。
2層以內遞歸時,文法語言是{a,aa+}.{a,aa+}.{+}。其中.表示連接,是後綴表達式。
依此類推,多少層的遞歸都是後綴表達式。
把表達式的+換成*後依然為後綴表達式。
下面證明文法產生的語言是所有的以a為變數,以+和*為運算符的後綴表達式。
因為每個表達式都對應一個常規的表達式(如1*2+3就是常規表達式),下面只需證明語言能產生的後綴表達式對應所有的常規表達式。當常規表達式只有一個運算符,對應aa+或aa*。當常規表達式有兩個運算符,可寫成(表達式1).{+|*}.(表達式2),因為表達式1和2都只含一個運算符,所以可以用語言表示,上述常規表達式可用後綴表達式(表達式1).(表達式2).{+l*}表示。所以不管常規表達式有多少個運算符,都可以由語言的後綴表達式對應。
⑤ 語法分析中怎麼消除左遞歸、怎麼確保正確的優先順序和結合性「編譯原理」
在探討如何消除左遞歸、確保正確的優先順序和結合性時,我們首先回顧一下左遞歸、優先順序和結合性的基本概念。左遞歸是指在二元表達式語法規則中,如果產生式的第一個元素是它自身,程序會無限遞歸,如「加法表達式 + 乘法表達式」。優先順序和結合性是計算機語言中與表達式相關的核心概念,涉及語法規則的設計。通常,我們使用上下文無關文法和巴科斯範式(BNF)來書寫語法規則。
為了確保正確的優先順序,我們通常設計語法規則時,將具有較高優先順序的操作放在較低優先順序操作的下層。例如,乘法運算在加法運算之前。在表達式語法中,我們按照優先順序從低到高排列:賦值運算、邏輯運算、比較運算、加減運算、乘除運算和基礎表達式。
結合性問題涉及到運算符的計算順序,通常,算術運算符是左結合的,即從左到右計算。例如,表達式「2+3+4」應該先計算「3+4」,然後與「2」相加。為了確保正確的結合性,我們可以通過調整語法規則,例如將遞歸項放在運算符的左側,來解決左遞歸問題。
消除左遞歸的方法通常是將左遞歸文法轉換為非左遞歸形式。例如,將「add -> add + mul」轉換為「add -> a | add + mul」。這樣,對於「2+3+4」這樣的表達式,我們可以正確生成AST,並確保結合性。
在實際應用中,我們還需要考慮表達式語法的擴展,例如使用擴展巴科斯範式(EBNF)來表示規則,其中可以使用正則表達式的一些寫法,如使用「*」表示可重復0到多次的子表達式。
通過閱讀語言的語法規則文件,我們可以了解各種運算符的優先順序和結合性,這對於理解語言的內部機制非常有用。此外,使用現代編譯工具如ANTLR或Yacc時,這些規則通常以BNF或EBNF的形式表示,可以幫助我們構建語法分析器。
消除左遞歸和確保正確的優先順序與結合性的關鍵在於設計合理的語法規則,確保在解析表達式時能夠生成正確的AST,並且遵循正確的運算順序。這通常涉及到調整語法規則、使用適當的遞歸結構以及理解運算符的優先順序和結合性。
⑥ 【編譯原理】第二章:語言和文法
上述文法 表示,該文法由終結符集合 ,非終結符集合 ,產生式集合 ,以及開始符號 構成。
而產生式 表示,一個表達式(Expression) ,可以由一個標識符(Identifier) 、或者兩個表達式由加號 或乘號 連接、或者另一個表達式用括弧包裹( )構成。
約定 :在不引起歧義的情況下,可以只寫產生式。如以上文法可以簡寫為:
產生式
可以簡寫為:
如上例中,
可以簡寫為:
給定文法 ,如果有 ,那麼可以將符號串 重寫 為 ,記作 ,這個過程稱為 推導 。
如上例中, 可以推導出 或 或 等等。
如果 ,
可以記作 ,則稱為 經過n步推導出 ,記作 。
推導的反過程稱為 歸約 。
如果 ,則稱 是 的一個 句型(sentential form )。
由文法 的開始符號 推導出的所有句子構成的集合稱為 文法G生成的語言 ,記作 。
即:
例
文法
表示什麼呢?
代表小寫字母;
代表數字;
表示若干個字母和數字構成的字元串;
說明 是一個字母、或者是字母開頭的字元串。
那麼這個文法表示的即是,以字母開頭的、非空的字元串,即標識符的構成方式。
並、連接、冪、克林閉包、正閉包。
如上例表示為:
中必須包含一個 非終結符 。
產生式一般形式:
即上式中只有當上下文滿足 與 時,才能進行從 到 的推導。
上下文有關文法不包含空產生式( )。
產生式的一般形式:
即產生式左邊都是非終結符。
右線性文法 :
左線性文法 :
以上都成為正則文法。
即產生式的右側只能有一個終結符,且所有終結符只能在同一側。
例:(右線性文法)
以上文法滿足右線性文法。
以上文法生成一個以字母開頭的字母數字串(標識符)。
以上文法等價於 上下文無關文法 :
正則文法能描述程序設計語言中的多數單詞。
正則文法能描述程序設計語言中的多數單詞,但不能表示句子構造,所以用到最多的是CFG。
根節點 表示文法開始符號S;
內部節點 表示對產生式 的應用;該節點的標號是產生式左部,子節點從左到右表示了產生式的右部;
葉節點 (又稱邊緣)既可以是非終結符也可以是終結符。
給定一個句型,其分析樹的每一棵子樹的邊緣稱為該句型的一個 短語 。
如果子樹高度為2,那麼這棵子樹的邊緣稱為該句型的一個 直接短語 。
直接短語一定是某產生式的右部,但反之不一定。
如果一個文法可以為某個句子生成 多棵分析樹 ,則稱這個文法是 二義性的 。
二義性原因:多個if只有一個else;
消岐規則:每個else只與最近的if匹配。
⑦ 編譯原理的題目:對於文法G(E):E→T|E+T|E-T T→F|T*F|T/F F→(E)|i
終極符集合Vt={+,-,*,/,(,),i}
非終極符集合Vi={E,T,F}
最右推導:E => E-T => E-F => E-(E) => E-(T) => E-(T+F) => E-(T+i) => E-(T*F+i)
直接短語:T*F,i