emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Handling extensions of programming languages


From: Stefan Monnier
Subject: Re: Handling extensions of programming languages
Date: Sun, 21 Mar 2021 08:39:12 -0400
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (gnu/linux)

>>> Well, I have my doubts that Perl is a good candidate for SMIE, and
>>> trying to use SMIE in CPerl mode would be a major rewrite anyway.  I
>>> guess the Emacs Losp basics (font-lock-add-keyword, hooks) will have to
>>> do the job.
>>
>> I'm pretty sure SMIE would work wonderfully for Perl, but I'm also not
>> sure how it relates to font-lock-add-keywords and hooks, so maybe
>> we're not thinking of the same thing?

FWIW, I'm sure SMIE could be made to work, but I highly doubt it would
"work wonderfully" in the sense that it would likely take a fair bit of
effort to make SMIE indent Perl mode as well as the current indentation
code in `cperl-mode` or in `perl-mode`.

>   class Coffee::Machine extends Lawn::Mower
>   {
>      has $grinder :reader :writer(replace_grinder)
>      method grind { ...; }
>   } 
[...]
>  - add "Dishwasher" and "clean_up" to the imenu index.

That seems to require AI (unless you're talking about a slightly
different example than the one quoted above ;-).

>  - make sure that indentation recognizes that the closing braces end a
>    statement after "class" and "method".  Perl syntax has various cases
>    where it doesn't.  I guess this is the part where SMIE would help.

Actually, the closing brace which also closes a statement is one of the
major pain points in `sm-c-mode`, so it would be one of the parts where
you'd need extra work to make SMIE understand what's going on.

> For the latter two tasks, I need to "hook" the logic somehow into
> CPerl's implementations of `imenu-create-index-function' and the various
> indentation functions.  The current indentation code in CPerl mode
> is... a bit messy, and some old bugs call for attention anyway.

AFAIK font-lock and imenu are easy.  For font-lock there's
`font-lock-add-keywords` and for imenu, you should be able to make it
work fairly well with just `add-function` to
`imenu-create-index-function`.

For indentation, it's fundamentally harder (for the same reason that
combining two LALR grammars doesn't necessarily give you an LALR
grammar), so it will have to be done in a somewhat ad-hoc way.
I suspect that if the base mode uses SMIE, it would make it
significantly easier to add extensions (because the structure of SMIE
imposes constraints that expose the "compositional" aspect of the
grammar, in some sense), but that's not what you have to work with
currently, so you're going to have to dig into the indentation code and
try and figure out how to make it work with your extension(s) and then
how to express the changes "from outside" (e.g. by using hooks,
`add-function`, or `advice-add`; we can of course add hooks
to `cperl-mode.el` or `perl-mode.el` to make that easier).


        Stefan




reply via email to

[Prev in Thread] Current Thread [Next in Thread]