PEP 308: Alternative conditional operator forms -- Corner Case solved
Andrew Koenig
ark at research.att.com
Tue Feb 11 14:19:27 EST 2003
Erik> I'm going to turn that one right around on you. Why add the new
Erik> keyword `ifelse'? Why not use `if'?
John> Because you've got a major ambiguity if the statement begins
John> with an "if". That comment is in the PEP.
I believe I have eliminated the ambiguity.
Many people have suggested that it requires unbounded lookahead to
determine whether
if C: expr1 else: expr2
is a statement or an expression. After thinking about it for a while,
I suddenly realized that this claim is not true.
The key here is that a statement always ends with either a newline
or a dedent, and an expression never does. That means that when
you're parsing bottom-up, whenever it comes time to determine whether
a construct is an expression or a statement, you can always make that
determination by seeing whether the next symbol is a newline, a dedent,
or something else.
This surprising fact yields an even more surprising simplification
of my previous proposal for changing the grammar:
Original:
test: and_test ('or' and_test)* | lambdef
Proposed:
test: and_test ('or' and_test)* | lambdef | if_test
if_test: 'if' test ':' test ('elif' ':' test)* 'else' ':' test
In English: An if-else expression is permitted anywhere a lambda
expression is permitted, with the same precedence rules.
This change passes pgen without complaint.
Some implications:
if x==0: "foo" else: "bar" # legal expression
if x==0: "foo" # legal statement
else: "bar"
print if x==0: "foo" else: "bar" # legal statement
if x==0: print "foo" else: print "bar" # illegal, as it is today--
# print is not an expression
if x==0: print "foo" # legal statement, as it is today
else: print "bar"
if x==0: "foo" # legal statement, as it is today
else: "bar"
--
Andrew Koenig, ark at research.att.com, http://www.research.att.com/info/ark
More information about the Python-list
mailing list