手工打造編譯器之詞法分析器3

2021-09-30 08:05:31 字數 1659 閱讀 2211

逆波蘭表示式,可以去除括號(),建立適合計算機處理的表示式,該表示式有正確的運算優先順序。

正常的表示式

逆波蘭表示式

a+b ---> a,b,+

a+(b-c) ---> a,b,c,-,+

a+(b-c)*d ---> a,b,c,-,d,*,+

a+d*(b-c)--->a,d,b,c,-,*,+

a=1+3 ---> a=1,3 +

運算的時候,遇到可以歸併的就歸併計算。如

5+(4-3)*2

5,4,3,-,2,*,+

,4,3,-

可以歸併,變為

5 1 2 * +

,1 2 *

可以歸併,變為

5 2 +5 2 +

可以歸併,變為7,

是最終結果

1.6.1.1

正規表示式各符號的優先順序

alternation 0

concatenation 1

單目運算子有最高的優先順序,且它們優先順序相同 ?

* +2

1.6.1.2

生成逆波蘭表示式的演算法

(1)首先構造乙個運算子棧,此運算子在棧內遵循越往棧頂優先順序越高的原則。

(2)從左至右掃瞄該算術表示式,從第乙個字元開始判斷,如果是字符集,則將該字符集直接輸出。

(3)如果不是數字,該字元則是運算子,此時需比較優先關係。

做法如下:將該字元與運算子棧頂的運算子的優先關係相比較。如果,該字元優先關係高於此運算子棧頂的運算子,則將該運算子入棧。倘若不是的話,則將棧頂的運算子從棧中彈出,直到棧頂運算子的優先順序低於當前運算子,將該字元入棧。

特殊處理:左括號(直接入棧;

如果是右括號),出棧知道遇到左括號(,並將(出棧。

(4)重複上述操作(3)-(4)直至掃瞄完整個簡單算術表示式,確定所有字元都得到正確處理,我們便可以將中綴式表示的簡單算術表示式轉化為逆波蘭表示的簡單算術表示式。

1.6.1.3

組裝有限自動機

如上圖藍色表示初始狀態所在的表示式,紅色表示終態所在的表示式。m,n,p,q表示正規表示式。

(a),乙個字符集;

(b),乙個表示式是mn,另乙個是pq,mn和pq的可選(alternation)的運算;

(c),n?,零個或乙個

(d), 乙個表示式是mn,另乙個是pq,mn和pq的聯合(concatenation)的運算;

(e),n*,零個或多個

(f),n+,乙個或多個

[_a-za-z][_a-za-z0-9]*

[0-9]*

([0-9]+/.[0-9]*)|

([0-9]*/.[0-9]+)

_ddyes no

no_ijuy*jj no

no no

_yes no

no0asss no

no no

a0234jl____

yes no

no067 no

yes no

890 no

yes no

0.1 no

noyes

00.5 no

noyes

55. no

noyes .1

no no

yes .

no no

no

編譯器之詞法分析

最近我們在做乙個有關snl語言的編譯器,下面寫了一下大概流程 詞法分析器是編譯過程的第一階段,功能是 1.對以字串形式輸入的源程式 這裡是把源程式從檔案讀出,也可以在控制台輸入 按順序進行掃瞄,根據snl語言的詞法規則識別具有獨立意義的單詞 符號 序列,如保留字 由語言系統自身定義的,通常是由字母組...

編譯原理之詞法分析器(C C)

從乙個檔案中讀取原始碼,執行後可以直接看到結果,也可在指定檔案中檢視結果。這個詞法分析器只實現了部分關鍵字 字元等的識別,可在key陣列自行新增,種別碼的判別與新增用case更加方便,可寫下試試。include include include include include using namesp...

手工打造編譯器之語法分析器1

語法分析 分析程式的短語結構 文法描述一種語言。文法是如下產生式 production 的集合 symbol symbol,symbol 出現在左部的符號是非終結符 nonterminate 出現在右部的排除掉非終結符就是終結符 terminate 計算first,follow,nullable集合...