Pegjs: ๋‚ด DB ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ PEG.js ํŒจํ„ด์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•(X โ€œANDโ€ Y โ€œANDโ€ โ€ฆ)

์— ๋งŒ๋“  2018๋…„ 11์›” 27์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: pegjs/pegjs

๋ฌธ์ œ ์œ ํ˜•

์งˆ๋ฌธ

์ „์ œ ์กฐ๊ฑด

  • ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?: ์˜ˆ
  • ์ €์žฅ์†Œ ๋ฌธ์ œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜์…จ์Šต๋‹ˆ๊นŒ?: ์˜ˆ
  • ํฌ๋Ÿผ์„ ํ™•์ธํ•˜์…จ์Šต๋‹ˆ๊นŒ? : ์˜ˆ
  • ์›น ๊ฒ€์ƒ‰(google, yahoo ๋“ฑ)์„ ์ˆ˜ํ–‰ํ•˜์…จ์Šต๋‹ˆ๊นŒ?: ์˜ˆ

์„ค๋ช… / ์˜ˆ์ œ ์ฝ”๋“œ

์ง€๊ธˆ๊นŒ์ง€ ๋‚ด ํŒŒ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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 ๋“ฑ๊ธ‰