mirror of
https://github.com/jashkenas/coffeescript.git
synced 2026-02-18 19:34:27 -05:00
after a lot of grammar wrestling, got the if-else chains to parse unambiguously. Now you only need a single period to close chains of any length.
This commit is contained in:
@@ -27,8 +27,7 @@ prechigh
|
||||
right '-=' '+=' '/=' '*=' '||=' '&&='
|
||||
right DELETE
|
||||
right RETURN THROW FOR WHILE
|
||||
left UNLESS
|
||||
left IF
|
||||
left UNLESS IF ELSE
|
||||
nonassoc "."
|
||||
preclow
|
||||
|
||||
@@ -238,17 +237,6 @@ rule
|
||||
| ArgList Terminator Expression { result = val[0] << val[2] }
|
||||
;
|
||||
|
||||
# If statements, including post-fix ifs and unlesses.
|
||||
If:
|
||||
IF Expression
|
||||
Then Expressions "." { result = IfNode.new(val[1], val[3]) }
|
||||
| IF Expression
|
||||
Then Expressions
|
||||
ELSE Expressions "." { result = IfNode.new(val[1], val[3], val[5]) }
|
||||
| Expression IF Expression { result = IfNode.new(val[2], Expressions.new([val[0]])) }
|
||||
| Expression UNLESS Expression { result = IfNode.new(val[2], Expressions.new([val[0]]), nil, :invert) }
|
||||
;
|
||||
|
||||
# Try/catch/finally exception handling blocks.
|
||||
Try:
|
||||
TRY Expressions CATCH IDENTIFIER
|
||||
@@ -311,6 +299,41 @@ rule
|
||||
CASE Expression Then Expressions { result = IfNode.new(val[1], val[3]) }
|
||||
;
|
||||
|
||||
# All of the following nutso if-else destructuring is to make the
|
||||
# grammar expand unambiguously.
|
||||
|
||||
# An elsif portion of an if-else block.
|
||||
ElsIf:
|
||||
ELSE IF Expression
|
||||
Then Expressions { result = IfNode.new(val[2], val[4]) }
|
||||
;
|
||||
|
||||
# Multiple elsifs can be chained together.
|
||||
ElsIfs:
|
||||
ElsIf { result = val[0] }
|
||||
| ElsIfs ElsIf { result = val[0].add_else(val[1]) }
|
||||
;
|
||||
|
||||
# Terminating else bodies are strictly optional.
|
||||
ElseBody
|
||||
"." { result = nil }
|
||||
| ELSE Expressions "." { result = val[1] }
|
||||
;
|
||||
|
||||
# All the alternatives for ending an if-else block.
|
||||
IfEnd:
|
||||
ElseBody { result = val[0] }
|
||||
| ElsIfs ElseBody { result = val[0].add_else(val[1]) }
|
||||
;
|
||||
|
||||
# The full complement of if blocks, including postfix one-liner ifs and unlesses.
|
||||
If:
|
||||
IF Expression
|
||||
Then Expressions IfEnd { result = IfNode.new(val[1], val[3], val[4]) }
|
||||
| Expression IF Expression { result = IfNode.new(val[2], Expressions.new([val[0]])) }
|
||||
| Expression UNLESS Expression { result = IfNode.new(val[2], Expressions.new([val[0]]), nil, :invert) }
|
||||
;
|
||||
|
||||
end
|
||||
|
||||
---- header
|
||||
|
||||
Reference in New Issue
Block a user