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

本文关键字:表达式 何使用 Sprache 开头 | 更新日期: 2023-09-27 18:19:52

我的基于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:解析失败:意外的"[";应为=或!=或>=或<=或>或<(第1行,第3列);最近使用:xx

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

这样做的方法是对Or()组合子的参数进行排序,以便消耗最多输入的是首先

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