[pyar] Curiosidades del lexer de CPython

Alejandro Santos listas en alejolp.com
Mie Jul 25 12:21:34 ART 2012


2012/7/25 Claudio Freire <klaussfreire en gmail.com>:
> 2012/7/25 Daniel Moisset <dmoisset en machinalis.com>:
>>
>> Lo que pasa tiene que ver con la "e" del else, ero no con el parser
>> ELL(1), el error este se produce en la etapa de tokenizing, previa al
>> parser.
>
> No leí todo el código del parser de python, pero imaginé que si
> devuelve el error ese en el tokenizer, haría backtracking. Y que al
> ser ELL(1) incluso el backtracking pinchaba.
>
> Capaz que imaginé mal?
>

tl;dl: Está bien. Era el exponente de decimales.

Lo que es LL(1) (sin la E) es el parser de Python. Como bien dijieron,
el error lo tira el Tokenizer, etapa previa al parser. En general el
Tokenizer es un evaluador de expresiones regulares, pero en CPython el
tokenizer está hecho a pulmón con cada regla regular hecha a mano.

El mensaje de error tiraba una ayuda: "SyntaxError: invalid token". El
problema es la letra "e".

Mi pregunta apuntaba a ver si se daban cuenta que los único keywords
que no se le puede poner un numero literal antes sin un espacio son
los que empiezan con "e". El unico que hay hasta ahora definido en el
lenguaje es el "else" del if inline.

El Tokenizer intenta masticar la mayor cantidad de letras, y cuando
lee: "1else" lo entiende como un número en punto flotante como
notacion científica. Hasta el "1e" es una expresión incompleta, la
regla dice que tiene que leer: a) un simbolo "+", ó b) un simbolo "-",
ó c) un dígito [0-9].

Pero al procesar "1else" el caracter que lee es la letra "L", y por
eso tira error, mientras que en los otros ejemplos que puse no. Es el
único caso (que encontré) que hay que separar el keyword con un
espacio:

>>> 2and 1
1
>>> [1for x in"xyz"]
[1, 1, 1]

Escribiendo el número en notación científica se puede evitar poner un
espacio en blanco, porque la "e" ya está consumida:

>>> 3.0if 1e0else 0
3.0

Siguiente pregunta: Si no siempre es necesario separar con espacios a
la izquierda, ¿por qué siempre hay que separar con blancos a la
derecha?

>>> 2and1
  File "<stdin>", line 1
    2and1
        ^
SyntaxError: invalid syntax

Ayuda: no es el tokenizer :P

-- 
Alejandro Santos



More information about the pyar mailing list