Pegjs: Comment puis-je créer un modèle PEG.js pour ma requête DB (X « AND » Y « AND » …)

Créé le 27 nov. 2018  ·  3Commentaires  ·  Source: pegjs/pegjs

Type de probleme

QUESTION

Conditions préalables

  • Pouvez-vous reproduire le problème ? : OUI
  • Avez-vous recherché les problèmes de référentiel ? : OUI
  • As-tu consulté les forums ? : OUI
  • Avez-vous effectué une recherche sur le Web (google, yahoo, etc.) ? : OUI

Description / Exemple de code

Jusqu'à présent, mon analyseur ressemble à ceci.

const parser = peg.generate(`

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

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

Il est capable de lire des requêtes comme id = 2 AND createdOn = 193242 . Je veux être capable de lire id = 2 AND secondId = 444 AND createdOn = 193242 et ainsi de suite... (N'importe quel nombre de "ET"). Comment puis-je y parvenir via PEG.js ?

question

Tous les 3 commentaires

Cela devrait le faire :

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; }

Solution générique pour n'importe quel nombre d'opérateurs avec n'importe quelle priorité (cré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 cerveau sexy. Merci!

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

marek-baranowski picture marek-baranowski  ·  6Commentaires

StoneCypher picture StoneCypher  ·  8Commentaires

mattkanwisher picture mattkanwisher  ·  5Commentaires

dmajda picture dmajda  ·  7Commentaires

mikeaustin picture mikeaustin  ·  7Commentaires