首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PEGjs中的条件语法规则

PEGjs中的条件语法规则
EN

Stack Overflow用户
提问于 2016-12-20 02:55:10
回答 1查看 692关注 0票数 0

我正在尝试实现一个简单的DSL,它解析基本的算术表达式。这需要在浏览器中完成,所以我使用PEGjs来生成解析器。

表达式中的术语可以是数字(整数或实)、变量(变量是传递给解析器的上下文对象上的属性)、条件词或通过点表示法访问的属性。

我希望条件词看起来像这个condition?value,如果condition是真的话,这个词就等于value?两边的变量也可以是点表示法,可以访问像这个object.property1?object.property2这样的对象的属性。

因此,如果解析器被传递给如下所示的对象:

代码语言:javascript
复制
context = {
  depth: 100,
  material: {
    thickness: 20
    include: true
  }
  edge: {
    face: 4.5
  }
}

这句话:

500 + depth + material.include?edge.face + material.thickness应该等同于624.5

我一直在使用PEGjs在线编辑器。我尝试过很多不同的方法,但我似乎无法确定条件。其他的都能用。以下是有关规则:

代码语言:javascript
复制
Variable "variable"
  = variable:identifier accessor:("." identifier)* {
      var result = context[variable], i

      for (i = 0; i < accessor.length; i++) {
        result = result[accessor[i][1]]
      }

      return result
    }

identifier
  = identifier:$([0-9a-zA-Z_\$]+)

Conditional
  = condition:Variable "?" value:Variable {
    return condition ? value : 0
  }

我看过了PEGjs github中javascript的示例语法,条件规则看起来很像我在这里得到的东西,但我仍然无法让它工作。

实现像我在PEGjs规则中描述的条件语句的正确方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-21 15:57:29

我知道这有点晚,但问题是您的variable是对"material.include"的字符串评估。

看看这段代码:

代码语言:javascript
复制
var result = context[variable], i

您正试图从上下文对象中访问名为"material.include“的属性,该属性如下所示:

代码语言:javascript
复制
{
    "material.include": true
}

而不是尝试访问由“Rather”属性引用的对象,然后访问结果对象上的"include“属性,如下所示:

代码语言:javascript
复制
{
    "material": {
        "include": true
    }
}

解决方案是将变量字符串拆分为"."字符,然后递归地查找属性:

代码语言:javascript
复制
Variable "variable"
  = variable:identifier accessor:("." identifier)* {
      var path = variable.split(".");
      var result = path.reduce( (nextObject, propName) => nextObject[propName], context );

      for (var i = 0; i < accessor.length; i++) {
        result = result[accessor[i][1]]
      }

      return result
    }

请注意,此解决方案尚未完成,因为如果您尝试访问material.include,其中从未在上下文中定义material,则会导致错误。您可能希望添加其他错误处理,但它确实适用于给定的示例。

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

https://stackoverflow.com/questions/41234164

复制
相关文章

相似问题

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