无法将 2 Superpower TextParser 与 Or 与 Span 组合
Unable to combine 2 Superpower TextParser with Or with Span
我有 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)
并给出以下错误
Syntax error (line 1, column 3): unexpected t
, expected s
.
是否有任何正确的方法来进行标识符的 "Or" 组合?
您必须在第一个解析器之后调用 Try()
,然后将其与 Or()
函数链接起来,如下所示:
TextParser<List<string>> combined =
from span in identifier001.Try().Or(identifier002)
select span;
您的第一个解析器 identifier001
已经消耗了字符串的 "in"
部分,剩下 identifier002
尝试解析字符串 "terrupt(20)"
失败。对 Try()
的调用告诉解析器回溯到前一个解析器的原点,这就是你想要的。
Try()
上的文档是这样的:
Construct a parser that tries one parser, and backtracks if unsuccessful so that no input appears to have been consumed by subsequent checks against the result.
我有 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)
并给出以下错误
Syntax error (line 1, column 3): unexpected
t
, expecteds
.
是否有任何正确的方法来进行标识符的 "Or" 组合?
您必须在第一个解析器之后调用 Try()
,然后将其与 Or()
函数链接起来,如下所示:
TextParser<List<string>> combined =
from span in identifier001.Try().Or(identifier002)
select span;
您的第一个解析器 identifier001
已经消耗了字符串的 "in"
部分,剩下 identifier002
尝试解析字符串 "terrupt(20)"
失败。对 Try()
的调用告诉解析器回溯到前一个解析器的原点,这就是你想要的。
Try()
上的文档是这样的:
Construct a parser that tries one parser, and backtracks if unsuccessful so that no input appears to have been consumed by subsequent checks against the result.