[Nitra] Непонятки с Nitra.CStyleComments
От: pekabon  
Дата: 17.02.16 12:41
Оценка:
Привет,

Берем вот такую грамматику

syntax module TestMain
{
    using Nitra.Core;
    using Nitra.CStyleComments;

    using ItemDeclarations;

    [StartRule]
    syntax test =  Any;
}


Берем вот такой текст ABCD // ABCD

Делаем:

  def spans = HashSet();
  parseResult.GetSpans(span.Start, span.End, spans);


И получаем результат:

+ [0] {"Start: 5 Len: 2" Class: Nitra.Language.Operator} Nitra.SpanInfo
+ [1] {"Start: 5 Len: 7" Class: Nitra.Language.InlineComment} Nitra.SpanInfo


Вопрос: Откуда тут Nitra.Language.Operator?
Отредактировано 17.02.2016 13:00 VladD2 . Предыдущая версия .
Re: [Nitra] Непонятки с Nitra.CStyleComments
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.02.16 13:02
Оценка:
Здравствуйте, pekabon, Вы писали:

P>Вопрос: Откуда тут Nitra.Language.Operator?


Оператора быть не должно. Надо разбираться.

Буду признателен, если ты создаешь минимальный проект воспроизводящий это дело и пришлешь его мне по мылу (в профиле) или на Скайп vc.rsdn.ru.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: [Nitra] Непонятки с Nitra.CStyleComments
От: pekabon  
Дата: 17.02.16 15:05
Оценка:
Здравствуйте, VladD2, Вы писали:


VD>Буду признателен, если ты создаешь минимальный проект воспроизводящий это дело и пришлешь его мне по мылу (в профиле) или на Скайп vc.rsdn.ru.


Отправил на почту
Re[3]: [Nitra] Непонятки с Nitra.CStyleComments
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.02.16 20:56
Оценка:
Здравствуйте, pekabon, Вы писали:

VD>>Буду признателен, если ты создаешь минимальный проект воспроизводящий это дело и пришлешь его мне по мылу (в профиле) или на Скайп vc.rsdn.ru.


P>Отправил на почту


Что-то ничего не пришло. Проверь правильно ли указана почта.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: [Nitra] Непонятки с Nitra.CStyleComments
От: pekabon  
Дата: 18.02.16 07:54
Оценка:
Здравствуйте, VladD2, Вы писали:

Вроде все правильно указано.
Выложил сюда.
Re[5]: [Nitra] Непонятки с Nitra.CStyleComments
От: pekabon  
Дата: 24.02.16 14:35
Оценка:
Здравствуйте, pekabon, Вы писали:

P>Вроде все правильно указано.

P>Выложил сюда.

Ну как, удалось посмотреть?
Re[6]: [Nitra] Непонятки с Nitra.CStyleComments
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.02.16 17:17
Оценка:
Здравствуйте, pekabon, Вы писали:

P>>Вроде все правильно указано.

P>>Выложил сюда.

P>Ну как, удалось посмотреть?


Сори. Совсем запамятовал. Сейчас посмотрю.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: [Nitra] Непонятки с Nitra.CStyleComments
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.02.16 20:13
Оценка: 6 (1)
Здравствуйте, pekabon, Вы писали:

P>Ну как, удалось посмотреть?


Посмотрел. Ошибка в описании правила для однострочного комментария.

Оператор получается потому что внутри комментария есть литерал "//", а правило комментария является так называемым token-правилом, а оно может иметь структуру.

Имя Operator дается автоматически из-за вот этой строчки:
namespace Nitra
{
  language Language
  {
    span class Operator   regex ['+', '-', '/', '*', '^', '!', '?', ':', '<', '=', '>', '|', '&', '~', '%']+ { ForegroundColor=Olive; }

здесь:
regex ['+', '-', '/', '*', '^', '!', '?', ':', '<', '=', '>', '|', '&', '~', '%']+

это регулярное выражение выявляющее литералы которым автоматически будет присваиваться этот sapan class.

Так как в определении правила SingleLineComment для "//" не было явно задан sapan class, сработала эта строчка и этот литерал получил sapan class "Operator".

Понимаю, что это не логичное поведение. По сему я изменил грамматику комментариев. Теперь она будет выглядеть так:
    extend token IgnoreToken
    {
      | [SpanClass(InlineComment)]    SingleLineComment = Start Body=(!NewLine Any)* End=NewLine?
        {
          regex Start = "//";
        }
      | [SpanClass(MultilineComment)] MultiLineComment  = Start Body=(!"*/" Any)*  End
        {
          [SpanClass(OpenBrace)]
          regex Start = "/*";

          [SpanClass(CloseBrace)]
          regex End = "*/";
        }
    }

Таким образом в SingleLineComment вложенный sapan class для "//" больше не будет, а в MultiLineComment будут появляться sapan class-ы указывающие, что "/*" — открывающая скобка, а "*/" — закрывающая. Это позволит переходить между ними по Ctrl+"]".

Пока залил изменения в рабочую ветку. В ближайшее время сольем ее с master-ом.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.