[Python-ideas] Grammar for plus and minus unary ops

Jared Grubb jared.grubb at gmail.com
Fri Mar 27 22:07:16 CET 2009


(Originally posted to python-dev, discussion moved here per request by  
GvR; also fixed pseudo-code to not use a keyword as local var)

Begin forwarded message:
>
> I was recently reviewing some Python code for a friend who is a C++  
> programmer, and he had code something like this:
>
> def foo():
>  attempt = 0
>  while attempt<MAX:
>     ret = bar()
>     if ret: break
>     ++attempt
>
> I was a bit surprised that this was syntactically valid, and because  
> the timeout condition only occurred in exceptional cases, the error  
> has not yet caused any problems.
>
> It appears that the grammar treats the above example as the unary +  
> op applied twice:
>
> u_expr ::=
>             power | "-" u_expr
>              | "+" u_expr | "\~" u_expr
>
> Playing in the interpreter, expressions like "1+++++++++5" and  "1+- 
> +-+-+-+-+-5" evaluate to 6.
>
> I'm not a EBNF expert, but it seems that we could modify the grammar  
> to be more restrictive so the above code would not be silently  
> valid. E.g., "++5" and "1+++5" and "1+-+5" are syntax errors, but  
> still keep "1++5", "1+-5", "1-+5" as valid. (Although, '~' throws in  
> a kink... should '~-5' be legal? Seems so...)
>
> Jared
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20090327/6b74b435/attachment.html>


More information about the Python-ideas mailing list