我在使用基于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
:解析失败:意外'['; expected =或!=或&gt; =或&lt; =或&gt;或者&lt; (第1行,第3栏);最近消费:xx
答案 0 :(得分:2)
执行此操作的方法是将参数排序到Or()
组合子,以便消耗最多输入的参数首先:
static readonly Parser<Expression> LeftHandSide =
AggregateVariableReference
.Select(Models.Expression.CreateAggregateReference)
.Or(SingletonVariableName
.Select(Models.Expression.CreateIdentifier));