As you can see they are each in new line. Then, if I use IUnitOfWork these rules are not respected (inserted rule is before next section's header, in the same line). How do I perform semantic modification is cases like this?

Since NL is optional (NL*) the serializer is not forced to output
anything and hence you do not get a NL.

When doing semantic changes, there is typically no existing nodes
containing the NL, so the formatter when formatting the added model
elements has no clue a NL is needed. (If there is a node model, then an
existing NL should be preserved if the formatting rules allow this).

I can think of a couple of ways to fix this:
- Make the serializer output a NL by default if there is no node model
- Make the serializer pick up information in an adapter and output what
is in the adapter (a more general solution).
- Assign the NL to a boolean - i.e. (endsWithNL ?= NL+)? (sets boolean
to true if there is a NL). Simply set it if you want one, and the
serializer should understand the need to output a NL when the endsWithNL
feature is true.

Hope that helps
- henrik

On 2013-29-04 21:22, Pawel Pogorzelski wrote:
> I have a grammar that defines hidden tokens as SPACE, TAB and
> SL_COMMENT. That means neither CR nor LF are hidden:
>
> grammar acl.Acl hidden(WS, SL_COMMENT)
> ...
> terminal WS:
> (' ' | '\t')+;
> terminal NL:
> ('\r'? '\n');
>
> Then I have RuleSection:
>
>
> RuleSection:
> header=RuleHeader
> rules+=Rule*;
> Rule:
> (group=GroupReference | user=User) ASSIGNMENT value=WORD? NL*;
>
>
> As you can see they are each in new line. Then, if I use IUnitOfWork
> these rules are not respected (inserted rule is before next section's
> header, in the same line). How do I perform semantic modification is
> cases like this?
>
> Thanks,
> Pawel