Sprache-无法识别此序列

时间:2018-07-08 12:12:05

标签: c# parsing sprache

我想匹配第一个字符是字母的字符串,然后是多个数字或字母的字符,最后以字母结尾。例如a11a11a是正确的,但a11aa11是错误的,因为它以数字而不是字母结尾。

我编写了以下代码来做到这一点:

var grammar =
    from first in Parse.Letter.Once()
    from rest in Parse.LetterOrDigit.Many()
    from end in Parse.Letter.Once()
    select new string(first.Concat(rest).Concat(end).ToArray());

var result = grammar.TryParse("a111a");

不幸的是,LetterOrDigit.Many()也消耗了最后一个字母。

有什么办法可以避免这种情况?

1 个答案:

答案 0 :(得分:1)

这是一个解决方案:

Parser<IEnumerable<char>> A = null, B = null, C = null;

var letter = Parse.Letter.Once();
var digit = Parse.Digit.Once();

B =
    (
    from d in digit
    from cs in Parse.Ref(() => C)
    select d.Concat(cs)
    ).Or
    (
        from l in letter
        from bs in Parse.Ref(() => B)
        select l.Concat(bs)
    ).Or(letter);

C = (
    from d in digit
    from bs in Parse.Ref(() => B)
    select d.Concat(bs)
    ).Or(letter);

A = (
    from l in letter
    from bs in Parse.Ref(() => B)
    select l.Concat(bs)
    ).Or(letter);

var grammar =
    from _ in Parse.WhiteSpace.Many()
    from a in A
    from __ in Parse.WhiteSpace.Many()
    select a;

Or中的子句需要正确的顺序。

评论者建议使用正则表达式。您可以在Sprache中使用它们:

Parse.Regex("[a-z]([a-z0-9]*[a-z])?")