Comments (4)
Hello!
This pattern is actually even easier to achieve in chumsky with repeated
and foldr
. You can see this in the nano_rust
example or in the tutorial. The basic pattern is as follows:
let sum = expr
.then(just('+').ignore_then(expr).repeated())
.foldl(|(lhs, rhs)| Expr::Add(lhs, rhs));
You can also define it recursively as per your original example, although in practice there's no real need to (iteratively is both faster and won't potentially result in stack overflows):
let sum = recursive(|sum| {
expr.then(just('+').ignore_then(sum))
.map(|(lhs, rhs)| Expr::add(lhs, rhs))
.or(expr)
});
from chumsky.
Closing this in lieu of a response, tell me if it's not solved and I can reopen it.
from chumsky.
Is it possible to not use recursive
for LL or LR grammars? It will blow the stack very easily, for example in the Foo
example I can get a stack overflow with "(".repeat(500)
. I wonder if a tail_recursive
or something like that is possible or make sense.
And sorry if it is off-topic of this issue.
from chumsky.
Yes, it is possible to blow the stack by using recursive patterns in this way. On master
, there is now a spill-stack
feature, enabled by default, that will spill the stack on to the heap if very deep recursion occurs rather than resulting in a stack overflow. I've found that it has almost no impact on performance in practice.
from chumsky.
Related Issues (20)
- `ContainerExactly` impls for `Rc` and `Arc` are unsound HOT 2
- Clone trait bounds not satisfied HOT 2
- Trait bound not satisfied on foldl HOT 2
- Input lifetimes HOT 4
- bug: couldn't build `examples/foo.rs` HOT 1
- Query : Create a parser that parses a vec of patterns HOT 7
- Crashed while parsing markup text HOT 4
- Fix SpannedInput HOT 1
- Trying to run the `nano_rust.rs` example using `chumsky = "1.0.0-alpha.6"` HOT 4
- Question: Using `map_with` to get spans HOT 2
- Question: Writing a Ternary Operator Parser HOT 5
- Can't build example HOT 1
- `/examples/pythonic.rs` is commented out HOT 1
- `/examples/foo.rs` is different from the tutorial HOT 1
- stack overflow HOT 3
- Ability to create warnings HOT 2
- `vars` gets not correctly truncated in example code HOT 1
- error: "unknown feature stdsimd" cause by the dependency of ahash when update rustc to 1.78.0-nightly HOT 2
- Cannot ignore whitespace without changing the width of the span HOT 3
- Cannot use custom span type with Stream HOT 3
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from chumsky.