public static ConditionalNode Read(ReadParams p, DataType refDataType, Span opSpan, string[] stopStrings) { var code = p.Code; var ret = new ConditionalNode(p.Statement, opSpan); var condStopStrings = stopStrings == null || stopStrings.Length == 0 ? s_stopStrings : stopStrings.Concat(s_stopStrings).ToArray(); var trueExp = ExpressionNode.Read(p, refDataType, condStopStrings); if (trueExp == null) { p.Statement.ReportError(new Span(code.Position, code.Position + 1), CAError.CA0042); // Expected value to follow conditional '?'. return(ret); } ret._trueExp = trueExp; if (!code.ReadExact(':')) { p.Statement.ReportError(new Span(code.Position, code.Position + 1), CAError.CA0041); // Expected ':' to follow conditional result. return(ret); } var falseExp = ExpressionNode.Read(p, refDataType, condStopStrings); if (falseExp == null) { p.Statement.ReportError(new Span(code.Position, code.Position + 1), CAError.CA0043); // Expected value to follow conditional ':'. return(ret); } if (code.ReadExact('?')) { // Stacked conditional var group = new GroupNode(p.Statement, null); group.AddChild(falseExp); group.AddChild(ConditionalNode.Read(p, refDataType, code.Span, stopStrings)); ret._falseExp = group; } else { ret._falseExp = falseExp; } return(ret); }