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) {