module dlex.Rule.RepeatRule; import dlex.Rule; class RepeatRule : Rule { public: Rule rule; this (Rule rule) { this.rule = rule; } override MatchResult match(dstring source, ref Position pos) { auto prevPos = pos; dstring str = ""; while (true) { auto r = rule.matched(source, pos); if (! r) { break; } str ~= r.str; } // 0こにもマッチ if (str.length == 0) { return new MatchResult("", prevPos); } return new MatchResult(str, prevPos); } }