文字常量結點
(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.如果要讓圖2中的語法樹跑起來的話,還需要實現乙個結點astnodeplus的執行方式,**描述為:execute()
reg0=astnodeliteral.l_value
end
**1.2
astnodeplus.現在執行圖中2的語法樹沒一點問題,假設你想把1+2.3的執行結果輸出,用**描述為:execute()
astnodeplus.left.
execute()
/*執行左邊結點*/
left_value=reg0 /*左邊結點執行後的結果儲存在暫存器reg0,所以取出即可*/
astnodeplus.right.
execute()
/*執行右邊結點*/
right_value=reg0 /*從暫存器reg0取出右邊結點執行後的節果*/
/*把左邊結點的值懷右邊結點的值相點後,放入暫存器reg0中*/
reg0=left_value+right_value
end
**1.3
.....tree_root=
parser
("1+2.3");
/*構造語法樹*/
tree_root.
execute()
/*執行語法樹*/
result
=reg0 /*從暫存器reg0中取出結果*/
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檔案是乙個翻譯單元 翻譯單元由若干個外部宣告和乙個檔案結束符...