2012-02-07 82 views

回答

18

這是標記生成器的效果:1.__add__(1)被分成令牌"1.""__add__""(""1",並且")",因爲分詞總是試圖建立儘可能長的令牌。第一個標記是一個浮點數,後面跟着一個標識符,這對解析器來說是沒有意義的,所以它會拋出一個SyntaxError

簡單地增加點前的空間就會使這項工作:

>>> 1 .__add__(1) 
2 
2

解析器希望找到一個浮動,但_不是一個有效的數字。 Parens告訴解析器在1之後停止解析。

+3

'1 ..__ add __(1)'也可以。 – 2012-02-07 13:50:50

+6

Nope,'1 ..__ add __(1)'返回一個浮點數,而'(1).__ add __(1)'返回一個int值。 – phihag 2012-02-07 13:52:08

+1

我的意思是這不是一個語法錯誤,但是。 – 2012-02-07 13:53:49

8

因爲1.是有效的float文字和詞法分析器遵循「最大蒙克」規則 - 最長匹配使用。在1.作爲浮點文字消耗之後,標識符__add__和parens跟隨。所有的解析器看到的是<float> <indentifier>這是無效的(比較1.0 __add__(),這導致相同的令牌,我希望你看看它是如何是一個語法錯誤)和毫無意義。在第二個例子中,有一個表達式1包裝在parens中,然後一個點(一個單獨的標記,由解析器作爲屬性訪問運算符拾取)等等,這顯然是有效的。

相關問題