2012-02-07 15 views

答えて

18

これはトークナイザの効果である:トークナイザは、可能な限り長いトークンを建てしようとするので、1.__add__(1)は、トークン"1.""__add__""(""1"、および")"に分割されます。最初のトークンは浮動小数点数で、識別子の直後にはパーサが意味を持ちませんので、SyntaxErrorがスローされます。 1.が有効なフロートがリテラルである

>>> 1 .__add__(1) 
2 
2

パーサーは浮動小数点数を見つけることを想定していますが、_は有効な数字ではありません。括弧は、1の後に解析を停止するようにパーサーに指示します。

+3

'1 ..__ add __(1)'も動作します。 –

+6

いいえ、 '1 ..__ add __(1)'はfloatを返しますが、 '(1).__ add __(1)'はintを返します。 – phihag

+1

私はそれが構文エラーではないことを意味しますが、はい。 –

8

ので、とレクサーは「最大ムンク」ルールに従ってください - 最長一致が使用されます。

は単純に、この作業を行いますドットの前にスペースを追加します。 1.がfloatリテラルとして消費された後、識別子 __add__と括弧が続きます。すべてのパーサは <float> <indentifier>であり、無効である( 1.0 __add__()を比較すると、同じトークンとなり、構文エラーとなることがわかります)無意味です。第2の例では、式 1が括弧で囲まれており、 、次にドット(属性アクセス演算子としてパーサによってピックアップされた単一のトークン)等が明らかに有効である。

関連する問題