Redy語法分析 文字常量結點

2021-07-25 03:25:56 字數 1939 閱讀 7881

文字常量結點

(literal constant) (

一)文字常量結點

在一門語言裡面文字常量是基礎,redy裡面文字常量有整數,長整數,浮點數,字串,布林值。文字常量可以在源程式中顯於的使用,例如表達示1+2.3中有兩個文字常量,1是整數型的文字常量,2.3是浮點型的文字常量。當解析器解析源**,為之構造語法樹時,需要用乙個結點來表示文字常量,該結點稱為文字常量結點,文字常量結點是葉結點,它不會再有其它子結點。

在redy原始碼中,用astnodeliteral來表示文字常量結點,astnodeliteral繼承astobject。因為每乙個文字常量結點都對應源**中的乙個文字常量,文字常量有5種:整數,長整數,浮點數,字串,布林值,這5種屬於redy中的基本資料型別,它們都繼承rojbect。具體的關係,如下圖

圖1在圖中有乙個頭為三角形箭頭線段表示astnodeliteral繼承astobject。有一頭為稜形的線段表示聚合,聚合是代表整體與部分的關係,表示astnodeliteral由robject組成。

構造表示式1+2.3的語法樹,如下:

圖2圖2中有兩個文字常量結點,結點l1對應於表示式中的整數1,結點l2對應於表示式中浮點數2.3。

(二)簡單的虛擬機器

在前面語法樹的資料結構中講過,所有astobject的子類都必須實現結點的執行方式,為了講述astnodeliteral的執行方法,在這裡需要引入乙個簡單的虛擬機器,該虛擬機器只乙個暫存器reg0,沒了,該虛擬機器就這麼簡單。

astnodelieral的執行方法很簡單,就是把它所引用的文字常量的值放入暫存器reg0中,用**來描述為:

**1.1

astnodeliteral.

execute()

reg0=astnodeliteral.l_value

end

如果要讓圖2中的語法樹跑起來的話,還需要實現乙個結點astnodeplus的執行方式,**描述為:

**1.2

astnodeplus.

execute()

astnodeplus.left.

execute()

/*執行左邊結點*/

left_value=reg0 /*左邊結點執行後的結果儲存在暫存器reg0,所以取出即可*/

astnodeplus.right.

execute()

/*執行右邊結點*/

right_value=reg0 /*從暫存器reg0取出右邊結點執行後的節果*/

/*把左邊結點的值懷右邊結點的值相點後,放入暫存器reg0中*/

reg0=left_value+right_value 

end

現在執行圖中2的語法樹沒一點問題,假設你想把1+2.3的執行結果輸出,用**描述為:

**1.3

..

...tree_root=

parser

("1+2.3");

/*構造語法樹*/

tree_root.

execute()

/*執行語法樹*/

result

=reg0 /*從暫存器reg0中取出結果*/

print

result

/*輸出結果*/..

...

返回文件首頁 

astnodeliteral的**位於 sur/syntax/ast_node_literal.h 中

語法分析 自上而下分析

語法分析 是編譯過程的核心部分。它的任務是在詞法分析識別出單詞符號串的基礎上,分析並判定程式的語法結構是否符合語法規則。語言的語法結構是用上下文無關文法描述的。因此,語法分析器的工作本質上就是按文法的產生式,識別輸入符號串是否為乙個句子。這裡所說的輸入串是指由單詞符號 文法的終結符 組成的有限序列。...

LTP語法分析

詞性標註 part of speech tagging,pos 是給句子中每個詞乙個詞性類別的任務。這裡的詞性類別可能是名詞 動詞 形容詞或其他。採用863詞性標註集 tag description example a adjective 美麗 b other noun modifier 大型,西式...

語法分析總

表示出現一次或0次,表示出現0次或多次,表示是乙個整體 程式aint x 1,y 3 int fun int a return 2 a int main int a 3 printf d n fun a 程式a 就是個翻譯單元 乙個完整的c檔案是乙個翻譯單元 翻譯單元由若干個外部宣告和乙個檔案結束符...