Code Monkey home page Code Monkey logo

peginator's People

Contributors

badicsalex avatar npmccallum avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

peginator's Issues

Flattened enums

Support for more general enumerations.

Helps to reduce some intermediate structures and enhance readability.

For example

CharRulePart = @:CharacterRange | @:CharRangePart | @:Identifier;
CharacterRange = from:CharRangePart ".." to:CharRangePart;
@no_skip_ws
CharRangePart = "'" @:StringItem "'";

Can be equivalent to

@enum
CharRulePart = 
    @Range | from:CharRangePart ".." to:CharRangePart; 
    @Part  | part:CharRangePart 
    @Id    | id:Identifier;

will generate something like

pub enum CharRulePart {
    Range {
        from:CharRangePart,
        to:CharRangePart
    },
    Part {
        part:CharRangePart 
    },
    Id {
        id: Identifier
    },
}

Support stack match

In some languages, something like pest/stack is required.

Used for things like string matching.

If the left side eats r#", then the right side needs to match "#.

If the left side eats r##", then the right side needs to match "##.

More # and so on.

Extension name?

Can you open the discussion, I have some non-issue questions to ask.

I am going to write a highlighting and formatting plugin, and I need to bind a extension, what do you think is suitable?

Precedence climbing

I wonder if there are plans to support precedence climbing like https://docs.rs/peg/latest/peg/#precedence-climbing

I know that peg means never left recursive, but this way of writing does have higher readability.

For traditional peg, this is equivalent to a two-phase parsing

stage-1 attempt to capture

expr = term {infix term}
term = {prefix} atom {postfix}
atom = '(' expr ')' | int | str

stage-2 to reorganization

Vec<atom|prefix|infix|postfix>using extern progress, e.g. the pratt parser.

The second stage can even be dynamically adjusted by the user(like swift/haskell), and static parsing (parser-embedded) is sufficient for most languages.

How to force-include a char?

I need to force-include characters and keywords (e.g. +, -, ...) in my language. Do I just do @:'-' to do that, or is there a better way? (I could define each character as it's own rule, and probably will do so, but is there a way I don't know about?)

'--railroad' doesn't get included in the cli?

cargo install peginator_cli installs a version of the cli that doesn't have --railroad, somehow, even tho the .lock says 0.6.0.

Win|PS> cargo install peginator-cli --force -v
    Updating crates.io index
  Installing peginator-cli v0.6.0
    Updating crates.io index
   Compiling proc-macro2 v1.0.78
   Compiling windows_x86_64_msvc v0.52.0
   Compiling windows_x86_64_msvc v0.48.5
   Compiling unicode-ident v1.0.12
   Compiling utf8parse v0.2.1
   Compiling anstyle v1.0.6
   Compiling colorchoice v1.0.0
   Compiling anyhow v1.0.79
   Compiling lazy_static v1.4.0
   Compiling strsim v0.11.0
   Compiling heck v0.4.1
   Compiling clap_lex v0.7.0
   Compiling peginator_codegen v0.6.0
   Compiling nohash-hasher v0.2.0
   Compiling crc-catalog v2.4.0
     Running `rustc --crate-name build_script_build --edition=2021 C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\proc-macro2-1.0.78\build.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=279 --crate-type bin --emit=dep-info,link -C embed-bitcode=no -C debug-assertions=off --cfg "feature=\"default\"" --cfg "feature=\"proc-macro\"" -C metadata=3ebaa2fef65fb6f2 -C extra-filename=-3ebaa2fef65fb6f2 --out-dir C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\build\proc-macro2-3ebaa2fef65fb6f2 -L dependency=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps --cap-lints allow`
     Running `rustc --crate-name build_script_build --edition=2021 C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\windows_x86_64_msvc-0.52.0\build.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=279 --crate-type bin --emit=dep-info,link -C embed-bitcode=no -C debug-assertions=off -C metadata=c0d855ff3afb1fac -C extra-filename=-c0d855ff3afb1fac --out-dir C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\build\windows_x86_64_msvc-c0d855ff3afb1fac -L dependency=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps --cap-lints allow`
     Running `rustc --crate-name build_script_build --edition=2018 C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\windows_x86_64_msvc-0.48.5\build.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=279 --crate-type bin --emit=dep-info,link -C embed-bitcode=no -C debug-assertions=off -C metadata=ba7ab5c9d2c1dc6a -C extra-filename=-ba7ab5c9d2c1dc6a --out-dir C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\build\windows_x86_64_msvc-ba7ab5c9d2c1dc6a -L dependency=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps --cap-lints allow`
     Running `rustc --crate-name unicode_ident --edition=2018 C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\unicode-ident-1.0.12\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=279 --crate-type lib --emit=dep-info,metadata,link -C embed-bitcode=no -C debug-assertions=off -C metadata=8f4816cee2926e43 -C extra-filename=-8f4816cee2926e43 --out-dir C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps -L dependency=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps --cap-lints allow`
     Running `rustc --crate-name utf8parse --edition=2018 C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\utf8parse-0.2.1\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=279 --crate-type lib --emit=dep-info,metadata,link -C opt-level=3 -C embed-bitcode=no --cfg "feature=\"default\"" -C metadata=34c1a0eefb559efe -C extra-filename=-34c1a0eefb559efe --out-dir C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps -L dependency=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps --cap-lints allow`
     Running `rustc --crate-name anstyle --edition=2021 C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\anstyle-1.0.6\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=279 --crate-type lib --emit=dep-info,metadata,link -C opt-level=3 -C embed-bitcode=no --cfg "feature=\"default\"" --cfg "feature=\"std\"" -C metadata=483d2c35998d083c -C extra-filename=-483d2c35998d083c --out-dir C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps -L dependency=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps --cap-lints allow`
     Running `rustc --crate-name colorchoice --edition=2021 C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\colorchoice-1.0.0\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=279 --crate-type lib --emit=dep-info,metadata,link -C opt-level=3 -C embed-bitcode=no -C metadata=9cf6539c37109099 -C extra-filename=-9cf6539c37109099 --out-dir C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps -L dependency=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps --cap-lints allow`
     Running `rustc --crate-name unicode_ident --edition=2018 C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\unicode-ident-1.0.12\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=279 --crate-type lib --emit=dep-info,metadata,link -C opt-level=3 -C embed-bitcode=no -C metadata=f610fcb8c9f51121 -C extra-filename=-f610fcb8c9f51121 --out-dir C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps -L dependency=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps --cap-lints allow`
     Running `rustc --crate-name build_script_build --edition=2018 C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\anyhow-1.0.79\build.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=279 --crate-type bin --emit=dep-info,link -C embed-bitcode=no -C debug-assertions=off --cfg "feature=\"default\"" --cfg "feature=\"std\"" -C metadata=d7ae6583d17878ad -C extra-filename=-d7ae6583d17878ad --out-dir C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\build\anyhow-d7ae6583d17878ad -L dependency=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps --cap-lints allow`
     Running `rustc --crate-name lazy_static C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\lazy_static-1.4.0\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=279 --crate-type lib --emit=dep-info,metadata,link -C opt-level=3 -C embed-bitcode=no -C metadata=d85d8bd228e1d2a7 -C extra-filename=-d85d8bd228e1d2a7 --out-dir C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps -L dependency=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps --cap-lints allow`
     Running `rustc --crate-name strsim C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\strsim-0.11.0\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=279 --crate-type lib --emit=dep-info,metadata,link -C opt-level=3 -C embed-bitcode=no -C metadata=72364aa46624508f -C extra-filename=-72364aa46624508f --out-dir C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps -L dependency=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps --cap-lints allow`
     Running `rustc --crate-name heck --edition=2018 C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\heck-0.4.1\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=279 --crate-type lib --emit=dep-info,metadata,link -C embed-bitcode=no -C debug-assertions=off --cfg "feature=\"default\"" -C metadata=16606336615117e8 -C extra-filename=-16606336615117e8 --out-dir C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps -L dependency=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps --cap-lints allow`
     Running `rustc --crate-name clap_lex --edition=2021 C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\clap_lex-0.7.0\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=279 --crate-type lib --emit=dep-info,metadata,link -C opt-level=3 -C embed-bitcode=no -C metadata=063afa6788a3f8cb -C extra-filename=-063afa6788a3f8cb --out-dir C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps -L dependency=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps --cap-lints allow`
     Running `rustc --crate-name build_script_build --edition=2021 C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\peginator_codegen-0.6.0\build.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=279 --crate-type bin --emit=dep-info,link -C embed-bitcode=no -C debug-assertions=off -C metadata=afdcbc9276377e83 -C extra-filename=-afdcbc9276377e83 --out-dir C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\build\peginator_codegen-afdcbc9276377e83 -L dependency=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps --cap-lints allow`
     Running `rustc --crate-name nohash_hasher --edition=2018 C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\nohash-hasher-0.2.0\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=279 --crate-type lib --emit=dep-info,metadata,link -C opt-level=3 -C embed-bitcode=no --cfg "feature=\"default\"" --cfg "feature=\"std\"" -C metadata=b63b2e0e4705cb62 -C extra-filename=-b63b2e0e4705cb62 --out-dir C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps -L dependency=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps --cap-lints allow`
     Running `rustc --crate-name crc_catalog --edition=2018 C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\crc-catalog-2.4.0\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=279 --crate-type lib --emit=dep-info,metadata,link -C opt-level=3 -C embed-bitcode=no -C metadata=7f60b098934ecc18 -C extra-filename=-7f60b098934ecc18 --out-dir C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps -L dependency=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps --cap-lints allow`
   Compiling anstyle-parse v0.2.3
   Compiling crc v3.0.1
     Running `rustc --crate-name crc --edition=2018 C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\crc-3.0.1\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=279 --crate-type lib --emit=dep-info,metadata,link -C opt-level=3 -C embed-bitcode=no -C metadata=f9edde7a8ba75d66 -C extra-filename=-f9edde7a8ba75d66 --out-dir C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps -L dependency=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps --extern crc_catalog=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libcrc_catalog-7f60b098934ecc18.rmeta --cap-lints allow`
     Running `rustc --crate-name anstyle_parse --edition=2021 C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\anstyle-parse-0.2.3\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=279 --crate-type lib --emit=dep-info,metadata,link -C opt-level=3 -C embed-bitcode=no --cfg "feature=\"default\"" --cfg "feature=\"utf8\"" -C metadata=70c07834aea22d76 -C extra-filename=-70c07834aea22d76 --out-dir C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps -L dependency=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps --extern utf8parse=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libutf8parse-34c1a0eefb559efe.rmeta --cap-lints allow`
     Running `C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\build\windows_x86_64_msvc-ba7ab5c9d2c1dc6a\build-script-build`
     Running `C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\build\windows_x86_64_msvc-c0d855ff3afb1fac\build-script-build`
     Running `rustc --crate-name windows_x86_64_msvc --edition=2018 C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\windows_x86_64_msvc-0.48.5\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=279 --crate-type lib --emit=dep-info,metadata,link -C opt-level=3 -C embed-bitcode=no -C metadata=329dbc82266ac467 -C extra-filename=-329dbc82266ac467 --out-dir C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps -L dependency=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps --cap-lints allow -L native=C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\windows_x86_64_msvc-0.48.5\lib`
     Running `C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\build\peginator_codegen-afdcbc9276377e83\build-script-build`
     Running `C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\build\proc-macro2-3ebaa2fef65fb6f2\build-script-build`
     Running `C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\build\proc-macro2-3ebaa2fef65fb6f2\build-script-build`
     Running `rustc --crate-name windows_x86_64_msvc --edition=2021 C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\windows_x86_64_msvc-0.52.0\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=279 --crate-type lib --emit=dep-info,metadata,link -C opt-level=3 -C embed-bitcode=no -C metadata=c30a9f2db5e7c5c9 -C extra-filename=-c30a9f2db5e7c5c9 --out-dir C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps -L dependency=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps --cap-lints allow -L native=C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\windows_x86_64_msvc-0.52.0\lib`
   Compiling windows-targets v0.48.5
     Running `rustc --crate-name windows_targets --edition=2018 C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\windows-targets-0.48.5\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=279 --crate-type lib --emit=dep-info,metadata,link -C opt-level=3 -C embed-bitcode=no -C metadata=7a226fbd6adea308 -C extra-filename=-7a226fbd6adea308 --out-dir C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps -L dependency=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps --extern windows_x86_64_msvc=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libwindows_x86_64_msvc-329dbc82266ac467.rmeta --cap-lints allow -L native=C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\windows_x86_64_msvc-0.48.5\lib`
   Compiling windows-targets v0.52.0
     Running `rustc --crate-name windows_targets --edition=2021 C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\windows-targets-0.52.0\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=279 --crate-type lib --emit=dep-info,metadata,link -C opt-level=3 -C embed-bitcode=no -C metadata=689f0c355e02f5fa -C extra-filename=-689f0c355e02f5fa --out-dir C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps -L dependency=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps --extern windows_x86_64_msvc=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libwindows_x86_64_msvc-c30a9f2db5e7c5c9.rmeta --cap-lints allow -L native=C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\windows_x86_64_msvc-0.52.0\lib`
   Compiling windows-sys v0.48.0
     Running `rustc --crate-name windows_sys --edition=2018 C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\windows-sys-0.48.0\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=279 --crate-type lib --emit=dep-info,metadata,link -C opt-level=3 -C embed-bitcode=no --cfg "feature=\"Win32\"" --cfg "feature=\"Win32_Foundation\"" --cfg "feature=\"Win32_System\"" --cfg "feature=\"Win32_System_Console\"" --cfg "feature=\"default\"" -C metadata=4d941b30bc3bbdb2 -C extra-filename=-4d941b30bc3bbdb2 --out-dir C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps -L dependency=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps --extern windows_targets=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libwindows_targets-7a226fbd6adea308.rmeta --cap-lints allow -L native=C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\windows_x86_64_msvc-0.48.5\lib`
     Running `C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\build\anyhow-d7ae6583d17878ad\build-script-build`
   Compiling windows-sys v0.52.0
     Running `rustc --crate-name windows_sys --edition=2021 C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\windows-sys-0.52.0\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=279 --crate-type lib --emit=dep-info,metadata,link -C opt-level=3 -C embed-bitcode=no --cfg "feature=\"Win32\"" --cfg "feature=\"Win32_Foundation\"" --cfg "feature=\"Win32_System\"" --cfg "feature=\"Win32_System_Console\"" --cfg "feature=\"default\"" -C metadata=08a978065374b929 -C extra-filename=-08a978065374b929 --out-dir C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps -L dependency=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps --extern windows_targets=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libwindows_targets-689f0c355e02f5fa.rmeta --cap-lints allow -L native=C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\windows_x86_64_msvc-0.52.0\lib`
     Running `rustc --crate-name proc_macro2 --edition=2021 C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\proc-macro2-1.0.78\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=279 --crate-type lib --emit=dep-info,metadata,link -C opt-level=3 -C embed-bitcode=no --cfg "feature=\"default\"" --cfg "feature=\"proc-macro\"" -C metadata=26d314d20bb5b42b -C extra-filename=-26d314d20bb5b42b --out-dir C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps -L dependency=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps --extern unicode_ident=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libunicode_ident-f610fcb8c9f51121.rmeta --cap-lints allow --cfg wrap_proc_macro`
     Running `rustc --crate-name proc_macro2 --edition=2021 C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\proc-macro2-1.0.78\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=279 --crate-type lib --emit=dep-info,metadata,link -C embed-bitcode=no -C debug-assertions=off --cfg "feature=\"default\"" --cfg "feature=\"proc-macro\"" -C metadata=a533a3aae3770938 -C extra-filename=-a533a3aae3770938 --out-dir C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps -L dependency=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps --extern unicode_ident=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libunicode_ident-8f4816cee2926e43.rmeta --cap-lints allow --cfg wrap_proc_macro`
     Running `rustc --crate-name anyhow --edition=2018 C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\anyhow-1.0.79\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=279 --crate-type lib --emit=dep-info,metadata,link -C opt-level=3 -C embed-bitcode=no --cfg "feature=\"default\"" --cfg "feature=\"std\"" -C metadata=8ad1f341ff3c6a44 -C extra-filename=-8ad1f341ff3c6a44 --out-dir C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps -L dependency=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps --cap-lints allow --cfg std_backtrace`
   Compiling quote v1.0.35
     Running `rustc --crate-name quote --edition=2018 C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\quote-1.0.35\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=279 --crate-type lib --emit=dep-info,metadata,link -C embed-bitcode=no -C debug-assertions=off --cfg "feature=\"default\"" --cfg "feature=\"proc-macro\"" -C metadata=63abacd430c8d516 -C extra-filename=-63abacd430c8d516 --out-dir C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps -L dependency=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps --extern proc_macro2=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libproc_macro2-a533a3aae3770938.rmeta --cap-lints allow`
     Running `rustc --crate-name quote --edition=2018 C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\quote-1.0.35\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=279 --crate-type lib --emit=dep-info,metadata,link -C opt-level=3 -C embed-bitcode=no --cfg "feature=\"default\"" --cfg "feature=\"proc-macro\"" -C metadata=4c4d233b09e57a8a -C extra-filename=-4c4d233b09e57a8a --out-dir C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps -L dependency=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps --extern proc_macro2=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libproc_macro2-26d314d20bb5b42b.rmeta --cap-lints allow`
   Compiling syn v2.0.48
     Running `rustc --crate-name syn --edition=2021 C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\syn-2.0.48\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=279 --crate-type lib --emit=dep-info,metadata,link -C embed-bitcode=no -C debug-assertions=off --cfg "feature=\"clone-impls\"" --cfg "feature=\"default\"" --cfg "feature=\"derive\"" --cfg "feature=\"full\"" --cfg "feature=\"parsing\"" --cfg "feature=\"printing\"" --cfg "feature=\"proc-macro\"" --cfg "feature=\"quote\"" -C metadata=7917983e38f0b6b0 -C extra-filename=-7917983e38f0b6b0 --out-dir C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps -L dependency=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps --extern proc_macro2=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libproc_macro2-a533a3aae3770938.rmeta --extern quote=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libquote-63abacd430c8d516.rmeta --extern unicode_ident=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libunicode_ident-8f4816cee2926e43.rmeta --cap-lints allow`
   Compiling colored v2.1.0
     Running `rustc --crate-name colored --edition=2021 C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\colored-2.1.0\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=279 --crate-type lib --emit=dep-info,metadata,link -C opt-level=3 -C embed-bitcode=no -C metadata=ad2dddf83bab9287 -C extra-filename=-ad2dddf83bab9287 --out-dir C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps -L dependency=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps --extern lazy_static=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\liblazy_static-d85d8bd228e1d2a7.rmeta --extern windows_sys=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libwindows_sys-4d941b30bc3bbdb2.rmeta --cap-lints allow -L native=C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\windows_x86_64_msvc-0.48.5\lib`
   Compiling anstyle-query v1.0.2
   Compiling anstyle-wincon v3.0.2
     Running `rustc --crate-name anstyle_query --edition=2021 C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\anstyle-query-1.0.2\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=279 --crate-type lib --emit=dep-info,metadata,link -C opt-level=3 -C embed-bitcode=no -C metadata=b5e1eaca2f49da81 -C extra-filename=-b5e1eaca2f49da81 --out-dir C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps -L dependency=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps --extern windows_sys=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libwindows_sys-08a978065374b929.rmeta --cap-lints allow -L native=C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\windows_x86_64_msvc-0.52.0\lib`
     Running `rustc --crate-name anstyle_wincon --edition=2021 C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\anstyle-wincon-3.0.2\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=279 --crate-type lib --emit=dep-info,metadata,link -C opt-level=3 -C embed-bitcode=no -C metadata=0894472cecace596 -C extra-filename=-0894472cecace596 --out-dir C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps -L dependency=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps --extern anstyle=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libanstyle-483d2c35998d083c.rmeta --extern windows_sys=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libwindows_sys-08a978065374b929.rmeta --cap-lints allow -L native=C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\windows_x86_64_msvc-0.52.0\lib`
   Compiling peginator v0.6.0
     Running `rustc --crate-name peginator --edition=2021 C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\peginator-0.6.0\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=279 --crate-type lib --emit=dep-info,metadata,link -C opt-level=3 -C embed-bitcode=no --cfg "feature=\"colored\"" --cfg "feature=\"default\"" -C metadata=0caac08f08faf405 -C extra-filename=-0caac08f08faf405 --out-dir C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps -L dependency=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps --extern colored=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libcolored-ad2dddf83bab9287.rmeta --extern nohash_hasher=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libnohash_hasher-b63b2e0e4705cb62.rmeta --cap-lints allow -L native=C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\windows_x86_64_msvc-0.48.5\lib`
   Compiling anstream v0.6.11
     Running `rustc --crate-name anstream --edition=2021 C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\anstream-0.6.11\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=279 --crate-type lib --emit=dep-info,metadata,link -C opt-level=3 -C embed-bitcode=no --cfg "feature=\"auto\"" --cfg "feature=\"default\"" --cfg "feature=\"wincon\"" -C metadata=c6bac3934c839d15 -C extra-filename=-c6bac3934c839d15 --out-dir C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps -L dependency=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps --extern anstyle=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libanstyle-483d2c35998d083c.rmeta --extern anstyle_parse=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libanstyle_parse-70c07834aea22d76.rmeta --extern anstyle_query=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libanstyle_query-b5e1eaca2f49da81.rmeta --extern anstyle_wincon=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libanstyle_wincon-0894472cecace596.rmeta --extern colorchoice=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libcolorchoice-9cf6539c37109099.rmeta --extern utf8parse=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libutf8parse-34c1a0eefb559efe.rmeta --cap-lints allow -L native=C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\windows_x86_64_msvc-0.52.0\lib`
     Running `rustc --crate-name peginator_codegen --edition=2021 C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\peginator_codegen-0.6.0\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=279 --crate-type lib --emit=dep-info,metadata,link -C opt-level=3 -C embed-bitcode=no -C metadata=9099b82bed6a539d -C extra-filename=-9099b82bed6a539d --out-dir C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps -L dependency=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps --extern anyhow=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libanyhow-8ad1f341ff3c6a44.rmeta --extern colored=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libcolored-ad2dddf83bab9287.rmeta --extern crc=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libcrc-f9edde7a8ba75d66.rmeta --extern peginator=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libpeginator-0caac08f08faf405.rmeta --extern proc_macro2=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libproc_macro2-26d314d20bb5b42b.rmeta --extern quote=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libquote-4c4d233b09e57a8a.rmeta --cap-lints allow -L native=C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\windows_x86_64_msvc-0.48.5\lib`
   Compiling clap_builder v4.5.0
     Running `rustc --crate-name clap_builder --edition=2021 C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\clap_builder-4.5.0\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=279 --crate-type lib --emit=dep-info,metadata,link -C opt-level=3 -C embed-bitcode=no --cfg "feature=\"color\"" --cfg "feature=\"error-context\"" --cfg "feature=\"help\"" --cfg "feature=\"std\"" --cfg "feature=\"suggestions\"" --cfg "feature=\"usage\"" -C metadata=97d0c68bb526ec38 -C extra-filename=-97d0c68bb526ec38 --out-dir C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps -L dependency=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps --extern anstream=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libanstream-c6bac3934c839d15.rmeta --extern anstyle=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libanstyle-483d2c35998d083c.rmeta --extern clap_lex=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libclap_lex-063afa6788a3f8cb.rmeta --extern strsim=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libstrsim-72364aa46624508f.rmeta --cap-lints allow -L native=C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\windows_x86_64_msvc-0.52.0\lib`
   Compiling clap_derive v4.5.0
     Running `rustc --crate-name clap_derive --edition=2021 C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\clap_derive-4.5.0\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=279 --crate-type proc-macro --emit=dep-info,link -C prefer-dynamic -C embed-bitcode=no -C debug-assertions=off --cfg "feature=\"default\"" -C metadata=2f5c544c8fa61e08 -C extra-filename=-2f5c544c8fa61e08 --out-dir C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps -L dependency=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps --extern heck=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libheck-16606336615117e8.rlib --extern proc_macro2=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libproc_macro2-a533a3aae3770938.rlib --extern quote=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libquote-63abacd430c8d516.rlib --extern syn=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libsyn-7917983e38f0b6b0.rlib --extern proc_macro --cap-lints allow`
   Compiling clap v4.5.0
     Running `rustc --crate-name clap --edition=2021 C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\clap-4.5.0\src\lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=279 --crate-type lib --emit=dep-info,metadata,link -C opt-level=3 -C embed-bitcode=no --cfg "feature=\"color\"" --cfg "feature=\"default\"" --cfg "feature=\"derive\"" --cfg "feature=\"error-context\"" --cfg "feature=\"help\"" --cfg "feature=\"std\"" --cfg "feature=\"suggestions\"" --cfg "feature=\"usage\"" -C metadata=94cfc3645300b6f1 -C extra-filename=-94cfc3645300b6f1 --out-dir C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps -L dependency=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps --extern clap_builder=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libclap_builder-97d0c68bb526ec38.rmeta --extern clap_derive=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\clap_derive-2f5c544c8fa61e08.dll --cap-lints allow -L native=C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\windows_x86_64_msvc-0.52.0\lib`
   Compiling peginator-cli v0.6.0
     Running `rustc --crate-name peginator_cli --edition=2021 C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\peginator-cli-0.6.0\src\main.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=279 --crate-type bin --emit=dep-info,link -C opt-level=3 -C embed-bitcode=no -C metadata=e0c6dc4716e4c785 -C extra-filename=-e0c6dc4716e4c785 --out-dir C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps -L dependency=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps --extern anyhow=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libanyhow-8ad1f341ff3c6a44.rlib --extern clap=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libclap-94cfc3645300b6f1.rlib --extern colored=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libcolored-ad2dddf83bab9287.rlib --extern peginator=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libpeginator-0caac08f08faf405.rlib --extern peginator_codegen=C:\Users\OLIVER~1.SMI\AppData\Local\Temp\cargo-installXxx982\release\deps\libpeginator_codegen-9099b82bed6a539d.rlib --cap-lints allow -L native=C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\windows_x86_64_msvc-0.52.0\lib -L native=C:\Users\oliver.smith\.cargo\registry\src\index.crates.io-6f17d22bba15001f\windows_x86_64_msvc-0.48.5\lib`
    Finished release [optimized] target(s) in 20.39s
   Replacing C:\Users\oliver.smith\.cargo\bin\peginator-cli.exe
    Replaced package `peginator-cli v0.6.0` with `peginator-cli v0.6.0` (executable `peginator-cli.exe`)

peginator-cli.exe -V
peginator-cli 0.6.0

peginator-cli.exe --help
Command line interface for peginator (a PEG parser generator)

Usage: peginator-cli.exe [OPTIONS] <GRAMMAR_FILE>

Arguments:
  <GRAMMAR_FILE>

Options:
  -a, --ast-only           Print the parsed AST and exit
  -t, --trace              Trace rule matching
  -d, --derives <DERIVES>  Use a custom set of derives for the generated types
  -h, --help               Print help
  -V, --version            Print version

Automatic rule inlining and type deduction

This proposal introduces the automatic rule inlining (where productions are inlined given certain conditions) and rules are type-deduced given another set of conditions. In particular, I think a singular condition (or if we want this to have multiple conditions later, a basic set of them) should be good to start with.

My proposal is that:

  1. Automatic rule inline occurs if a rule evaluates to a single item (e.g.: a rule that only has an expression on the right-hand side and nothing else). For example, if you have a rule DefaultExpression = expr:Expression;, the generator should automatically inline this rule, since creating a new node for this would be pointless and would just waste LoC and memory. Automatic inlining would still not occur if this rule was extended in the future.
  2. Rule type deduction should occure if the referenced rule is a rule that has no captures. In my grammar, I see this usually in optionals, and in that context the rule should be eliminated and replaced with the capture (which would just be a boolean). For example:
       RequeueStatement = Requeue name:Name [require_abort:RequeueAbortRequirement] ";";
    RequeueAbortRequirement = With Abort;
    
    In this example, RequeueAbortRequirement resolves to nothing (With and Abort are dropped), so again creating a separate struct for this would be pointless. Instead, require_abort should just be a boolean (was With and Abort found or not) in the generated struct.

Thoughts?

Confusing error message in case of a syntax error

I'm very confused. The peginator-cli binary is giving me this error:

Error: expected end of input
--> ada.peg:6801:1
 |  
 |  
 |  ^

But my grammar certainly isn't done on this line (the number of lines are primarily because I generated the unicode character classes that I needed to match.... Probably not the "best" way I could do it, but it (should) work.) Anyway, it's getting stuck on this:

@string
@check(crate::checks::check_identifier)
Identifier =
IdentifierStart {IdentifierStart | IdentifierExtend} !(Abort | Abs | Abstract | Accept | Access | Aliased | All | And | Array | At | Begin | Body | Case | Constant | Declare | Delay | Delta | Digits | Do | Else | Elsif | End | Entry | Exception | Exit | For | Function | Generic | Goto | If | In | Interface | Is | Limited | Loop | Mod | New | Not | Null | Of | Or | Others | Out | Overriding | Package | Parallel | Pragma | Private | Procedure | Protected | Raise | Range | Record | Rem | Renames | Requeue | Return | Reverse | Select | Separate | Some | Subtype | Synchronized | Tagged | Task | Terminate | Then | Type | Until | Use | When | While | With | Xor);

@char
IdentifierStart =UppercaseLetter
| LowercaseLetter
| TitlecaseLetter
| ModifierLetter
| OtherLetter
| LetterNumber;

@char
IdentifierExtend =NonspacingMark
| SpacingMark
| DecimalNumber
| ConnectorPunctuation;

NumericLiteral = @:DecimalLiteral | @:BasedLiteral;
# Dies where this comment is
@skip_no_ws
@check(crate::checks::check_decimal_literal)
DecimalLiteral = integer_part:Numeral ["." fractional_part:Numeral] [exponent:Exponent];

@string
@skip_no_ws
Numeral = Digit {["_"] Digit};

@string
@skip_no_ws
Exponent = i'E' [Add] Numeral | i'E' Subtract Numeral;

@char
Digit = '0' .. '9';

@check(crate::checks::check_based_literal)
BasedLiteral =
base:Base "#" integer_part:BasedNumeral ["." fractional_part:BasedNumeral] "#" [exponent:Exponent];

@string
@skip_no_ws
Base = Numeral;

@string
@skip_no_ws
BasedNumeral =
ExtendedDigit {["_"] ExtendedDigit};

@char
ExtendedDigit = Digit | i'A' .. i'F';

At a glance I can't see any kind of syntax error, so I'm quite confused. Does order of the rules matter? (I hope not...)

Support inline rule

What is an inline rule

The inline rule is a phantom node.

If a node is too long or appears multiple times, the inline rule can be extracted.

For example:

Suppose the syntax ~rule is used.

assign_statement ::= 
    | LET "(" ~assign_name ")" type_hint? SET assign_rhs eos?
    | LET "(" ~assign_name ")" type_hint? eos?
    | LET ~assign_name SET assign_rhs eos?
    | LET ~assign_name eos

assign_name ::= pair:assign_pair (Comma pair:assign_pair)* Comma?
assign_pair ::= MODIFIERS* Symbol type_hint?
assign_rhs ::= if_statement|match_statement|expr
LET ::=  "let"
SET ::=  "="

Equivalent to

assign_statement ::= 
    | LET "(" pair:assign_pair (Comma pair:assign_pair)* Comma? ")" type_hint? SET assign_rhs eos?
    | LET "(" pair:assign_pair (Comma pair:assign_pair)* Comma? ")" type_hint? eos?
    | LET pair:assign_pair (Comma pair:assign_pair)* Comma? SET assign_rhs eos?
    | LET pair:assign_pair (Comma pair:assign_pair)* Comma? eos
// Ideally assign_name should be cleaned up by dead code elimination

Dead code elimination

Now that > was implemented, there will be rules that are unused by any externally available parsing functions. The parsers and types for these should not be emitted, as they only cause confusion.

How to make indentation?

So how to make indentation that will track when it's INDENT and DEDENT and can use it easily with the grammar?

Cannot add @position to external rules

peg side

@position
@extern(crate::utils::unicode_whitespace)
UnicodeSpace;

rust side

pub fn unicode_whitespace(input: &str) -> Result<(&str, usize), &'static str> {
    let mut length = 0;
    for char in input.chars() {
        if char.is_whitespace() { length += char.len_utf8() } else { break }
    }
    if length == 0 { Err("Not unicode whitespace") } else { Ok((&input[0..length], length)) }
}

except:

start offset + length offset

actual:

Caused by:
  process didn't exit successfully: `target\debug\build\saha-parser-579f728ace3fbfac\build-script-build` (exit code: 101)
  --- stderr
  thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: expected character from character class IdentifierChar
  --> src/parser.peg:54:1
   |
   |  @position
   |  ^
  ', projects\saha-parser\build.rs:7:77
  note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

Generalized position

How about support @position for all rule?


The current string char and enum cannot mark positions.

For enum, just call position directly on all variants, the rust compiler will prompt which variants do not mark the position and report an error.

For string/char, position is also necessary, I want to report which escaped char fails and which identifier is undefined with position.

The hacking I am currently using is

@position
Identifier = identifier:IDENTIFIER;

@string
@no_skip_ws
IDENTIFIER = (XID_START | '_') {XID_CONTINUE};

But I think I can generate the Identifier directly

@position
@string
@no_skip_ws
Identifier  = (XID_START | '_') {XID_CONTINUE};

Leads to

pub struct Identifier {
    pub string: String,
    pub position: Range<usize>
}

Add case insensitive string literals

#3 implies that there is a need for case-insensitive string matching (for keywords, probably).

There should probably be an easy, but intuitive syntax to do it (e.g. i"whatever"). I'll look into how other PEG parsers mark it.

Bug: non-overridden choice in all-choices rule creates struct and not enum

Idk if this is a bug or I'm doing something wrong, but it definitely looks like a bug. When I do the following:

@leftrec
Name = @:DirectName | @:ExplicitDereference
| @:IndexedComponent | @:Slice
| @:SelectedComponent | AttributeReference:*AttributeReference
| @:TypeConversion | @:FunctionCall
| @:CharacterLiteral | @:QualifiedExpression
| @:GeneralizedReference | @:GeneralizedIndexing
| @:TargetName;

The resulting parser generates the wrong code:

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Name {
    pub _override: Option<Name__override>,
    pub AttributeReference: Option<Box<AttributeReference>>,
}
#[allow(non_camel_case_types)]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Name__override {
    CharacterLiteral(CharacterLiteral),
    DirectName(DirectName),
    ExplicitDereference(ExplicitDereference),
    FunctionCall(FunctionCall),
    GeneralizedIndexing(GeneralizedIndexing),
    GeneralizedReference(GeneralizedReference),
    IndexedComponent(IndexedComponent),
    QualifiedExpression(QualifiedExpression),
    SelectedComponent(SelectedComponent),
    Slice(Slice),
    TargetName(TargetName),
    TypeConversion(TypeConversion),
}

I think that, in general, an all-choices rule should always generate an enum -- it should never generate a struct, since that creates error-prone code.

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.