示例#1
0
        public T Parse <T>(SpecificParseRule <T> rule) where T : class
        {
            int ruleId = BeginRule();

            var result = rule() as T;

            if (result == null)
            {
                FailRule(ruleId);
                return(null);
            }

            SucceedRule(ruleId, result);
            return(result);
        }
示例#2
0
        protected List <T> SeparatedList <T> (SpecificParseRule <T> mainRule, ParseRule separatorRule) where T : class
        {
            T firstElement = Parse(mainRule);

            if (firstElement == null)
            {
                return(null);
            }

            var allElements = new List <T> ();

            allElements.Add(firstElement);

            do
            {
                int nextElementRuleId = BeginRule();

                var sep = separatorRule();
                if (sep == null)
                {
                    FailRule(nextElementRuleId);
                    break;
                }

                var nextElement = Parse(mainRule);
                if (nextElement == null)
                {
                    FailRule(nextElementRuleId);
                    break;
                }

                SucceedRule(nextElementRuleId);

                allElements.Add(nextElement);
            } while (true);

            return(allElements);
        }