Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refer to specific grammar rule #386

Closed
barsdeveloper opened this issue Mar 18, 2023 · 6 comments · Fixed by #390
Closed

Refer to specific grammar rule #386

barsdeveloper opened this issue Mar 18, 2023 · 6 comments · Fixed by #390
Labels
blocks-release Blocks an imminent release. High Priorty.

Comments

@barsdeveloper
Copy link

barsdeveloper commented Mar 18, 2023

Is it possible to have one single grammar and decide to parse a specific text using one rule of this grammar which is not the main one?

Let's say I have the following, very simple grammar, boolean is my start rule.

false = "false" { return false; }
true  = "true"  { return true; }
boolean = true / false

But sometimes I would like to access in the generated file, no only boolean but maybe I just need to parse false or true, is that possible? I mean to export them separately through cli.

@Mingun
Copy link
Member

Mingun commented Mar 18, 2023

Yes, see the --allowed-start-rules CLI argument / allowedStartRules config / API parameter:

$ node .\bin\peggy.js --help
Usage: peggy [options] [input_file]

Arguments:
  input_file                       Grammar file to read.  Use "-" to read stdin. (default: "-")

Options:
  ...
  --allowed-start-rules <rules>    Comma-separated list of rules the generated parser will be allowed to start parsing from.  (Can be specified multiple times) (default: the first rule in the grammar)
  ...
  -S, --start-rule <rule>          When testing, use the given rule as the start rule.  If this rule is not in the allowed start rules, it will be added.
  ...

@hildjj
Copy link
Contributor

hildjj commented Mar 18, 2023

Also of note: you can specify "*" for the allowed start rules, to allow any rule to be a starter.

I'm going to keep this open in order to make sure the CLI docs say that.

@hildjj hildjj added the blocks-release Blocks an imminent release. High Priorty. label Mar 18, 2023
@barsdeveloper
Copy link
Author

barsdeveloper commented Mar 18, 2023

Alright, I've managed to see it with the cli, you need to specify startRule on options arg of the function parse.
Can you please show me where to put the "*" for example on the false rule in the mini grammar on top?

@hildjj
Copy link
Contributor

hildjj commented Mar 18, 2023

"use strict";

const peggy = require("./");

const  { parse } = peggy.generate(`
false = "false" { return false; }
true  = "true"  { return true; }
boolean = true / false`, {
  allowedStartRules: ["*"],
});

console.log(parse("true", { startRule: "boolean" }));

@barsdeveloper
Copy link
Author

Understood, this is basically the equivalent of the CLI but when generating the grammar at runtime. I hoped there was some way to flag rules in the grammar itself to tell the generator (CLI or peggy.generate) what default starting rules to have.

Let's say I have mygrammar.peggy

*false = "false" { return false; }
true  = "true"  { return true; }
*boolean = true / false

And I want the starting rule to be either boolean or false. But as I understand this is not currently supported.

@hildjj
Copy link
Contributor

hildjj commented Mar 19, 2023

You are correct there is currently no mechanism inside the grammar for this, although that's a good idea. When we do rule importing (see #292 for initial work), some rules might be marked as public and others as private, for instance. There are other bits of metadata that might be interesting about rules, such as anticipated types for Typescript output, enabling tracing per-rule, example inputs that get automatically tested, etc.

We could come up with something like ECMAscript/Typescript decorators, have a syntax for comments like JSdoc, or decide that all of this is too complicated for the benefits that might accrue.

In the meantime, just keep an array of the rules you want to be made visible whenver you would have generated a * prefix, and pass that in where the ['*'] is in my example.

hildjj added a commit to hildjj/peggy that referenced this issue Mar 19, 2023
hildjj added a commit to hildjj/peggy that referenced this issue Mar 20, 2023
hildjj added a commit to hildjj/peggy that referenced this issue Mar 21, 2023
* main:
  Update deps, CHANGELOG, version.  Rebuild.
  Fix typos.  Move parens to correct place.
  Rebuilt patch from scratch, incorporating comments
  Update dependencies
  Remove --optimize.  Fixes peggyjs#392.
  --allowed-start-rule=\* documented for CLI.  Fixes peggyjs#386.
  Put parens around integer conversions in repetition.  Fixes peggyjs#381.
  Tweaking the error format() documentation
  Authors and small grammar fix
  Change silver to hex
  Update to node-inspect-extracted@2.0.2
  Update CHANGELOG
  Make online version work in old browsers.  Fixes peggyjs#371.
  Updating grammarSource documentation
  Add Marcel Bolten to authors
  Remove redundant options variants in behavior test
  Handle null and undefined explicitly
  Fixes peggyjs#374.  CLI was throwing exception on grammar errors without a CLI test also being specified.
  Stub out new CHANGELOG.md section
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
blocks-release Blocks an imminent release. High Priorty.
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants