in reply to Re^5: I wrote an expression parser for PPI
in thread I wrote an expression parser for PPI

Yep, PPI worked. Prototypes are half done. The definitions of constants and prototypes are collected and sent in as a parameter to the expression parser.(When e.g. parsing lists, you of course need to know if a sub is declared to use n parameters.)
  • Comment on Re^6: I wrote an expression parser for PPI

Replies are listed 'Best First'.
Re^7: I wrote an expression parser for PPI
by LanX (Saint) on Jan 09, 2026 at 20:59 UTC
    > Yep, PPI worked

    Not sure if you got my point.

    PPI is a static parser, this (should?) mean if it sees at "compile" time something like ...

    • use Try::Tiny;
    • it won't try to search @INC
    • to require the first .../Try/Tiny.pm
    • run Try::Tiny->import()
    • "export" try (&) {...} (among others)
    • with an accurate prototype

    to keep on parsing correctly if it encounters a try {...}

    I haven't tested this, but I bet you will need to patch PPI to handle this.°

    At least if you want to construct a decent Perl dialect and not just some interesting demos.

    I say dialect because it's very hard to achieve full compatibility.

    OTOH once your parser and compiler really work, you can try to transpile it into your target languages to bootstrap a stand-alone dialect which is consistent in all those languages.

    At least in theory...

    Cheers Rolf
    (addicted to the Perl Programming Language :)
    see Wikisyntax for the Monastery

    updates

    °) There is a whole bunch of more things happening at compile-time...

      Sorry, I was unclear. Yes, the use dependencies are loaded and prototypes (like in Try::Tiny) etc are extracted.

      I had a problem with this by the way, and realized why Perl don't cache its byte code. I wanted to do a cache of compiled code, with key from the hash of the file content. But it just seems too fragile. You would need a cache of used files (so they could be loaded) and everything would need a recompile if a file further down in the stack was changed. I put on the todo to compile a program with dependencies to a standalone code file, instead.

      Edit: If you tell me that Try::Tiny works with require, then I am totally wrong. :-) That should only work with use right? (I had to read the code, there was some claim that it was slow so I never Try:ed.)

        > the use dependencies are loaded and prototypes (like in Try::Tiny) etc are extracted.

        By standard PPI or by your project?

        update

        > and realized why Perl don't cache its byte code.

        Do you mean pre-compiling modules before a program starts?

        This wouldn't work in general and IMHO even not add much speed.

        I suppose re-compiling a module with every startup is negligible compared to starting Perl and loading the code from the file-system.

        But I've seen attempts to work with a precompiled bytecode versions of a program/module for compatibility reasons.

        IIRC they have the extension .plc, but I couldn't find the documentation yet.

        Cheers Rolf
        (addicted to the Perl Programming Language :)
        see Wikisyntax for the Monastery