unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Stefan Monnier <monnier@iro.umontreal.ca>
To: "Aurélien Aptel" <aurelien.aptel@gmail.com>
Cc: Emacs development discussions <emacs-devel@gnu.org>
Subject: Re: SMIE examples and questions
Date: Thu, 25 Jun 2020 12:54:21 -0400	[thread overview]
Message-ID: <jwvh7uz3xkk.fsf-monnier+emacs@gnu.org> (raw)
In-Reply-To: <CA+5B0FMWFC+z34gi3kJa2RdGN1Tg1Le4w+FjKiQymu2xkf6Few@mail.gmail.com> ("Aurélien Aptel"'s message of "Thu, 25 Jun 2020 11:21:18 +0200")

> Are there *simple* complete examples of SMIE out there? I find the
> manual not that helpful to get started and existing modes look pretty
> complex :(

The only simple and complete ones are for language that are probably
too simple.

Maybe the rnc-mode and dts-mode GNU ELPA packages?  You might also want
to look at my SMIE paper (https://programming-journal.org/2021/5/1/)
which walks through a small part of the rnc-mode SMIE code.

> Is the forward lexer required or is the backward one enough?

Both are needed.

> What are the assumptions of SMIE regarding the lexer?
> - What should it return when there is nothing to read (eg backward and
>   begining of buffer)?

nil, usually.

> - I assume if point is in the middle of a token, it should return
>   the complete current token (including text after point) and place the
>   point at token start?

The caller of the lexer should normally make sure it's never in the
middle of a token.  This doesn't work if you have tokens that can span
multiple lines (e.g. when LF itself is significant, such as the
implicit ; in Javascript).

> - Does point position matter regarding spaces (assuming they have no
>   meaning)?  Is it ok if the lexer places the point sometime after and
>   sometime before them?

It should place point right "after" (in the direction of movement) the
token it has read.

> - Can I safely call it manually without involving SMIE?

Yes.

> - I assume backward and forward lexer should always have the same
>   behaviour, even for spaces?

Yes and no, since one should stop to the left of the spaces and the
other to the right.

> I understand there is no way to dump the AST after parsing, and that
> grammar errors not being reported is a feature.

There's no AST, indeed, and there are no possible errors (IOW errors
can't be detected).

> How am I supposed to debug parsing/indenting?

I mostly use M-C-f and M-C-b for parsing.  For the indentation rules you
can use `M-x smie-edebug`.

> If you have any tips or workflow, like the more practical order to
> implement things, or how to debug that would be greatly appreciated.

Start with the simple cases and then work your way up.

If you want more concrete help, don't hesitate to send me your current
code along with some sample source showing how it should be indented and
the problems you're facing.


        Stefan




  reply	other threads:[~2020-06-25 16:54 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-06-25  9:21 SMIE examples and questions Aurélien Aptel
2020-06-25 16:54 ` Stefan Monnier [this message]
2020-07-31 14:42   ` Aurélien Aptel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=jwvh7uz3xkk.fsf-monnier+emacs@gnu.org \
    --to=monnier@iro.umontreal.ca \
    --cc=aurelien.aptel@gmail.com \
    --cc=emacs-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).