[pyar] Curiosidades del lexer de CPython

Claudio Freire klaussfreire en gmail.com
Mie Jul 25 04:50:34 ART 2012


2012/7/25 Alejandro Santos <listas en alejolp.com>:
>>>>> 3.0if 1e0else 0
>> 3.0
>>
>
> A ver quien me dice por qué eso funciona, pero esto no:
>
>>>> 3.0if 1else 0
>   File "<stdin>", line 1
>     3.0if 1else 0
>            ^
> SyntaxError: invalid token

Si te fijás en la gramática del lenguaje[0], los espacios luego de las
expresiones no hacen falta.

Ahí, "or_expr" puede reducirse a "literal", que a su vez puede ser
"pointfloat exponent", y "exponent" puede terminar directo con un
dígito de forma inequívoca.

Sin embargo, si tratás de hacer lo mismo con un entero, no sucede,
pues el parser debería poder saber que la "e" de "else" no es
indicación de un exponente. Python usa un parser ELL(1), que sólo
tiene un símbolo de "lookahead", así que no puede diferenciar, en este
caso, el exponente de un else, mientras mira el "1". Así que empieza,
ve el 1, dice "número". Ve la "e", dice "exponente"... si ve un "0",
cierra bien con exponente. Pero si ve una "l", dice "oops". Se ve en
el código del ELL(1)[1]

[0] http://docs.python.org/reference/expressions.html#conditional-expressions
[1] http://hg.python.org/cpython/file/d9a881b0d6ca/Parser/tokenizer.c#l1566



More information about the pyar mailing list