Re: state in parsers
Eric Ludlam <[email protected]> Tue, 3 Nov 2015 07:22:26 -0500
| Newsgroups | gmane.emacs.semantic |
|---|---|
| Message-ID | <[email protected]> |
On 11/02/2015 07:13 AM, Kristof Bastiaensen wrote:
> Hi,
>
> I'd like to add support for haskell to semantic. Haskell syntax is
> sensitive
> to indentation, and I'd like to know if it is possible to use bovine or
> wisent for
> it.
Yes.
> The layout rule is explained here:
> https://www.haskell.org/onlinereport/haskell2010/haskellch2.html#x7-210002.7
>
> What it does, is after certain keywords, whenever a '{' character is
> ommited, it
> enters a layout context. In the layout context it will remember the
> indentation
> of the next token. When a line has the same indentation as this token,
> a ';' token is
> inserted before the expression. Whenever the indentation is less than
> this, a '}' token
> is inserted, and the layout context is ended. The layout context is
> also ended when a parser error would occur.
The python grammar in semantic/wisent/python.wy and python.el is an ok
example. The premise is that when you develop the lexer, you teach it
to convert your indentation into lexical tokens that you then use in
your grammar.
In the python.el support file, you will notice it uses
(current-indentation) and uses that to derive INDENT and DEDENT tokens.
The grammar uses those to create INDENT and DEDENT blocks so it can
recurse into code bodies. You could just as easily skip them too if you
prefer.
> So I would set a state variable to all the layout context indentations,
> and then change the behaviour of the lexer or parser based on this
> state. Is that possible? Would it interfere with incremental parsing?
Definitely start with the lexer, and there is good documentation on
creating a lexer in the semantic language developers guide. Use the
lexer testing function to make sure it outputs what you expect, and then
you can continue on with the grammar.
Eric
------------------------------------------------------------------------------