예제 #1
0
        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);
        }