无法将 2 Superpower TextParser 与 Or 与 Span 结合

Posted

技术标签:

【中文标题】无法将 2 Superpower TextParser 与 Or 与 Span 结合【英文标题】:Unable to combine 2 Superpower TextParser with Or with Span 【发布时间】:2019-11-19 11:18:18 【问题描述】:

我有 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

有没有合适的方法来做标识符的“或”组合?

【问题讨论】:

【参考方案1】:

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

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

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

Try() 上的文档是这样的:

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

【讨论】:

我想知道为什么这不是默认值。确定在失败时消耗输入不是常见的要求吗? @AndrewSavinykh 我同意,尤其是在解析器上链接Or() 调用时,您希望它自动回溯。我个人也为此苦苦挣扎了一段时间,直到我梳理了文档以找到 Try() 函数。我还没有查看 Superpower 的源代码,但可能是有原因的。 我查看了代码并打开了this issue。不过,最近图书馆的发展非常缓慢,所以我不确定它是否有足够的吸引力。

以上是关于无法将 2 Superpower TextParser 与 Or 与 Span 结合的主要内容,如果未能解决你的问题,请参考以下文章

Android开发中如何可以捕获到短按power键的事件

游戏编程模式-子类沙盒

我似乎无法将 NSUInteger 除以 2

发现无法将 android studio 2.0 更新到 2.1

TypeError:无法将“4”解释为数据类型

无法将作曲家降级到版本 1,也无法在 Magento 2.4.0 上安装弹性套件