Pegjs: 如何为我的数据库查询创建 PEG.js 模式(X “AND” Y “AND” ...)

创建于 2018-11-27  ·  3评论  ·  资料来源: pegjs/pegjs

问题类型

问题

先决条件

  • 你能重现这个问题吗?:是的
  • 您是否搜索了存储库问题?:
  • 你检查过论坛吗?:是的
  • 您是否进行了网络搜索(谷歌、雅虎等)?:

说明/示例代码

到目前为止,我的解析器看起来像这样。

const parser = peg.generate(`

eq
  = left:attribute "=" right:value { return left == right; }

and
  = left:eq "AND" right:eq { return left && right; }

它能够读取像id = 2 AND createdOn = 193242这样的查询。 我希望能够读取id = 2 AND secondId = 444 AND createdOn = 193242等等......(任意数量的“AND”)。 如何通过 PEG.js 实现这一目标?

question

所有3条评论

这应该这样做:

and
  = left:eq right:and_eq+ {
      if ( right.length === 1 ) return left && right;
      // handle more then 1 'AND eq' here
    }

and_eq
  = "AND" e:eq { return e; }

具有任何优先级的任意数量运算符的通用解决方案(创建 AST):

{
function leftAssotiative(left, tail) {
  let r = left;
  for (let i = 0; i < tail.length; ++i) {
    r = { kind: tail[i][0], left: r, right: tail[i][1] };
  }
  return r;
}
function rightAssotiative(left, tail) {
  if (tail.length > 1) {
    let r = tail[tail.length-1][1];
    for (let i = tail.length-2; i >= 0; --i) {
      r = { kind: tail[i+1][0], left: tail[i][1], right: r };
    }
    return { kind: tail[0][0], left: left, right: r };
  }
  return left;
}
}

// Expressions
Expr// minimal priority
  = l:Expr0 t:(p0 Expr0)* { return rightAssotiative(l, t); };
Expr0
  = l:Expr1 t:(p1 Expr1)* { return leftAssotiative(l, t); };
...
ExprN// maximal priority
  = '(' <strong i="6">@Expr</strong> ')';

// Operators
p0 = [+-];
p1 = [*/];
...

@futagoza性感的大脑。 谢谢!

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

mreinstein picture mreinstein  ·  12评论

futagoza picture futagoza  ·  13评论

marek-baranowski picture marek-baranowski  ·  6评论

StoneCypher picture StoneCypher  ·  6评论

emmenko picture emmenko  ·  15评论