Giter Club home page Giter Club logo

Comments (3)

nblumhardt avatar nblumhardt commented on July 24, 2024

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.

ewoutkramer avatar ewoutkramer commented on July 24, 2024
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.

marklauter avatar marklauter commented on July 24, 2024

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)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.