help-gnu-emacs
[Top][All Lists]
Advanced

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

Re: SMIE: defining a build.ninja grammar


From: tomas
Subject: Re: SMIE: defining a build.ninja grammar
Date: Sun, 9 Apr 2023 06:51:50 +0200

On Fri, Apr 07, 2023 at 05:18:27PM +0300, Konstantin Kharlamov wrote:
> I initially posted this on Emacs stackexchange, but in absence of replies 
> decided to re-post on the mailing list as that's where usually people knowing 
> how SMIE works hang out.

I have no idea of SMIE, but I think I can answer one of
your questions -- perhaps in a surprising way:

[...]

> 3. How to define newline as a separator? E.g. a `build` ends with a newline, 
> and then follows a region of assignments. I tried using a `"\n"`, but I'm not 
> sure if SMIE interprets the backslash, nor that a `\n` will work with other 
> newline types.

[...]

> My last attempt is the grammar below. I had some other variants that worked 
> incorrectly, but they were incomplete as well. For this post I created a more 
> complete version, but it does not compile for me because it doesn't like 
> `text` definition, it throws `Adjacent non-terminals: id text`.
> 
>     (defvar test-mode-smie-grammar
>       (smie-prec2->grammar
>        (smie-bnf->prec2
>         '((id)
>           (path) ;; TODO: define how it's different from `id'
>           (statements (statement)
>                       (statement "\n" statements))
>           (statement (top_decls) (variable))
>           (text (id text)
>                 (text "\n"))
>           (variable (id "=" text))
>           (build_title (path build_title)
>                        (path ":"))
>           (top_decls
>            ("rule" id)
>            ("build" build_title ":" text)
>            )
>           ))))

Those "\n" you have there are translated by the Lisp reader
(i.e. "early") into code point 0x0A. So this is what SMIE is
going to see.

Now, no idea whether it special-cases this into "whatever counts
as a newline"; I'd venture a guess that it doesn't. I'd expect
that if "your" newlines are more complex than a simple "\n",
you'll have to extend the lexer, as detailed in "Defining
Tokens" [1] in the manual.

Cheers

[1] Info menu "SMIE Lexer" or this URL, if you prefer the intertubes:
   https://www.gnu.org/software/emacs/manual/html_node/elisp/SMIE-Lexer.html

-- 
t

Attachment: signature.asc
Description: PGP signature


reply via email to

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