Comments (3)
Great suggestion; I wonder if (since in Superpower we've tried to create more composable building blocks), this could be something like:
p.Catch(e => "some message")
And maybe a generic one that restricts on the Exception
type, if we can figure out how to make that sane to call, in the presence of other generic arguments required for parser?
It's also strange that Catch()
wouldn't, in some sense, succeed and produce some default value 🤔 ... not sure if there is a better name for it, and/or whether there's some additional/similar parser that could be added for the catch -> default case?
from superpower.
p.Catch(e => "some message")
Yes, that would actually be a good way to express it, as that would work in the 'for' part of a LINQ expression too.
I don't know if that's sufficient - since the issue I have is where some of the semantic checks are done in the constructor code of node ypes in my AST. This makes sense in cases where the same check would apply when manually constructing the AST. As these constructors raise exceptions they will be raised in the "select" part of the LINQ query when I construct the AST.
It's also strange that Catch() wouldn't, in some sense, succeed and produce some default value 🤔
You mean that parsing would continue after the catch, a "default" is returned and no message is produced?
from superpower.
Something like this?
/// <summary>
/// Attempts the parser and invokes the exception handler if the parser throws TException.
/// </summary>
/// <typeparam name="TKind">The type of tokens consumed by the parser.</typeparam>
/// <typeparam name="T">The type of the result.</typeparam>
/// <typeparam name="TException">The type of exception caught and handled by <see cref="Catch{TKind, T, TException}(TokenListParser{TKind, T}, Func{TException, TokenListParserResult{TKind, T}})"/></typeparam>
/// <param name="parser">The parser.</param>
/// <param name="exceptionHandler">A function that handles TException and returns a <see cref="TokenListParserResult{TKind, T}"/>.</param>
/// <returns>A parser that calls the first parser and handles TException by calling the exception handler.</returns>
/// <exception cref="ArgumentNullException">Thrown if either the parser or the exceptionHandler is null.</exception>
public static TokenListParser<TKind, T> Catch<TKind, T, TException>(
this TokenListParser<TKind, T> parser,
Func<TException, TokenListParserResult<TKind, T>> exceptionHandler)
where TException : Exception
{
if (parser == null) throw new ArgumentNullException(nameof(parser));
if (exceptionHandler == null) throw new ArgumentNullException(nameof(exceptionHandler));
return input =>
{
try
{
return parser(input);
}
catch (TException ex)
{
return exceptionHandler(ex);
}
};
}
from superpower.
Related Issues (20)
- Zero allocation parsing? HOT 1
- Unit Testing? HOT 1
- Is it normal that NaturalUInt32 raise System.OverflowException : Value was either too large or too small for a UInt32 ? HOT 2
- [Request] Need a new introductory blog for v2 (or v3) HOT 1
- Questions: My On Going Questions HOT 4
- Parsing confusion: Zero-width parsers, what rewinds and when, and properly returning a "failed" parse? HOT 4
- [Question] New Release? HOT 1
- Thank you for writing superpower HOT 1
- Better `Message` HOT 5
- Improve error reporting for some failed match scenarios HOT 9
- Using backslash in CStyle QuotedString causes syntax error HOT 1
- `OptionalOrNull()` HOT 2
- Send parser value into another parser HOT 1
- Tokenizer and Parser Assistance HOT 3
- TokenizerBuilder and Mapping CLR Types HOT 2
- Dynamically referencing Parsers via Decorators for TokenizerBuilder HOT 2
- Some way to check the next token HOT 3
- Missing: Cheat sheet for upgrading from Sprache to Superpower HOT 1
- How to handle consecutive delimiters HOT 6
- dotnet 8 upgrade? HOT 5
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 superpower.