2016-02-19 41 views
1

我正在寫一個LR(1)解析器,並且我一直在將我的測試語法建立在C語言之外。我看了看語法適用於C和Python:上下文無語法區分整數和浮點常量

https://www.lysator.liu.se/c/ANSI-C-grammar-y.html https://docs.python.org/3/reference/grammar.html

Ç似乎使用符號常量整數和浮點常量和Python使用數量。

我想知道的是爲什麼這些不會被分成單獨的符號,如INT和FLOAT,以便稍後可以將它們放入抽象語法樹中的單獨節點中?

由於我們已經知道詞法分析器解析後的數字是什麼類型,爲什麼要將它們合併爲一個通用的'NUMBER',然後嘗試找出它又是哪一個?

+1

它只是使語法更大,並沒有提供任何真正的好處。 –

+0

@ n.m。如何'int x = 2; double y = x/3.0;'處理?顯然,分母是整數還是浮點常量是有區別的。因此,有些事情需要跟蹤分母是浮點常量的事實。 – user3386109

+3

@ user3386109有些東西確實記錄了這一點。這個「某些東西」只是不是語法,因爲在語法中跟蹤這些是沒有意義的。 –

回答

0

能夠處理某些較早的特例並不能簡化事情,因爲您以後仍然需要在不同的地方使用相同的代碼。例如,請考慮代碼y + z。 Python不知道那是什麼,除了在運行時它將調用y.__add__(z)。生成的代碼不會消失。相同的代碼可以採取3 + x,並且很容易生成(3).__add__(z)。所以它在分析過程中並沒有真正簡化任何東西來區分y + z3 + z。 (如果y是浮點文字而不是標識符,則同樣的邏輯成立。)

現在考慮類似3.0 + 5的東西。在字節碼編譯之前,存在單獨的代碼來代替8.0而不是(3.0).__add__(5),因爲1)它很容易實現,2)它明顯優於在運行時調用函數。但是,這個仍然是不是由解析器完成的。這是通過優化器完成的,該優化器在樹上尋找諸如NUMBER + NUMBER之類的東西。一旦找到,優化器就可以確定NUMBER是整數還是浮點數,併產生適當的總和以包含在代碼中。這是比必須處理解析樹INT + FLOAT,FLOAT + INT,FLOAT + FLOATINT + INT的4個不同位的簡單