无法将2个Superpower TextParser与或与跨度结合使用

问题描述 投票:1回答:1

我有2个Superpower TextParser-每个目标都解析特定的输入-按前缀和参数进行区分。我试图创建一个组合的解析器,当任一TextParser可以解析输入时,该解析器将给出结果。输出是带有描述输入的某些字符串的列表。

例如一些输入输出对如下

"interrupt(20)" -> List { "interrupt", "20" }
"insert(20,12)" -> List {"insert", "20", "12" }
"delete(18)" -> Error

对于示例输入和输出对,我在C#中编写了以下内容,并添加了超能力参考。

// Works fine for "insert(12,24)"
string failingTest = "interrupt(12)";

TextParser<List<string>> identifier001 =
    from prefix in Span.EqualTo("insert")
    from open in Character.EqualTo('(')
    from num0 in Character.Numeric.Many()
    from comma1 in Character.EqualTo(',')
    from num1 in Character.Numeric.Many()
    from close in Character.EqualTo(')')
    select new List<string> { prefix.ToStringValue(), string.Join("", num0), string.Join("", num1) };

TextParser<List<string>> identifier002 =
    from prefix in Span.EqualTo("interrupt")
    from open in Character.EqualTo('(')
    from num0 in Character.Numeric.Many()
    from close in Character.EqualTo(')')
    select new List<string> { prefix.ToStringValue(), string.Join("", num0) };

TextParser<List<string>> combined =
    from span in identifier001.Or(identifier002)
    select span;

var res = combined.Parse(failingTest);
foreach (var item in res)
{
    Console.WriteLine(item);
}

我的combined标识符无法解析输入interrupt(12),并出现以下错误

语法错误(第1行,第3列):意外的t,预期的s

是否有适当的方式来进行标识符的“或”组合?

c# parsing prefix superpower
1个回答
0
投票

您必须在第一个解析器之后调用Try(),然后将其与Or()函数链接起来,如下所示:

TextParser<List<string>> combined =
    from span in identifier001.Try().Or(identifier002)
    select span;

发生的情况是您的第一个解析器identifier001已经消耗了字符串的"in"部分,这使identifier002可以尝试解析失败的字符串"terrupt(20)"。对Try()的调用告诉解析器回溯到先前解析器的原点,这就是您想要的。

Try()上的文档是这样:

构造一个尝试一个解析器的解析器,如果解析不成功,则回溯,以便后续检查结果似乎都没有消耗任何输入。

© www.soinside.com 2019 - 2024. All rights reserved.