Upgrade to Pro — share decks privately, control downloads, hide ads and more …

GoのASTを用いて フィルター機能を作ろうとした話

GoのASTを用いて フィルター機能を作ろうとした話

Suzu Ito

April 24, 2025
Tweet

More Decks by Suzu Ito

Other Decks in Programming

Transcript

  1. ླ໦ ହే / Suzuki Taito / @ts__0625 • WebΤϯδχΞ (6೥໨

    • όοΫΤϯυ • Goྺ͸໿Go೥ • ݩʑ͸σʔλΤϯδχΞͬΆ͍ (7೥ • ݱࡏ • WebΤϯδχΞ @גࣜձࣾHRBrain ࣗݾ঺հ
  2. ;ͱʮGoͷASTʯΛࢥ͍ग़ͨ͠ ඪ४ϥΠϒϥϦ go/ast, go/parser GoݴޠͷιʔείʔυΛ੩తղੳ͢Δͱ͖ʹ࢖ΘΕΔ go/ast … AST ද͢ߏ଄ମͳͲ go/parser

    … ιʔείʔυ΍͔ࣜΒASTΛߏங͢Δύʔαʔ go/parser.ParseExpr ؔ਺ … Goݴޠͷࣜ(Expression)͚ͩͷASTΛฦ͢ ( a + fn(1) ) * d
  3. ϑΟϧλʔઃఆ(Goͷࣜ) ࣜͷධՁ݁Ռ͸ඞͣϒʔϧ஋ 3ͭͷؔ਺͕ఆٛͯ͋͠Δ contains(a string) bool : Πϕϯτͷ಺༰͕ a ΛؚΉʁ

    equalType(a string) bool : Πϕϯτͷछྨ͕ a Ͱ͋Δʁ equalLoc(a string) bool : Πϕϯτͷൃੜ৔ॴ͕ a Ͱ͋Δʁ &&ͱ||ͷԋࢉࢠͷΈ͕࢖༻Մೳ ྫ equalLoc(“౦ژ౎৽॓۠”) && equalType(“઄౪ࣄ݅”) || equalLoc(“࡛ۄݝॴ୔ࢢ”) && equalType(“ߑਫ”) && contains(“চ্ਁਫ”) ౦ژ౎৽॓۠ɺ͔ͭɺ઄౪ࣄ݅ ·ͨ͸ ࡛ۄݝॴ୔ࢢɺ͔ͭɺߑਫɺ͔ͭɺʮচ্ਁਫʯؚ͕·ΕΔ
  4. Filter(ev Event, setting string) bool (1) setting(ϑΟϧλʔઃఆ)ͷASTΛ࡞Δ ast/parser.ParseExpr ؔ਺ΛݺͿ͚ͩ equalLoc(“౦ژ౎৽॓۠”)

    && equalType(“઄౪ࣄ݅”) || equalLoc(“࡛ۄݝॴ୔ࢢ”) && equalType(“ߑਫ”) && contains(“চ্ਁਫ”) ্هͷࣜΛASTʹม׵͢Δͱ…΍ͬͯΈΔ https://go.dev/play/p/7llFDi3gdeI
  5. Filter(ev Event, setting string) bool (1) setting(ϑΟϧλʔઃఆ)ͷASTΛ࡞Δ || && equalLoc

    “౦ژ౎৽॓۠” equalType “઄౪ࣄ݅” && && equalLoc “࡛ۄݝॴ୔ࢢ” equalType “ߑਫ” contains “চ্ਁਫ”
  6. Filter(ev Event, setting string) bool (2) ASTʹؚ·ΕΔશͯͷؔ਺ΛධՁ͢Δ ؔ਺͚ͩධՁ (ਂ͞༏ઌ୳ࡧ͠ɺਂ͍ͱ͜Ζʹ͋Δؔ਺͔Β) ||

    && equalLoc “౦ژ౎৽॓۠” equalType “઄౪ࣄ݅” && && equalLoc “࡛ۄݝॴ୔ࢢ” equalType “ߑਫ” contains “চ্ਁਫ”
  7. ͍·ࢥ͏ɺ͍·΍ΔͳΒ ඇΤϯδχΞͰ΋ѻ͑ΔϑΟϧλʔઃఆͱ͸ʁ ΛͪΌΜͱߟ͑Δ with PdMͱσβΠφʔ ධՁࣜ༻ͷϥΠϒϥϦΛ࢖͏ CEL https://cel.dev/ Open Policy

    Agent https://www.openpolicyagent.org/docs/latest/ Expr https://expr-lang.org/ ϥΠϒϥϦͷ໨త͔Β֎Εͨ࢖͍ํΛ͠ͳ͍