簡體   English   中英

上下文無關文法微分整數和浮點常數

[英]Context Free Grammar Differentiate Integer and Floating Point Constants

我正在編寫LR(1)解析器,並且我的測試語法基於C語言。 我看過C和Python的語法:

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

C似乎對整數和浮點常量使用符號CONSTANT,而Python使用NUMBER。

我想知道的是為什么為什么不將它們分隔為單獨的符號(例如INT和FLOAT),以便以后可以將它們放入“抽象語法樹”中的單獨節點中?

既然在詞法分析器解析之后我們已經知道它是什么類型的數字,那么為什么將它們合並為通用的“ NUMBER”,然后再嘗試找出它又是哪個數字呢?

能夠較早處理某些特殊情況並不能簡化事情,因為稍后您仍然需要在不同地方使用相同的代碼。 例如,考慮代碼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,並產生適當的總和以包含在代碼中。 這比必須處理解析樹INT + FLOATFLOAT + INTFLOAT + FLOATINT + INT 4個不同位要簡單

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM