首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析器‘`Present`’语义

解析器‘`Present`’语义
EN

Stack Overflow用户
提问于 2015-11-30 22:23:19
回答 1查看 798关注 0票数 3

我正在编写符合跨域身份管理系统:协议过滤规范的解析器。除了"pr“运算符之外,我几乎可以用Sprache解析任何表达式。怎么才能让它正常工作呢?

以下是主要的解析内容:

代码语言:javascript
复制
   {
        And = Operator("and", "And");
        Or = Operator("or", "Or");
    
        Le = Operator("le", "LessThanOrEqual");
        Lt = Operator("lt", "LessThan");
        Gt = Operator("gt", "GreaterThan");
        Ge = Operator("ge", "GreaterThanOrEqual");
        Eq = Operator("eq", "Equal");
        Ne = Operator("ne", "NotEqual");
        Co = Operator("co", "Contains");
        Sw = Operator("sw", "StartsWith");
        Ew = Operator("ew", "EndsWith");
    
        Pr = Operator("pr", "Present");

        ...


        Operand = (Parentheses
            .XOr(Literal.Or(AttrPath.Token()))
            .XOr(CaseInsensitiveString)).Token();

        //compareOp = "eq" / "ne" / "co" /
        //        "sw" / "ew" /
        //        "gt" / "lt" /
        //        "ge" / "le"
        CompareExpression = Parse.XChainOperator(Le.Or(Lt).XOr(Ge.Or(Gt)).XOr(Eq.Or(Ne)).XOr(Sw.Or(Ew)).XOr(Co).XOr(Pr), Operand, FilterExpression.Binary);

        PresentsExpression = Parse.XChainRightOperator(Pr, Operand, FilterExpression.Binary).Or(CompareExpression);

        // logExp    = FILTER SP ("and" / "or") SP FILTER
        AndExpression = Parse.XChainOperator(And, CompareExpression, FilterExpression.Binary);

        // logExp    = FILTER SP ("and" / "or") SP FILTER
        OrExpression = Parse.XChainOperator(Or, AndExpression, FilterExpression.Binary);
        Filter = OrExpression;
    }
    private static Parser<string> Operator(string op, string opName)
    {
        return Parse.String(op).Token().Return(opName);
    }

这就是我添加"pr“解析的地方:

代码语言:javascript
复制
 Parse.XChainRightOperator(Pr, Operand, FilterExpression.Binary).Or(CompareExpression);

此筛选器失败:title pr and addresses[type eq \"work\"].streetAddress eq \"workStreet\"

这也没问题:

代码语言:javascript
复制
  addresses[type eq \"work\"].streetAddress eq \"workStreet\" 
and (userType eq \"Employee\" or userType eq \"ParttimeEmployee\")

也许有人能帮我解决这个问题。

编辑:也许我应该在某个时候用XChainRightOperator链接操作符,因为pr标题工作得很好。但是链式扩展是用于二进制表达式的,我需要一元。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-01 11:05:02

我已经找到答案了。下面是正确的解析代码:

代码语言:javascript
复制
    Operand = (Parentheses
        .XOr(Literal.Or(AttrPath.Token()))
        .XOr(CaseInsensitiveString)).Token();

    // compareOp = "eq" / "ne" / "co" /
    //        "sw" / "ew" /
    //        "gt" / "lt" /
    //        "ge" / "le"
    Comparison = Parse.XChainOperator(Le.Or(Lt).XOr(Ge.Or(Gt)).XOr(Eq.Or(Ne)).XOr(Sw.Or(Ew)).XOr(Co).XOr(Pr), Operand, FilterExpression.Binary);

    // attrPath SP "pr"
    Presence = Operand.SelectMany(operand => Pr, (operand, pr) => FilterExpression.Unary(pr, operand));

    // attrExp = (attrPath SP "pr") /
    //   (attrPath SP compareOp SP compValue)
    AttributeExpression = Presence.Or(Comparison);

    // logExp    = FILTER SP ("and" / "or") SP FILTER
    LogicalExpression = Parse.XChainOperator(Or.Or(And), AttributeExpression, FilterExpression.Binary);
    Filter = LogicalExpression;

诀窍是先检查操作数,然后再检查操作数,然后在AttributeExpression = Presence.Or(Comparison);中使用或代替AttributeExpression = Presence.Or(Comparison);

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34009137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档