Implement ConditionalExpression
Also add tests.
--
MOS_MIGRATED_REVID=88474801
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Parser.java b/src/main/java/com/google/devtools/build/lib/syntax/Parser.java
index 97a4bbd..90f79ec 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/Parser.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/Parser.java
@@ -341,6 +341,8 @@
// Convenience method that uses end offset from the last node.
private <NODE extends ASTNode> NODE setLocation(NODE node, int startOffset, ASTNode lastNode) {
+ Preconditions.checkNotNull(lastNode, "can't extract end offset from a null node");
+ Preconditions.checkNotNull(lastNode.getLocation(), "lastNode doesn't have a location");
return setLocation(node, startOffset, lastNode.getLocation().getEndOffset());
}
@@ -908,7 +910,23 @@
}
private Expression parseExpression() {
- return parseExpression(0);
+ int start = token.left;
+ Expression expr = parseExpression(0);
+ if (token.kind == TokenKind.IF) {
+ nextToken();
+ Expression condition = parseExpression(0);
+ if (token.kind == TokenKind.ELSE) {
+ nextToken();
+ Expression elseClause = parseExpression();
+ return setLocation(new ConditionalExpression(expr, condition, elseClause),
+ start, elseClause);
+ } else {
+ reportError(lexer.createLocation(start, token.left),
+ "missing else clause in conditional expression or semicolon before if");
+ return expr; // Try to recover from error: drop the if and the expression after it. Ouch.
+ }
+ }
+ return expr;
}
private Expression parseExpression(int prec) {