Comments (8)
Ouch, that is a case I failed to consider :(.
An idea, if we add a method on Parser
can_return_empty_ok(&self) -> bool
. This would return true for any parser which could return EmptyOk
. When add_error
is called the sequencing parsers could then check if their first parser can_return_empty_ok
and if its true then they call add_error
on the second parser (and if the second parser can_return_empty_ok
call add_error
on the third parser etc. It's a bit boilerplate-y but It might work.
from combine.
That wouldn't work for parsers that can return both EmptyOk
and EmptyErr
.
from combine.
I like the idea of making parse_lazy
return (ConsumedResult<...>, bool)
, where the errors were deferred (and add_error
needs to be called) iff the boolean is true.
Then, in this case tuple(empty_ok, empty_err).parse_lazy()
would add the second subparser's error immediately, and return false
. tuple(empty_err, empty_err).parse_lazy()
would still be lazy and return true
, requiring add_error
to be called.
from combine.
Rather, parse_lazy
should return the following:
pub enum LazyResult<T, E> {
ConsumedOk(T),
EmptyOk(T),
ConsumedErr(E),
EmptyErr(E, bool),
}
Where EmptyErr(E, true)
indicates that add_error
should be used.
from combine.
That wouldn't work for parsers that can return both EmptyOk and EmptyErr.
Could you give an example how that wont work?
While I believe your idea might work it would be a breaking change which is unfortunate.
from combine.
I mean, it would work, just not in the way that you described.
By default all parsers would have to claim can_return_empty_ok() == true
for safety. Sequencing parsers can only be lazy if their first child claims false
.
Assume a sequencing parser returns EmptyErr. If the sequencing parser's first child says it can return EmptyOk, we have no idea whether it was the first or the second child which caused the error, because either
- the first child returned EmptyErr;
- the first child returned EmptyOk and then the second child EmptyErr.
from combine.
Assume a sequencing parser returns EmptyErr. If the sequencing parser's first child says it can return EmptyOk, we have no idea whether it was the first or the second child which caused the error, because either...
Yep, that's right, it wasn't very thought through idea by me :).
So basically we need some extra state somewhere to say what parser caused the error since parsers returning EmptyOk
means that it is possible for the second (or third, etc) parser in a sequence to cause an EmptyErr
to be returned (breaking my implicit assumption of EmptyErr
only being generated from the first parser). Due to the nature of the library adding this state is definitely going to be breaking regardless of the solution.
from combine.
A fix for this is coming in #105. It turned out to have a lot more edge cases than I initially had thought of but I am pretty sure the approach is sound. Only drawback of it is that it can result in slowdowns in some uses of parsers returning EmptyOk
from combine.
Related Issues (20)
- Publishing 4.6.1? HOT 1
- choice! returns an error when one of its parsers would be successful HOT 2
- Throw stream errors HOT 5
- DateTime parser HOT 1
- take_until_bytes() and partial parsing HOT 2
- Is there a way to get `Stream<Token=char>` from `io::Read`? HOT 1
- Tools for debugging recursion problems? HOT 4
- Some issue with error reporting
- Errors include unprintable or awkwardly printed characters. HOT 6
- `expected` error strings always quote what was expected, even if it isn't a literal HOT 3
- How about offset into some data? HOT 3
- Outdated tutorial HOT 1
- Native/abstracted sub-parsers HOT 6
- XML parsing for React.js to Solid.js conversion HOT 4
- Comparison with LALRPOP
- Unbounded mutual recursion in Parser impl HOT 3
- Adivce on reducing code size in WASM target HOT 7
- Docs unclear whether `parser!` should be used on nightly rust HOT 2
- Parse `std::process::Child` stdout
- Successful parser will not clear the error stack HOT 1
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 combine.