-
-
Notifications
You must be signed in to change notification settings - Fork 1
Cache per-decision look-1 to skip non-viable speculative paths #5
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
Changes from 12 commits
fa4beaf
120bfbf
b3de2e9
99883bb
d19b5ab
942a47e
d3b6404
59e5ea1
cc4573b
b048756
3afb7f7
dd52634
7d35bf0
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,86 @@ | ||
| # Development notes | ||
|
|
||
| ## Kotlin parser parity perf benchmark | ||
|
|
||
| Reproduces the timings tracked in GitHub issue #4 against the Kotlin grammar from `antlr/grammars-v4`. | ||
|
|
||
| ### One-time setup (fresh checkout) | ||
|
|
||
| ```bash | ||
| # 1. ANTLR jar (any path; pin v4.13.2) | ||
| mkdir -p /tmp/antlr-cleanroom/tools | ||
| curl -fLo /tmp/antlr-cleanroom/tools/antlr-4.13.2-complete.jar \ | ||
| https://www.antlr.org/download/antlr-4.13.2-complete.jar | ||
|
|
||
| # 2. grammars-v4 checkout (sparse, just the kotlin grammar) | ||
| mkdir -p /tmp/antlr-cleanroom/grammars-v4 | ||
| git -C /tmp/antlr-cleanroom/grammars-v4 init -q | ||
| git -C /tmp/antlr-cleanroom/grammars-v4 remote add origin https://github.com/antlr/grammars-v4.git | ||
| git -C /tmp/antlr-cleanroom/grammars-v4 sparse-checkout init --cone | ||
| git -C /tmp/antlr-cleanroom/grammars-v4 sparse-checkout set kotlin/kotlin | ||
| git -C /tmp/antlr-cleanroom/grammars-v4 fetch --depth 1 origin 284602b3f23ca54dc30778204ab7ae9e969145e9 | ||
| git -C /tmp/antlr-cleanroom/grammars-v4 checkout FETCH_HEAD | ||
| ``` | ||
|
|
||
| ### Run the parity smoke + dumper build | ||
|
|
||
| ```bash | ||
| tests/kotlin-parity/run.sh \ | ||
| --antlr-jar /tmp/antlr-cleanroom/tools/antlr-4.13.2-complete.jar \ | ||
| --grammars-v4 /tmp/antlr-cleanroom/grammars-v4 | ||
| ``` | ||
|
|
||
| That regenerates the Rust parser from the Kotlin grammar `.interp`, builds `tests/kotlin-parity/dumper`, and asserts the parse trees match `antlr4-python3-runtime` byte-for-byte. | ||
|
|
||
| ### Measure parse-only timings | ||
|
|
||
| The dumper has a built-in parse-only stopwatch so process startup (~10 ms) is excluded: | ||
|
|
||
| ```bash | ||
| DUMPER=tests/kotlin-parity/dumper/target/release/kotlin-parity-dumper | ||
| for snippet in tests/kotlin-parity/snippets/*.kt; do | ||
| echo "=== $(basename "$snippet") ===" | ||
| "$DUMPER" --input "$snippet" --output /tmp/dump.txt --iters 5 --time | ||
| done | ||
| ``` | ||
|
|
||
| `--iters N` repeats parse N times within one process; `--time` prints `min`/`avg` to stderr. CI baseline numbers from issue #4: Python `antlr4-python3-runtime` parse-only ≈ 0.9–14.9 ms (`01-nested-types.kt`) and 226–317 ms (`02-dataframe.kt`). | ||
|
|
||
| ## ANTLR runtime testsuite (357 cases) | ||
|
|
||
| Validates the Rust runtime against ANTLR's upstream conformance descriptors. | ||
|
|
||
| ### One-time setup | ||
|
|
||
| ```bash | ||
| git clone --depth 1 https://github.com/antlr/antlr4 /tmp/antlr-cleanroom/antlr4-upstream | ||
| ``` | ||
|
|
||
| The harness reads `antlr4-upstream/runtime-testsuite` and the same ANTLR jar fetched above. | ||
|
|
||
| ### Run the full sweep | ||
|
|
||
| ```bash | ||
| cargo run --release --quiet --bin antlr4-runtime-testsuite | ||
| ``` | ||
|
|
||
| Defaults to `ANTLR4_JAR=/tmp/antlr-cleanroom/tools/antlr-4.13.2-complete.jar` and `ANTLR4_RUNTIME_TESTSUITE=/tmp/antlr-cleanroom/antlr4-upstream/runtime-testsuite`. Override with `--antlr-jar`/`--descriptors` or env vars. Expected outcome: `summary: 357 passed, 0 failed, 0 skipped, 357 run`. Wall-clock ≈ 10–15 minutes on Apple Silicon, ≈ 30 minutes on the GitHub Linux runner. | ||
|
|
||
| ### Run a subset while iterating | ||
|
|
||
| ```bash | ||
| # One descriptor: | ||
| cargo run --release --quiet --bin antlr4-runtime-testsuite -- --case LexerExec/KeywordID | ||
|
|
||
| # One group (e.g. while debugging left-recursion): | ||
| cargo run --release --quiet --bin antlr4-runtime-testsuite -- --group LeftRecursion --limit 20 | ||
|
|
||
| # Keep the per-case temp crates for inspection: | ||
| cargo run --release --quiet --bin antlr4-runtime-testsuite -- --case ParserErrors/SingleSetInsertion --keep | ||
| ``` | ||
|
|
||
| Per-case scratch crates land under `target/antlr-runtime-testsuite/<case>/`. Stale dirs from a killed run can fail a re-run with `Os { code: 66, ... DirectoryNotEmpty }` — `rm -rf target/antlr-runtime-testsuite/*` to recover. | ||
|
|
||
| ## CI parity | ||
|
|
||
| CI runs `cargo clippy --locked --all-targets --all-features -- -D warnings`, so reproduce locally with the same flags before pushing — `clippy::excessive-nesting`, `clippy::disallowed_types`, and similar nursery/pedantic lints all promote to errors there. |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,16 +1,26 @@ | ||
| [package] | ||
| name = "antlr-rust-runtime" | ||
| version = "0.2.0" | ||
| version = "0.3.0" | ||
| edition = "2024" | ||
| rust-version = "1.95" | ||
| description = "Clean-room Rust runtime and target support for ANTLR v4 generated parsers" | ||
| description = "High performance Rust runtime and target support for ANTLR v4 generated parsers" | ||
| repository = "https://github.com/ophidiarium/antlr-rust-runtime" | ||
| homepage = "https://github.com/ophidiarium/antlr-rust-runtime" | ||
| documentation = "https://docs.rs/antlr-rust-runtime" | ||
| readme = "README.md" | ||
| license = "BSD-3-Clause" | ||
| keywords = ["antlr", "antlr4", "parser", "lexer", "runtime"] | ||
| categories = ["parser-implementations", "development-tools"] | ||
| keywords = [ | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
This manifest now declares 9 Useful? React with 👍 / 👎. |
||
| "antlr", | ||
| "antlr4", | ||
| "parser", | ||
| "lexer", | ||
| "runtime", | ||
| "antlr4-runtime", | ||
| "parser-generator", | ||
| "parser-combinator", | ||
| "antlr4rust", | ||
| ] | ||
|
greptile-apps[bot] marked this conversation as resolved.
Outdated
|
||
| categories = ["parser-implementations", "development-tools", "parsing"] | ||
|
|
||
| [lib] | ||
| name = "antlr4_runtime" | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This change replaces a previously SHA-pinned action with a mutable tag in the publish pipeline, which runs with crates.io publishing privileges. In
.github/workflows/publish.yml, using@v1.0.4(and similarly@v6elsewhere in this commit) allows upstream retags or compromised releases to change executed code without any change in this repository, undermining reproducibility and increasing supply-chain risk for releases. Keep theseuses:entries pinned to full commit SHAs (with version comments) as before.Useful? React with 👍 / 👎.