Comments (5)
Ah sorry, I misunderstood. This works now! Undersleeping is not recommended for anyone writing C parsers 😄
from chumsky.
There's a neat trick you can do for ternary operators: imagine that the ?
and the :
are actually just parentheses:
expr ( expr ) expr
As you can see, the inner part (( expr )
) behaves a lot like a regular binary operator (syntax-wise, anyway). So, you can just apply the same reasoning as you would to a binary operator:
let ternary = expr.foldl(
just('?').ignore_then(expr).then_ignore(':').then(expr).repeated(),
|cond, (a, b)| Expr::Ternary(cond, a, b),
);
or, if using the pratt combinator,
atom.pratt((
...
infix(right(_), just('?').ignore_then(expr).then_ignore(':'), |cond, a, b| Expr::Ternary(cond, a, b)),
...
));
from chumsky.
But then how would I define a comma separated value parser -
expr, expr, expr, expr
where the , operator would have lower precedence than the ternary operator? Also how does this method ensure that the precedence of the :? Operators is less than the assignment operators?
from chumsky.
Also using the following -
recursive(|expr| {
// ...
let ternary = expr
.clone()
.foldl_with(
just(Token::Question)
.ignore_then(expr.clone())
.then_ignore(just(Token::Colon))
.then(expr)
.repeated(),
|cond, (a, b), e| {
(
Expr::Ternary(Box::new(cond), Box::new(a), Box::new(b)),
e.span(),
)
},
)
.boxed();
ternary.labelled("expression")
})
Leads to a stack overflow
from chumsky.
But then how would I define a comma separated value parser ... where the , operator would have lower precedence than the ternary operator?
When I say 'think of ?
and :
as parentheses', I don't mean "imagine the overall operator as having the same precedence as parentheses". Both of the code solutions I provided can be slot into a precedence hierarchy anywhere you want.
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
- 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.