[Nitra] Первые впечатления и вопросы
От: Дьяченко Александр Россия  
Дата: 11.10.14 15:09
Оценка: 10 (2)

Предыстория

Был у меня персональный проект с разбором исходников на Модула-2 с использованием макроса peg-grammar, застрявший на этапе попытки сделать типизатор и в конце концов замороженный по причине нехватки времени.
Долго собирался попробовать переписать этот проект на Nitra, и вот наконец наконец собрался.

Установка

Скачал NemerleSetup-net-4.0-v1.2.391.0.msi и Nitra.Setup.msi (Nitra v0.1.1245.0 for .NET v4.0 installation package), поставил на VS2013 (Microsoft Visual Studio Professional 2013 Version 12.0.30723.00 Update 3).
Проблем при инсталляции никаких не было что уже хорошо, правда чтобы заработала подсветка пришлось перезагружаться (как я понял причина была в том что нужна была переменная окружения NitraPath, которую инсталятор хотя и создал, но была почему-то не видна до перезагрузки, может хватило бы и перелогиниться).

Первые шаги

Для начала попробовал создать грамматику для языка Модула-2, как результат за час я написал пол-страницы с 5 или 6 попытки .
В процессе VS2013 падала с концами 3 раза и еще несколько раз зависла.
Была предпринята попытка подцепиться отладчиком и попытаться найти причину.
В результате этой попытки было выяснено что похоже здесь виновата как интеграция с VS, так и компилятор Нитры.

Вопросы

Ну и наконец вопросы:
  1. [Nitra] Хотелось бы увидеть свежий Roadmap, нашел какой-то здесь, но он старый от мая 2013 (я уже спрашивал, но ответа не получил)
  2. [VS] Зачем обновлять кеш в UI потоке?
    Nitra / VisualStudioExtensions / Nitra.VisualStudio / Coloring / NitraClassifier.n:48
    parseAgent.ParseComplete +=
      fun(_, args)
      {
        def updateCache()
        {
          match (_classificationCache.Update(args.Result))
          {
            | Nothing => ()
            | All     => OnClassificationChanged(SnapshotSpan(args.Snapshot, 0, args.Snapshot.Length));
            | Ranges(rangesToUpdate) =>
              foreach(range in rangesToUpdate)
                OnClassificationChanged(SnapshotSpan(args.Snapshot, range.StartPos, range.Length));
          }
        }
        if (Thread.CurrentThread == NitraPackage.Instance.DataHostService.UIThread : object)
          updateCache();
        else
          _ = NitraPackage.Instance.DataHostService.BeginInvokeOnUIThread(Action(updateCache));
      };

    Вызывать OnClassificationChanged может и надо в UI потоке но обновлять кеш то зачем (смотри выделенное)?
  3. [VS] Почему в диалоге About версия 1.0?
    Nemerle   1.0
    Nemerle Visual Studio Integration
    Version 1.0
    
    Nitra Language Framework for Microsoft VisualStudio   1.0
    Nitra Language Framework helps developing domain specific languages (DSL)

  4. [Nitra] Сложилось впечатление что в парсере при восстановлении после ошибок есть ошибки
    Например вот такой код грамматики:
    syntax module Modula
    {
        syntax program_module = "MODULE" module_identifier [interrupt_protection] semicolon import_lists module_block module_identifier ".";
    }

    Порождает вот такое AST:
    syntax module Modula
    {
      syntax program_module = <# ambiguous RuleExpression, 64 options
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
        "MODULE" module_identifier ◄[►interrupt_protection ◄]► semicolon import_lists module_block module_identifier "."
      #>
      ;
    }

    А AST вот для такой грамматики:
    syntax module Modula
    {
        syn implementation_module =
          "IMPLEMENTATION", "MODULE", module_identifier,
          [interrupt_protection], semicolon,
            import_lists,
            module_block, module_identifier, period ;
    }

    Я не рискну сюда постить, потому что файл занимает почти 11 мегабайт.

Выводы

Пока рано...

PS. За Nitra.Visualizer спасибо прикольный инструмент, AST получены как раз им. По крайней мере в отличие от VS он не падает при попытке вставить весь файлик (13 Кб) с грамматикой, а пытается его разобрать и сожрав 1,5 Гб за 30 секунд бросает это занятие и говорит Unexpected token.

PS2. При попытке скопировать ошибку (с помощью контекстного меню) падает уже Nitra.Visualizer.

System.NullReferenceException was unhandled
Message: An unhandled exception of type 'System.NullReferenceException' occurred in Nitra.Visualizer.exe
Additional information: Ссылка на объект не указывает на экземпляр объекта.

в Nitra.Visualizer.MainWindow._errorsTreeView_CopyNodeText(Object sender, RoutedEventArgs e)
в System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
в System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
в System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
...

nitra
Re: [Nitra] Первые впечатления и вопросы
От: WolfHound  
Дата: 12.10.14 16:28
Оценка:
Здравствуйте, Дьяченко Александр, Вы писали:

ДА>[Nitra] Сложилось впечатление что в парсере при восстановлении после ошибок есть ошибки

Это не впечатление. Они там есть.
Ты нарвался на единственный, известный на данный момент, комбинаторный взрыв.
Почему он происходит понятно. Что делать пока не очень. Но мысли есть.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: [Nitra] Первые впечатления и вопросы
От: Дьяченко Александр Россия  
Дата: 12.10.14 23:14
Оценка:
Здравствуйте, WolfHound, Вы писали:

ДА>>[Nitra] Сложилось впечатление что в парсере при восстановлении после ошибок есть ошибки

WH>Это не впечатление. Они там есть.
WH>Ты нарвался на единственный, известный на данный момент, комбинаторный взрыв.
WH>Почему он происходит понятно. Что делать пока не очень. Но мысли есть.

Ясно. Повязло.

А по 4 вопросу почему получается 64 одинаковых варианта?
... << RSDN@Home 1.2.0 alpha 5 rev. 76>>
Re[3]: [Nitra] Первые впечатления и вопросы
От: WolfHound  
Дата: 13.10.14 00:02
Оценка:
Здравствуйте, Дьяченко Александр, Вы писали:

ДА>Ясно. Повязло.

На самом деле не очень.
Он проявляется только на весьма специфических грамматиках.
И грамматика найтры одна из них.
В данном случае козлит вот это правило.
    | Sequence                        = LeftRule=RuleExpression ^ 10 RightRules=(sm RuleExpression ^ 10)+

Это н-арный оператор пробел.

Кстати где ты этот синтаксис взял?
[interrupt_protection]

Найтра такое не умеет.
Думатель обе скобки удалил.

Найтра использует регексные операторы.
? для опционального правила.
И вот такие варианты для циклов:
  syntax RepeatQuantifier
  {
    Bounds() : RepeatBounds;

    | ZeroOrMany = "*"                                { override Bounds = (0,               None());                }
    | OneOrMany  = "+"                                { override Bounds = (1,               None());                }
    | UpperBound = "{" sm        "," sm Number sm "}" { override Bounds = (0,               Some(Number.Value()));  }
    | LowerBound = "{" sm Number ","           sm "}" { override Bounds = (Number.Value(),  None());                }
    | FullBounds = "{" sm Number "," sm Number sm "}" { override Bounds = (Number1.Value(), Some(Number2.Value())); }
    | Exact      = "{" sm Number               sm "}" { override Bounds { def x = Number.Value(); (x, Some(x)); }   }
  }


ДА>А по 4 вопросу почему получается 64 одинаковых варианта?

Я же говорю комбинаторный взрыв. Думатель придумал 64 способа разобрать эту строку.
Посмотри АСТ в визуализаторе.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: [Nitra] Первые впечатления и вопросы
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.10.14 00:16
Оценка:
Здравствуйте, Дьяченко Александр, Вы писали:

ДА>Проблем при инсталляции никаких не было что уже хорошо, правда чтобы заработала подсветка пришлось перезагружаться (как я понял причина была в том что нужна была переменная окружения NitraPath, которую инсталятор хотя и создал, но была почему-то не видна до перезагрузки, может хватило бы и перелогиниться).


Видимо ты не закрыл Студию или приложение из которого ее запускал. Процессы виндовс наследуют окружение. При открытой студии вообще не следует производить инсталляцию, так как она может заблокировать файлы которые нужно обновлять.

ДА>* [Nitra] Хотелось бы увидеть свежий Roadmap, нашел какой-то здесь, но он старый от мая 2013 (я уже спрашивал, но ответа не получил)


Постараюсь обновить в ближайшее время. В двух словах: в ближайших планах работа над символами и связванием. Работы уже идут. Уже реализованы декларации, которые уже задействованы в проекте нового форматера для РСДН. Это внутренняя фича, но ее уже можно использовать как средство создания AST с требуемой структурой.

ДА>* [VS] Зачем обновлять кеш в UI потоке?


Это UI-кэш который обновляется синхронно. Вкратце: у нас нет лексера по этому пока мы не получим результат парсинга, то не может даже подсвечивать ключевые слова. Чтобы текст не чернел на время парсинга в UI-потоке содержится кэш прошлой отрисовки. Он обновляется так чтобы внесенное изменение сдвигало элементы подсветки соответствующим образом. За одно, это позволяет определить какую часть текста нужно перерисовать.

ДА>Вызывать OnClassificationChanged может и надо в UI потоке но обновлять кеш то зачем (смотри выделенное)?


Затем, что он синхронный. Изменения там плевые. Они спокойно делаются на каждый чих.

ДА>* [VS] Почему в диалоге About версия 1.0?


Версия пакета указана явно. В принципе она может быть любой, так как она ни на что не влияет. Если это напрягает, можно подумать как сделать ее обновляемой в процессе сборки.

ДА>* [Nitra] Сложилось впечатление что в парсере при восстановлении после ошибок есть ошибки


У меня тоже. Вольфхаунд сейчас работает над этим вопросом. К сожалению, в безлексерном парсере допускающем неоднозначности это очень не простая задача.

Мы добились весьма неплохих результатов, но иногда вылезает экспонента в обходчиках и парсере.

Если появилась такая ситуация, нужно прислать нам код парсера и/или набор действий приводящих к ошибке. Лучше создать issue в багтрекер, или прислать по скайпу (vc.rsdn.ru). Но лучше, конечно, issue создать, а по скайпу дать на него ссылку.

ДА>Я не рискну сюда постить, потому что файл занимает почти 11 мегабайт.


Обходчик втыкаем на комбинаторном взрыве. Постараемся пофиксить в ближайшее время.

ДА>

Выводы

ДА>Пока рано...

Дык, если не пробовать, то мы так никогда о некоторых проблемах не узнаем. Проще пробовать и сразу же обращаться на нам, если что-то не работает как надо.

Я вот уже несколько проектов создал и на эти проблемы не нарвался. Видимо пишу с меньшим количеством грамматических ошибок, так что на экспоненту не нарывался.

ДА>PS. За Nitra.Visualizer спасибо прикольный инструмент, AST получены как раз им. По крайней мере в отличие от VS он не падает при попытке вставить весь файлик (13 Кб) с грамматикой, а пытается его разобрать и сожрав 1,5 Гб за 30 секунд бросает это занятие и говорит Unexpected token.


Там тоже обходчик втыкает. Мы с ними постараемся разобраться. Студия вылетает, так как результат полученный от обходчика передается дифу, который не линейный, к сожалению.

ДА>PS2. При попытке скопировать ошибку (с помощью контекстного меню) падает уже Nitra.Visualizer.

ДА>System.NullReferenceException was unhandled

Было бы признателен, если бы ты завел на каждый баг issue на youtrack.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Отредактировано 13.10.2014 2:15 VladD2 . Предыдущая версия .
Re[4]: [Nitra] Первые впечатления и вопросы
От: Дьяченко Александр Россия  
Дата: 13.10.14 01:25
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Кстати где ты этот синтаксис взял?

WH>
WH>[interrupt_protection]
WH>

WH>Найтра такое не умеет.
WH>Думатель обе скобки удалил.

Переделываю грамматику в Найтру из другого описания, это рудимент.

WH>Найтра использует регексные операторы.

WH>? для опционального правила.

Спасибо, знаю.

ДА>>А по 4 вопросу почему получается 64 одинаковых варианта?

WH>Я же говорю комбинаторный взрыв. Думатель придумал 64 способа разобрать эту строку.
WH>Посмотри АСТ в визуализаторе.

Там и смотрю на закладке с текстом — 64 одинаковых варианта.
Re[2]: [Nitra] Первые впечатления и вопросы
От: Дьяченко Александр Россия  
Дата: 13.10.14 02:36
Оценка:
Здравствуйте, VladD2, Вы писали:

ДА>>Проблем при инсталляции никаких не было что уже хорошо, правда чтобы заработала подсветка пришлось перезагружаться (как я понял причина была в том что нужна была переменная окружения NitraPath, которую инсталятор хотя и создал, но была почему-то не видна до перезагрузки, может хватило бы и перелогиниться).

VD>Видимо ты не закрыл Студию или приложение из которого ее запускал.

Студия конечно была закрыта.

VD>Процессы виндовс наследуют окружение. При открытой студии вообще не следует производить инсталляцию, так как она может заблокировать файлы которые нужно обновлять.


Скорей всего это был explorer.exe, т.к. из командной строки переменную тоже видно не было.

ДА>>* [Nitra] Хотелось бы увидеть свежий Roadmap, нашел какой-то здесь, но он старый от мая 2013 (я уже спрашивал, но ответа не получил)

VD>Постараюсь обновить в ближайшее время.

Спасибо ждем.

VD>В двух словах: в ближайших планах работа над символами и связванием. Работы уже идут. Уже реализованы декларации, которые уже задействованы в проекте нового форматера для РСДН. Это внутренняя фича, но ее уже можно использовать как средство создания AST с требуемой структурой.


Видел, ссылка на новый форматер где-то по форуму проскакивала, но ничего не понял статейку бы какую-нибудь...

ДА>>* [VS] Зачем обновлять кеш в UI потоке?

VD>Это UI-кэш который обновляется синхронно. Вкратце: у нас нет лексера по этому в пока мы не получим результат парсинга, то не может даже подсвечивать ключевые слова. Чтобы текст не чернел на время парсинга в UI-потоке содержится кэш прошлой отрисовки. Он обновляется так чтобы внесенное изменение сдвигало элементы подсветки соответствующим образом. За одно это позволяет определить какую часть текста нужно перерисовать.
ДА>>Вызывать OnClassificationChanged может и надо в UI потоке но обновлять кеш то зачем (смотри выделенное)?
VD>Затем, что он синхронный. Изменения там плевые. Они спокойно делаются на каждый чих.

Вроде ClassificationCache.Update не зависит от UI потока?
Может отделить все таки, коли диф не линейный?
Как нибудь так?

parseAgent.ParseComplete +=
  fun(_, args)
  {
    def updateCache(result)
    {
      | Nothing => ()
      | All     => OnClassificationChanged(SnapshotSpan(args.Snapshot, 0, args.Snapshot.Length));
      | Ranges(rangesToUpdate) =>
        foreach(range in rangesToUpdate)
          OnClassificationChanged(SnapshotSpan(args.Snapshot, range.StartPos, range.Length));
    }

    def updateResult = _classificationCache.Update(args.Result);
    if (Thread.CurrentThread == NitraPackage.Instance.DataHostService.UIThread : object)
      updateCache(updateResult);
    else
      _ = NitraPackage.Instance.DataHostService.BeginInvokeOnUIThread(Action(updateCache(updateResult)));
  };


ДА>>* [VS] Почему в диалоге About версия 1.0?

VD>Версия пакета указана явно. В принципе она может быть любой, так как она ни на что не влияет. Если это напрягает, можно подумать как сделать ее обновляемой в процессе сборки.

Просто вызывает некоторое недоумение. Лучше бы конечно что бы версия совпадала с реальной.

ДА>>* [Nitra] Сложилось впечатление что в парсере при восстановлении после ошибок есть ошибки

VD>У меня тоже. Вольфхаунд сейчас работает над этим вопросом. К сожалению, в безлексерном парсере допускающем неоднозначности это очень не простая задача.
VD>Мы добились весьма неплохих результатов, но иногда вылезает экспонента в обходчиках и парсере.
VD>Если появилась такая ситуация, нужно прислать нам код парсера и/или набор действий приводящих к ошибке. Лучше создать issue в багтрекер, или прислать по скайпу (vc.rsdn.ru). Но лучше, конечно, issue создать, а по скайпу дать на него ссылку.

В первом сообщении код приведен полностью. Я его прям в таком виде в визализаторе писал.

ДА>>Я не рискну сюда постить, потому что файл занимает почти 11 мегабайт.

VD>Обходчик втыкаем на комбинаторном взрыве. Постараемся пофиксить в ближайшее время.

Будем ждать.

ДА>>

Выводы

ДА>>Пока рано...
VD>Дык, если не пробовать, то мы так никогда о некоторых проблемах не узнаем. Проще пробовать и сразу же обращаться на нам, если что-то не работает как надо.
VD>Я вот уже несколько проектов создал и на эти проблемы не нарвался. Видимо пишу с меньшим количеством грамматических ошибок, так что на экспоненту не нарывался.

Просто у меня грамматика уже есть в каком-то виде и я пытался вставить файлик, а потом править по ходу.
Оттуда и ошибки.

ДА>>PS. За Nitra.Visualizer спасибо прикольный инструмент, AST получены как раз им. По крайней мере в отличие от VS он не падает при попытке вставить весь файлик (13 Кб) с грамматикой, а пытается его разобрать и сожрав 1,5 Гб за 30 секунд бросает это занятие и говорит Unexpected token.

VD>Там тоже обходчик втыкает. Мы с ними постараемся разобраться. Студия вылетает, так как результат полученный от обходчика передается дифу, который не линейный, к сожалению.

Понял, ждем...

ДА>>PS2. При попытке скопировать ошибку (с помощью контекстного меню) падает уже Nitra.Visualizer.

ДА>>System.NullReferenceException was unhandled
VD>Было бы признателен, если бы ты завел на каждый баг issue на youtrack.

Сделаю.
Re[3]: [Nitra] Первые впечатления и вопросы
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.10.14 05:43
Оценка:
Здравствуйте, Дьяченко Александр, Вы писали:

ДА>Скорей всего это был explorer.exe, т.к.


Не. Эксплорер — исключение.

ДА>из командной строки переменную тоже видно не было.


Ее переокрывать нужно. Возможно ее и не было видно, так как сессия старая была.

ДА>Видел, ссылка на новый форматер где-то по форуму проскакивала, но ничего не понял статейку бы какую-нибудь...


Да, наверно надо. Приоритет был не пример, а просто потестировать найтру. Там интересный случай, так называемый, island parsing (т.е. когда в море плоского текста встречаются островки грамматических конструкций).

ДА>Вроде ClassificationCache.Update не зависит от UI потока?


Зависит. Я же говорю. Этот кэш — синхронный. Если во время изменения придет еще одно, то сначала придется накатить старые.

Я уже поглядел что там. Там дело не в кэше, а в обходчиках собирающих информацию о подстветке (и т.п.). Обходчик подсветки выдавал список в котором токены многократно дублировались и содержали пустые диапазаоны. Я добавил проверки исключающие пустые диапазоны и заменил список на таблицы. Должно помочь.

Но это все равно не полное решение проблемы. Вольфхаунд потом постарается устранить саму причину — комбинаторный взрыв в обходчиках.

ДА>Может отделить все таки, коли диф не линейный?


После моих изменений проблема должна исчезнуть. Ну, а с дифом надо смотреть. Может быть его как-то оптимизировать можно.
ДА>Как нибудь так?

ДА>
ДА>    def updateResult = _classificationCache.Update(args.Result);
ДА>    if (Thread.CurrentThread == NitraPackage.Instance.DataHostService.UIThread : object)
ДА>      updateCache(updateResult);
ДА>    else
ДА>      _ = NitraPackage.Instance.DataHostService.BeginInvokeOnUIThread(Action(updateCache(updateResult)));
ДА>  };
ДА>


Этот код должен в гуевом потоке выполняться или отдельно синхронизироваться. Иначе этот кэш порушат из отдельных потоков. Тем более, что основное изменение идет из гуевого потока.

ДА>Просто вызывает некоторое недоумение. Лучше бы конечно что бы версия совпадала с реальной.


ОК, подумаем что нужно делать. Заведи, плиз ишью, а то забудем.

ДА>В первом сообщении код приведен полностью. Я его прям в таком виде в визализаторе писал.


ОК, просто с ишью всегда проще. Можно проконтролировать и не потеряется.


ДА>Просто у меня грамматика уже есть в каком-то виде и я пытался вставить файлик, а потом править по ходу.

ДА>Оттуда и ошибки.

Ясно. Ну, тогда воркэрануд — поправить грамматику в отдельном редакторе и вставить с меньшим числом ошибок. Тогда зависать не должно. Возможно мое изменение у

ДА>Понял, ждем...


Я уже закомитил фикс. Но когда соберется не знаю. И проверить не могу из-за технических проблем со сборкой. Так что скачай по позже инсталлятор. Если версия будет больше чем v0.1.1245, попробуй. Должно помочь.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: [Nitra] Первые впечатления и вопросы
От: Дьяченко Александр Россия  
Дата: 13.10.14 13:57
Оценка:
Здравствуйте, VladD2, Вы писали:

ДА>>Скорей всего это был explorer.exe, т.к.

VD>Не. Эксплорер — исключение.
ДА>>из командной строки переменную тоже видно не было.
VD>Ее переокрывать нужно. Возможно ее и не было видно, так как сессия старая была.

Я как раз новую и открывал (старой просто не было).
В любом случае это мелочь.

ДА>>Вроде ClassificationCache.Update не зависит от UI потока?

VD>Зависит. Я же говорю. Этот кэш — синхронный. Если во время изменения придет еще одно, то сначала придется накатить старые.

Ну может не доглядел чего...

VD>Я уже поглядел что там. Там дело не в кэше, а в обходчиках собирающих информацию о подстветке (и т.п.). Обходчик подсветки выдавал список в котором токены многократно дублировались и содержали пустые диапазаоны. Я добавил проверки исключающие пустые диапазоны и заменил список на таблицы. Должно помочь.

VD>Но это все равно не полное решение проблемы. Вольфхаунд потом постарается устранить саму причину — комбинаторный взрыв в обходчиках.

Ок потестим.

ДА>>Просто вызывает некоторое недоумение. Лучше бы конечно что бы версия совпадала с реальной.

VD>ОК, подумаем что нужно делать. Заведи, плиз ишью, а то забудем.
ДА>>В первом сообщении код приведен полностью. Я его прям в таком виде в визализаторе писал.
VD>ОК, просто с ишью всегда проще. Можно проконтролировать и не потеряется.

Вроде завел на все где споткнулся:

NTR-40 System.NullReferenceException in Nitra.Visualizer when copy error from context menu
NTR-41 Very many equal ambiguous options when parsing
NTR-42 Find not all posible ambiguous options when parsing
NTR-43 Invalid version in VS about dialog

Интересны коментарии на вот NTR-42.

ДА>>Просто у меня грамматика уже есть в каком-то виде и я пытался вставить файлик, а потом править по ходу.

ДА>>Оттуда и ошибки.
VD>Ясно. Ну, тогда воркэрануд — поправить грамматику в отдельном редакторе и вставить с меньшим числом ошибок. Тогда зависать не должно. Возможно мое изменение у

Это можно но без подсветки как-то совсем грусно , итак синтаксис только в статьях и видел, чуть что лезешь смотреть.

ДА>>Понял, ждем...

VD>Я уже закомитил фикс. Но когда соберется не знаю. И проверить не могу из-за технических проблем со сборкой. Так что скачай по позже инсталлятор. Если версия будет больше чем v0.1.1245, попробуй. Должно помочь.

Ок потестим.
... << RSDN@Home 1.2.0 alpha 5 rev. 76>>
Re[5]: [Nitra] Первые впечатления и вопросы
От: WolfHound  
Дата: 13.10.14 15:18
Оценка:
Здравствуйте, Дьяченко Александр, Вы писали:

ДА>Интересны коментарии на вот NTR-42.

Прокомментировал. Это правильное поведение.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[5]: [Nitra] Первые впечатления и вопросы
От: WolfHound  
Дата: 13.10.14 16:37
Оценка:
Здравствуйте, Дьяченко Александр, Вы писали:

ДА>Там и смотрю на закладке с текстом — 64 одинаковых варианта.

Там есть ещё закладка reflection.
В ней можно посмотреть реальную структуру АСТ.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[6]: [Nitra] Первые впечатления и вопросы
От: Дьяченко Александр Россия  
Дата: 13.10.14 16:53
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, Дьяченко Александр, Вы писали:


ДА>>Интересны коментарии на вот NTR-42.

WH>Прокомментировал. Это правильное поведение.

Я правильно понимаю, что выбираються альтернативы с минимумом додумывания?
Тоесть даже если бы тот кусок грамматики выглядел так:
  syntax RepeatQuantifier
  {
    | ZeroOrMany = "*"
    | OneOrMany  = "+"
    | UpperBound = "{" sm        "," sm Number sm "}"
    | LowerBound = "{" sm Number ","           sm "}"
    | FullBounds = "<" sm Number "," sm Number sm ">"
    | Exact      = "{" sm Number               sm "}"
  }


Я бы варианта FullBounds в альтернативах не увидел?
... << RSDN@Home 1.2.0 alpha 5 rev. 76>>
Re[7]: [Nitra] Первые впечатления и вопросы
От: WolfHound  
Дата: 13.10.14 17:18
Оценка:
Здравствуйте, Дьяченко Александр, Вы писали:

ДА>Я правильно понимаю, что выбираються альтернативы с минимумом додумывания?

Я стараюсь. Но это не просто.

ДА>Тоесть даже если бы тот кусок грамматики выглядел так:

хъ
ДА>Я бы варианта FullBounds в альтернативах не увидел?
Не важно. Я токены считаю.

Или у тебя есть идея, что ещё можно посчитать?
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[5]: [Nitra] Первые впечатления и вопросы
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.10.14 19:04
Оценка:
Здравствуйте, Дьяченко Александр, Вы писали:

ДА>Я как раз новую и открывал (старой просто не было).

ДА>В любом случае это мелочь.

Если ты не ошибешься, то это какие-то чудеса. А я очень не люблю когда не полностью понимаю проходящее.

VD>>Я уже поглядел что там. Там дело не в кэше, а в обходчиках собирающих информацию о подстветке (и т.п.). Обходчик подсветки выдавал список в котором токены многократно дублировались и содержали пустые диапазаоны. Я добавил проверки исключающие пустые диапазоны и заменил список на таблицы. Должно помочь.

VD>>Но это все равно не полное решение проблемы. Вольфхаунд потом постарается устранить саму причину — комбинаторный взрыв в обходчиках.

ДА>Ок потестим.


Новая версия собралась. Твой второй пример прочухался (не виснет), но все же подтормаживает. Полностью все заработает кагда Вольфвхаунд победит экспоненту в обходчиках.

ДА>Вроде завел на все где споткнулся:...


Спасибо!

ДА>Это можно но без подсветки как-то совсем грусно , итак синтаксис только в статьях и видел, чуть что лезешь смотреть.


Ну, так как только подправишь и поместишь код в студию, подсветка появится. В прочем, твой пример уже работает терпимо. А если поправить syn на syntax, то даже особых тормозов нет. Удаление же запятых вообще дает отличный результат. Так что достаточно пары замен по контексту и все будет воркать.

Мы же пока поищем другие места где экспонента вылезает. Похоже волкер отвечающий за скобки тоже втыкает на неоднозначностях.

В общем, скачай новую версию.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: [Nitra] Первые впечатления и вопросы
От: Дьяченко Александр Россия  
Дата: 13.10.14 19:23
Оценка:
Здравствуйте, WolfHound, Вы писали:

ДА>>Я бы варианта FullBounds в альтернативах не увидел?

WH>Не важно. Я токены считаю.
WH>Или у тебя есть идея, что ещё можно посчитать?

Пока наверно нет. Мало опыта...
Есть только внутреннее ощущение, примерно следующего вида:
1. Подправила одного правила имеют довольно сильную связь.
2. Из п.1 вытекает, что исключать не противоречащие подправила не правильно... поэтому я и написал про 3 альтернативы
3. А из п.2 вытекает, что и в ошибках ождалось — Expected "{Number,}" or "{,Number}" or "{Number,Number}"

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

PS. Кстати а почему не предлагает банальный вариант удалить запятую?
... << RSDN@Home 1.2.0 alpha 5 rev. 76>>
Re[6]: [Nitra] Первые впечатления и вопросы
От: Дьяченко Александр Россия  
Дата: 13.10.14 19:34
Оценка:
Здравствуйте, VladD2, Вы писали:

ДА>>Я как раз новую и открывал (старой просто не было).

VD>Если ты не ошибешься, то это какие-то чудеса. А я очень не люблю когда не полностью понимаю проходящее.

Хорошо попробую воспроизвести, там видно будет.

ДА>>Ок потестим.

VD>Новая версия собралась. Твой второй пример прочухался (не виснет), но все же подтормаживает. Полностью все заработает кагда Вольфвхаунд победит экспоненту в обходчиках.

Попробую, но завтра, а то у нас уже ночь — спать пора.

ДА>>Это можно но без подсветки как-то совсем грусно , итак синтаксис только в статьях и видел, чуть что лезешь смотреть.

VD>Ну, так как только подправишь и поместишь код в студию, подсветка появится. В прочем, твой пример уже работает терпимо. А если поправить syn на syntax, то даже особых тормозов нет. Удаление же запятых вообще дает отличный результат. Так что достаточно пары замен по контексту и все будет воркать.

Хорошо бы. А то пробывал в блокноте — жесть .

VD>Мы же пока поищем другие места где экспонента вылезает. Похоже волкер отвечающий за скобки тоже втыкает на неоднозначностях.

VD>В общем, скачай новую версию.

Хорошо. Кстати со скобками в визуализаторе тоже ловились странности при разбалансировке фигурных скобок, пару раз вроде он уходил в несознанку — типа немогу разобрать и подчеркивал весь текст как ошибку, тоже так себе поведение.
Если поймаю стабильно, то отпишусь.
... << RSDN@Home 1.2.0 alpha 5 rev. 76>>
Re[6]: [Nitra] Первые впечатления и вопросы
От: Дьяченко Александр Россия  
Дата: 13.10.14 19:34
Оценка:
Здравствуйте, WolfHound, Вы писали:

ДА>>Там и смотрю на закладке с текстом — 64 одинаковых варианта.

WH>Там есть ещё закладка reflection.
WH>В ней можно посмотреть реальную структуру АСТ.

Посмотрел на примере попроще:
syntax module M1
{
    syntax S1 = E1,E2,;
}

Действительно в рефлекшене отличается, но что-то я не соображу как у него такие подветки получаются что в первой альтернативе, что во второй...
Вроде по грамматике не так должно быть...
... << RSDN@Home 1.2.0 alpha 5 rev. 76>>
Re[7]: [Nitra] Первые впечатления и вопросы
От: Дьяченко Александр Россия  
Дата: 13.10.14 19:50
Оценка:
По мне вот такое дерево должно быть:
Sequence
|- Repeat
|  |- Call
|  |- RepeatQuantifier
|- List
   |- Repeat
      |- Call
      |- RepeatQuantifier

А у него получаются:
RuleExpression
|- Ambiguous of <NULL>
   |- <NULL>
   |  |- Call
   |  |- RepeatQuantifier
   |  |- List
   |  |  |- RuleExpression
   |  |     |- Call
   |  |- RepeatQuantifier
   |- <NULL>
      |- Call
      |- RepeatQuantifier
      |- List
         |- RuleExpression
            |- Call
            |- RepeatQuantifier

Второй вариант вроде похож на правду, но откуда в первом варианте появляется RepeatQuantifier из граматики не ясно...
... << RSDN@Home 1.2.0 alpha 5 rev. 76>>
Re[7]: [Nitra] Первые впечатления и вопросы
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.10.14 20:48
Оценка:
Здравствуйте, Дьяченко Александр, Вы писали:

ДА>Хорошо. Кстати со скобками в визуализаторе тоже ловились странности при разбалансировке фигурных скобок, пару раз вроде он уходил в несознанку — типа немогу разобрать и подчеркивал весь текст как ошибку, тоже так себе поведение.


Присылай мне примеры. Будем разбираться.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: [Nitra] Первые впечатления и вопросы
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.10.14 20:59
Оценка:
Здравствуйте, WolfHound, Вы писали:

ДА>>Интересны коментарии на вот NTR-42.

WH>Прокомментировал. Это правильное поведение.

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