gpt4 book ai didi

c# - 当表达式的开头相同时,如何使用 Sprache 解析表达式

转载 作者:行者123 更新时间:2023-11-30 16:51:48 26 4
gpt4 key购买 nike

我在使用基于 Sprache 的解析器时遇到了一些问题。我正在尝试解析一个字符串,其中有两种可能要解析的内容。一种选择是使用常规变量名称,如 x 或更复杂的版本 x[1]。第一个引用一个简单变量,第二个引用由许多变量组成的聚合变量,x[1] 引用聚合中的第一个变量。

这就是我目前所拥有的。

    private static readonly Parser<VariableModel> SingletonVariableName =
from leading in Sprache.Parse.WhiteSpace.Many()
from variable in Identifier
from trailing in Sprache.Parse.WhiteSpace.Many()
select variable;

private static readonly Parser<VariableModel> Identifier =
from first in Sprache.Parse.Letter.Once().Text()
from rest in Sprache.Parse.LetterOrDigit.Many().Text()
select new VariableModel(string.Concat(first, rest));

private static readonly Parser<AggregateVariableReference> AggregateVariableReference =
from variableName in Identifier
from openingSubscript in Sprache.Parse.Char('[').Once()
from subscriptStatement in Sprache.Parse.Number.Text()
from closingSubscript in Sprache.Parse.Char(']').Once()
select new AggregateVariableReference(variableName.Name,
Convert.ToInt32(subscriptStatement));
private static readonly Parser<Expression> LeftHandSide =
SingletonVariableName.Select(Models.Expression.CreateIdentifier)
.Or(AggregateVariableReference.Select(Models.Expression.CreateAggregateReference));

我在某处读到,Or 方法仅在第一个字符决定哪个表达式获胜时才有效。就我而言,情况并非如此。两者都以变量名开头。 XOr 有什么作用?这对这种情况有帮助吗?

我得到以下异常:Sprache.ParseException : Parsing failure: unexpected '[';预期 = 或 != 或 >= 或 <= 或 > 或 <(第 1 行,第 3 列);最近消费:xx

最佳答案

这样做的方法是对 Or() 组合器的参数进行排序,以便消耗最多输入的是第一个:

static readonly Parser<Expression> LeftHandSide =
AggregateVariableReference
.Select(Models.Expression.CreateAggregateReference)
.Or(SingletonVariableName
.Select(Models.Expression.CreateIdentifier));

关于c# - 当表达式的开头相同时,如何使用 Sprache 解析表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33440272/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com