GithubHelp home page GithubHelp logo

Comments (3)

hildjj avatar hildjj commented on June 16, 2024 1

Yes, the docs are a little unclear about this, but it's supported behavior. I'll create a bug on peggyjs/peggy to improve the docs.

from pegjs.

hildjj avatar hildjj commented on June 16, 2024

This might be a good place for a & {predicate} block. Parse a token with something like $[a-z_]i+, then check it in a list of valid tokens in the predicate. Here is an intentionally-simplified example (no paren grouping) that parses your inputs and rejects invalid roles/adgroups:

'use strict'

const pegjs = require('pegjs')

const src = `
authorized
  = perm:perm rest:(_ o:op _ p:perm { return [o, p]})* { rest.unshift(perm); return rest }

perm = pn:permname _ "(" _ n:name & { return options[pn].includes(n) } _")" {
  return { [pn]: n }
}

permname
  = "role"i { return "roles" }
  / "adgroup"i { return "adgroups" }

name = $[a-z_]i+

op
  = $"||"
  / $"&&"

_ = $[ \t]*
`
const parser = pegjs.generate(src)

for (const a of process.argv.slice(2)) {
  console.log(parser.parse(a, {
    roles: ['admin'],
    adgroups: ['ACME_Developer']
  }))
}

from pegjs.

cleverplatypus avatar cleverplatypus commented on June 16, 2024

Thanks @hildjj.

Are you saying that the options object is available in the grammar and it contains whatever I pass in as a second parameter of parser.parse()?

That's not clear from the docs. Is it a "hack" or is it going to be working in future versions of PEG?

I ended up creating a grammar that outputs and AST that then is interpreted by my code.

{
   "any": [
      {
         "all": [
            {
               "adgroup": "ACME_Developer"
            },
            {
               "role": "admin"
            }
         ]
      },
      {
         "adgroup": "supergod"
      }
   ]
}

from pegjs.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.