[pyar] Curiosidades del lexer de CPython

Alejandro Santos listas en alejolp.com
Jue Jul 26 00:16:15 ART 2012


2012/7/26 david weil <tenuki en gmail.com>:
>
> Bueno, esto me gustaría que me aclaren también de quien es la
> responsabilidad exactamente:
>
>> a=5
>> a.__add__(3)
> 8
>>>> 5.__add__(3)
>   File "<stdin>", line 1
>     5.__add__(3)
>             ^
> SyntaxError: invalid syntax
>>>> 5 . __add__(3)
> 8
>

En el segundo caso (el que tira error) cuando el Tokenizer lee el
punto después del cinco lo mastica como un número decimal. La chorrera
de tokens generados son:

<NUMBER, "5."> <NAME, "__add__"> <LPAR> <NUMBER, "3"> <RPAR>

Poniendo un espacio en blanco lo interpreta como un int seguido del punto:

<NUMBER, "5"> <DOT> <NAME, "__add__"> <LPAR> <NUMBER, "3"> <RPAR>

Fijate la diferencia de tokens. El punto lo toma como el operador
"punto" para acceder al metodo de la clase solo en el segundo caso.

Entonces, el error lo dispara el Parser porque no sabe qué hacer con
un float seguido de un NAME. Es el mismo error que hacer:

>>> 5.0 __add__(3)
  File "<stdin>", line 1
    5.0 __add__(3)
              ^
SyntaxError: invalid syntax
>>> 5. __add__(3)
  File "<stdin>", line 1
    5. __add__(3)
             ^
SyntaxError: invalid syntax
>>> (5.) __add__(3)
  File "<stdin>", line 1
    (5.) __add__(3)
               ^
SyntaxError: invalid syntax

El error significa que falta el punto.

-- 
Alejandro Santos



More information about the pyar mailing list