Всё никак не мог себя заставить изучить нитру, довольно специфическая тема.
А вот попалась ручная реализация Liquid парсера https://github.com/sebastienros/fluid
И захотелось сделать такой-же на нитре
Язык довольно простой https://shopify.github.io/liquid/
Будет интересно сравнить по скорости.
С чего начать? Что-то не нашёл как начинать свой проект на нитра.
Создал проэкт, модуль, синтакс, получаю ошибку на совсем безобидном примере. Что не так?
namespace Parser
{
syntax module NLiquidSyntax
{
using Nitra.Core;
using Nitra.CStyleComments;
[StartRule]
syntax Start = "hello";
}
}
1>------ Rebuild All started: Project: NLiquid, Configuration: Debug Any CPU ------
1>D:\Dev\GitHub\Nitra\Boot2\Net-4.0\Nitra.Runtime.dll(1,1): warning : Failed to read metadata from referenced assembly: Unknown member 'Fir'.
1>D:\Dev\GitHub\Nitra\Boot2\Net-4.0\Nitra.Runtime.dll(1,1): warning : Failed to read metadata from referenced assembly: assertion failed in file CompilingNitraProject.n, line 59: Cannot get Nemerle type for symbol ''
1>C:\Program Files (x86)\Nemerle\Net-4.0\Nemerle.MSBuild.targets(289,5): error : internal compiler error: got some unknown exception of type System.NullReferenceException: Object reference not set to an instance of an object.
1> at Nitra.Typing.SyntaxModuleBodyContext._N_appendSymbol__74998.apply(TokenLiteralSymbol symbol, Map`2 map) in D:\Dev\GitHub\Nitra\Boot2\Nitra.Grammar\Context\SyntaxModuleBodyContext.n:line 30
1> at Nemerle.Collections.NList.FoldLeft[T,TOut](list`1 l, TOut acc, Function`3 f)
1> at Nitra.Typing.SyntaxModuleBodyContext._N_walk_75025(_N_closureOf_get_TokenNamesMap_74988 _N_get_TokenNamesMap_cp_75024, Context baseContext) in D:\Dev\GitHub\Nitra\Boot2\Nitra.Grammar\Context\SyntaxModuleBodyContext.n:line 38
1> at Nitra.Typing.SyntaxModuleBodyContext._N_walk_75025(_N_closureOf_get_TokenNamesMap_74988 _N_get_TokenNamesMap_cp_75024, Context baseContext) in D:\Dev\GitHub\Nitra\Boot2\Nitra.Grammar\Context\SyntaxModuleBodyContext.n:line 38
1> at Nitra.Typing.SyntaxModuleBodyContext.get_TokenNamesMap() in D:\Dev\GitHub\Nitra\Boot2\Nitra.Grammar\Context\SyntaxModuleBodyContext.n:line 43
1> at Nitra.Utils.MakeLiteralName(option`1 fieldName, String value, Context context) in D:\Dev\GitHub\Nitra\Boot2\Nitra.Grammar\Utils.n:line 267
1> at Nitra.Utils.StringRuleTyping(Location loc, String value, option`1 fieldName, Context context) in D:\Dev\GitHub\Nitra\Boot2\Nitra.Grammar\Utils.n:line 527
1> at NitraSyntaxParseTree.RuleExpression.String.Typing(option`1 _baseRule, PrecedenceInfo _precedenceInfo, option`1 _fieldName, Context context, RuleDefinitionOptions _options) in D:\Dev\GitHub\Nitra\Boot2\Nitra.Grammar\NitraSyntax.nitra:line 2350
1> at NitraSyntaxParseTree.SimpleRule.MakeTypedRule() in D:\Dev\GitHub\Nitra\Boot2\Nitra.Grammar\NitraSyntax.nitra:line 1596
1> at NitraSyntaxParseTree.SimpleRule.Typing() in D:\Dev\GitHub\Nitra\Boot2\Nitra.Grammar\NitraSyntax.nitra:line 1600
1> at NitraSyntaxParseTree.SyntaxModuleMember.SimpleRule.Typing() in D:\Dev\GitHub\Nitra\Boot2\Nitra.Grammar\NitraSyntax.nitra:line 1049
1> at NitraSyntaxParseTree.NamespaceMember.SyntaxModule.Typing() in D:\Dev\GitHub\Nitra\Boot2\Nitra.Grammar\NitraSyntax.nitra:line 918
1> at NitraSyntaxParseTree.NamespaceBody.Typing() in D:\Dev\GitHub\Nitra\Boot2\Nitra.Grammar\NitraSyntax.nitra:line 99
1> at NitraSyntaxParseTree.NamespaceMember.Namespace.Typing() in D:\Dev\GitHub\Nitra\Boot2\Nitra.Grammar\NitraSyntax.nitra:line 882
1> at NitraSyntaxParseTree.Start.Typing() in D:\Dev\GitHub\Nitra\Boot2\Nitra.Grammar\NitraSyntax.nitra:line 84
1> at Nitra.Compiler.CompilingNitraProject.TypeSyntaxModules(List`1 parseTree) in D:\Dev\GitHub\Nitra\Boot2\Nitra.Compiler\CompilingNitraProject.Passes.n:line 160
1> at Nitra.Compiler.CompilingNitraProject.BeforeTypedMembers() in D:\Dev\GitHub\Nitra\Boot2\Nitra.Compiler\CompilingNitraProject.Passes.n:line 350
1> at Nitra.InvokeNitraCompiler_assembly_preaddMacro._N__N_method_lambda__42293.apply_void() in D:\Dev\GitHub\Nitra\Boot2\Nitra.Compiler\Macros\Macros.n:line 0
1> at Nemerle.Compiler.MacroColorizator.InGlobalColor(FunctionVoid fn)
1> at Nitra.InvokeNitraCompiler_assembly_preaddMacro.Run(Typer _N__1, list`1 parms) in D:\Dev\GitHub\Nitra\Boot2\Nitra.Compiler\Macros\Macros.n:line 27
1> at Nemerle.Compiler.TypesManager.AttributeMacroExpansion.Expand()
1> at Nemerle.Compiler.TypesManager.ExpandMacros()
1> at Nemerle.Compiler.TypesManager.Run()
1> at Nemerle.Compiler.ManagerClass.Run()
1> at Nemerle.CommandlineCompiler.MainClass.main_with_catching()
1>Done building project "NLiquid.nproj" -- FAILED.
1>
1>1 error, 2 warnings.
Здравствуйте, ifle, Вы писали:
I>Создал проэкт, модуль, синтакс, получаю ошибку на совсем безобидном примере. Что не так?
У меня собирается.
Запусти RebuildBoot.cmd после чего пересобери нитру.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Извиняюсь, что сразу не заметил вопрос.
I>С чего начать? Что-то не нашёл как начинать свой проект на нитра.
1. Собрать Нитру. Инструкция здесь: https://github.com/rsdn/nitra/wiki/Nitra-Build-process
2. Создать проект с синтаксическим модулем и описанием языка. Это ты уже пытался сделать. Надо повторить еще раз. Вот инструкция.
3. Скомпилировать проект и получить длл со своим языком.
4. Создать солюшен с в Nitra.Vizsualizer.exe и добавить туда описание своего языка (которое будет в длл-и).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Не собирается последняя версия нитры.
Получаю такие ошибки:
Error Type 'DotNet.BaseTypeReferenceSet' does not contain any method marked with 'Nitra.Staging.CollectAttribute' attribute. Nitra.Grammar D:\Dev\GitHub\nitra\Nitra\Nitra.Grammar\AST\Language.nitra 28
Error Type 'DotNet.BaseTypeReferenceSet' does not contain any method marked with 'Nitra.Staging.CollectAttribute' attribute. Nitra.Grammar D:\Dev\GitHub\nitra\Nitra\Nitra.Grammar\AST\Language.nitra 29
Error Type 'DotNet.BaseTypeReferenceSet' does not contain any method marked with 'Nitra.Staging.CollectAttribute' attribute. Nitra.Grammar D:\Dev\GitHub\nitra\Nitra\Nitra.Grammar\AST\Members\Ast.nitra 24
Error Type 'DotNet.BaseTypeReferenceSet' does not contain any method marked with 'Nitra.Staging.CollectAttribute' attribute. Nitra.Grammar D:\Dev\GitHub\nitra\Nitra\Nitra.Grammar\AST\Members\Ast.nitra 25
Error Type 'DotNet.BaseTypeReferenceSet' does not contain any method marked with 'Nitra.Staging.CollectAttribute' attribute. Nitra.Grammar D:\Dev\GitHub\nitra\Nitra\Nitra.Grammar\AST\Members\AstMembers\AstMember.nitra 80
Error The "CreateZipPackage" task failed unexpectedly.
System.TypeLoadException: Could not load type 'Microsoft.VisualStudio.Setup.PartialManifestType' from assembly 'Microsoft.VisualStudio.Setup.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.
at Microsoft.VisualStudio.Sdk.BuildTasks.CreateZipPackageBase.Execute()
at Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute()
at Microsoft.Build.BackEnd.TaskBuilder.<ExecuteInstantiatedTask>d__26.MoveNext() CSharp.VisualStudio.Plugin
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, ifle, Вы писали:
I>>С чего начать? Что-то не нашёл как начинать свой проект на нитра.
VD>Если что можешь стучаться мне на Скайп: vc.rsdn.ru VD>Это будет оперативнее.
Спасибо.
Здравствуйте, ifle, Вы писали:
I>Не собирается последняя версия нитры.
Что-то ты сделал не так. Ты берешь мастер?
Надо проверить по шгам.
1. Что установлена последняя версия Немерла. Ее надо или собрать из исходников, или установить с сайта.
2. Очистить репозиторий. Лучше всего это сделать гитом. В ГитЭкстеншон для этого есть команда Command\Clean working directory...
3. Собрать бут запустив BuildBoot.cmd. При этом все копии VS нужно закрыть. И вообще закрыть все что может "держать" файлы.
4. После этого открыть NitraTools.sln и попробовать собрать.
Ну, и нужно проверить окружение. Какая версия студии стоит?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
VD>Что-то ты сделал не так. Ты берешь мастер?
Да
VD>Надо проверить по шгам. VD>1. Что установлена последняя версия Немерла. Ее надо или собрать из исходников, или установить с сайта.
Стоит последняя версия. Установил с сайта
VD>2. Очистить репозиторий. Лучше всего это сделать гитом. В ГитЭкстеншон для этого есть команда Command\Clean working directory...
Я заного клонировал репозиторий
VD>3. Собрать бут запустив BuildBoot.cmd. При этом все копии VS нужно закрыть. И вообще закрыть все что может "держать" файлы.
Собирается нормально
VD>4. После этого открыть NitraTools.sln и попробовать собрать.
NitraTools.sln компилируется нормально, падает Nitra-Stagt1.sln
VD>Ну, и нужно проверить окружение. Какая версия студии стоит?
VS2017 v15.3
То что у тебя был в первый раз больше похоже на какой-то клинч сборок.
А еще лучше поставь себе TeamViewer и по скайпу явки и пароли пришли, чтобы я очно глянул.
I>NitraTools.sln компилируется нормально, падает Nitra-Stagt1.sln
В принципе для начала роботы над языком этого достаточно. В Nitra-Stagt1.sln компилируются плагины для Студии. Они тебе пока что не сильно нужны.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, ifle, Вы писали:
VD>>>Ну, и нужно проверить окружение. Какая версия студии стоит? I>>VS2017 v15.3
VD>15.3? А он уже зарелизен? Или это превью?
Уже зарелизили 15.3, ASP.NET Core 2, .NET Core 2. .NET Standart 2
А как работать с Nitra.Visualizer.exe. Он завязан на клиент\сервер. Как их поднять?
Боюсь у тебя какой-нибудь пре-релиз в котором могут быть косяки.
15.2 пока апдэйт не предлагает.
I>А как работать с Nitra.Visualizer.exe. Он завязан на клиент\сервер? Как их поднять?
Просто запустить и все. Сервер он сам поднимет.
Если нужно будет отлаживать свой код, надо будет приатачиться отладчиком к серверу. Но это все в будущем. Пока что нужно минимально освоиться. Сделать первые шаги. Написать грамматику...
Сейчас тебе нужно сделать тестовый проект в Nitra.Visualizer.exe. Его настройка, это как раз самая косячная часть Nitra.Visualizer-а.
Твоя задача добиться запуска простейшего теста.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
VD>Боюсь у тебя какой-нибудь пре-релиз в котором могут быть косяки.
Я сегодня поставил.
VD>15.2 пока апдэйт не предлагает.
Они дозируют по регионам I>>А как работать с Nitra.Visualizer.exe. Он завязан на клиент\сервер? Как их поднять?
VD>Просто запустить и все. Сервер он сам поднимет
Получаю такой ассерт
Здравствуйте, ifle, Вы писали:
I>Получаю такой ассерт I>Image: nitra1.jpg
Это нормально. Ты текст то прочти. Просто жми Ignore (или Retry, если нужна отладка). Этот ассерт нужен, чтобы подключаться к серверу на ранних стадиях его загрузки.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, ifle, Вы писали:
VD>Это нормально. Ты текст то прочти. Просто жми Ignore (или Retry, если нужна отладка). Этот ассерт нужен, чтобы подключаться к серверу на ранних стадиях его загрузки.
Ну мне то это сообщение ни очём не говорит.
Создал тест, а он падает. Что-то не так видимо сделал.
А есть где-то описание, как работать с Nitra.Visualizer?
System.NullReferenceException occurred
HResult=0x80004003
Message=Object reference not set to an instance of an object.
Source=<Cannot evaluate the exception source>
StackTrace:
at Nitra.ClientServer.Messages.Config.Serialize(BinaryWriter writer)
at Nitra.ClientServer.Messages.ClientMessage.ProjectStartLoading.Serialize(BinaryWriter writer)
at Nitra.ClientServer.Client.NitraClient.Send(ClientMessage msg) in D:\Dev\GitHub\Nitra\Nitra\ClientServer\Nitra.ClientServer.Client\NitraClient.n:line 118
at Nitra.ViewModels.SolutionVm.Activate(NitraClient client) in D:\Dev\GitHub\Nitra\Nitra.TestsLauncher\ViewModels\SolutionVm.n:line 70
at Nitra.Visualizer.MainWindow.ActivateVm(IClientHost oldVm, IClientHost newVm, NitraClient client) in D:\Dev\GitHub\nitra\Nitra.Visualizer\MainWindow.xaml.cs:line 1239
at Nitra.Visualizer.MainWindow.ChangeCurrentTest(SuiteVm newTestSuite, SolutionVm newSolution, ProjectVm newProject, FileVm newTest) in D:\Dev\GitHub\nitra\Nitra.Visualizer\MainWindow.xaml.cs:line 992
at Nitra.Visualizer.MainWindow.ProcessSelectTestTreeNode(RoutedPropertyChangedEventArgs`1 e) in D:\Dev\GitHub\nitra\Nitra.Visualizer\MainWindow.xaml.cs:line 927
at Nitra.Visualizer.MainWindow._testsTreeView_SelectedItemChanged(Object sender, RoutedPropertyChangedEventArgs`1 e) in D:\Dev\GitHub\nitra\Nitra.Visualizer\MainWindow.xaml.cs:line 908
at System.Windows.RoutedPropertyChangedEventArgs`1.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
at System.Windows.UIElement.RaiseEvent(RoutedEventArgs e)
at System.Windows.Controls.TreeView.OnSelectedItemChanged(RoutedPropertyChangedEventArgs`1 e)
at System.Windows.Controls.TreeView.ChangeSelection(Object data, TreeViewItem container, Boolean selected)
at System.Windows.Controls.TreeViewItem.Select(Boolean selected)
at System.Windows.Controls.TreeViewItem.OnGotFocus(RoutedEventArgs e)
at System.Windows.UIElement.IsFocused_Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
at System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
at System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
at System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args)
at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType)
at System.Windows.DependencyObject.SetValueCommon(DependencyProperty dp, Object value, PropertyMetadata metadata, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType, Boolean isInternal)
at System.Windows.DependencyObject.SetValue(DependencyPropertyKey key, Object value)
at System.Windows.Input.FocusManager.OnFocusedElementChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
at System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
at System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
at System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args)
at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType)
at System.Windows.DependencyObject.SetValueCommon(DependencyProperty dp, Object value, PropertyMetadata metadata, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType, Boolean isInternal)
at System.Windows.Input.FocusManager.SetFocusedElement(DependencyObject element, IInputElement value)
at System.Windows.Input.KeyboardNavigation.UpdateFocusedElement(DependencyObject focusTarget)
at System.Windows.FrameworkElement.OnGotKeyboardFocus(Object sender, KeyboardFocusChangedEventArgs e)
at System.Windows.Input.KeyboardFocusChangedEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
at System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args)
at System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted)
at System.Windows.Input.InputManager.ProcessStagingArea()
at System.Windows.Input.InputManager.ProcessInput(InputEventArgs input)
at System.Windows.Input.KeyboardDevice.ChangeFocus(DependencyObject focus, Int32 timestamp)
at System.Windows.Input.KeyboardDevice.TryChangeFocus(DependencyObject newFocus, IKeyboardInputProvider keyboardInputProvider, Boolean askOld, Boolean askNew, Boolean forceToNullIfFailed)
at System.Windows.Input.KeyboardDevice.Focus(DependencyObject focus, Boolean askOld, Boolean askNew, Boolean forceToNullIfFailed)
at System.Windows.Input.KeyboardDevice.Focus(IInputElement element)
at System.Windows.UIElement.Focus()
at System.Windows.Controls.TreeViewItem.OnMouseLeftButtonDown(MouseButtonEventArgs e)
at System.Windows.UIElement.OnMouseLeftButtonDownThunk(Object sender, MouseButtonEventArgs e)
at System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
at System.Windows.UIElement.ReRaiseEventAs(DependencyObject sender, RoutedEventArgs args, RoutedEvent newEvent)
at System.Windows.UIElement.OnMouseDownThunk(Object sender, MouseButtonEventArgs e)
at System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
at System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args)
at System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted)
at System.Windows.Input.InputManager.ProcessStagingArea()
at System.Windows.Input.InputManager.ProcessInput(InputEventArgs input)
at System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)
at System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel)
at System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
at System.Windows.Application.RunDispatcher(Object ignore)
at System.Windows.Application.RunInternal(Window window)
at System.Windows.Application.Run(Window window)
at System.Windows.Application.Run()
at Nitra.Visualizer.App.Main()
Здравствуйте, ifle, Вы писали:
I>Создал тест, а он падает. Что-то не так видимо сделал.
Посмотрел код. Там баг связанный с тем, что не изменяется имя сюита (поле вверху диалога) и из-за этого при изменении "New suite" на что-т другое начинают лететь ислючения.
Можно создать сюит не меняя имени (т.е. оставить "New suite"), потом закрыть Визуалайзер и изменить имя получившейся директории.
Баг пока не пофиксил. Код писал не я, так что нужно время на изучение нюансов.
PS
Если хочешь, могу тебе через TeamViewer все настроить.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, ifle, Вы писали:
I>>А есть где-то описание, как работать с Nitra.Visualizer?
VD>http://rsdn.org/wiki/Nitra.Nitra.Visualizer-New-tests
Здорово. Создал тест, вроде всё нормально.
Здравствуйте, ifle, Вы писали:
I>Здравствуйте, VladD2, Вы писали:
VD>>Здравствуйте, ifle, Вы писали:
I>>>С чего начать? Что-то не нашёл как начинать свой проект на нитра.
VD>>Если что можешь стучаться мне на Скайп: vc.rsdn.ru VD>>Это будет оперативнее. I>Спасибо.
Постучался
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, ifle, Вы писали:
VD>>>http://rsdn.org/wiki/Nitra.Nitra.Visualizer-New-tests I>>Здорово. Создал тест, вроде всё нормально.
VD>Значит надо переходить к написанию грамматики, АСТ-а и маппинга.
Начал играться грамматикой. Пока блекаоут По немногу разберусь
VD>К сожалению, грамматики для этого языка нет. Так что придется восстанавливать ее по примерам с сайта.
Грамматики нету, но есть пример реализации на антрл3. Но для меня это как филькина граммота.
VD>Будет лучше, если ты заведешь для проекта отдельный репозиторий и дашь мне права на его изменения. Я тогда смогу помогать по мелочи.
Я послал тебе приглашение в гитхабе быть контрибутором.
Вроде читаю про нитру, но пока нет ясности с пробелами и новыми строчками.
Например есть такой пример грамматики : "{{" Name "}}"
1. Как скзазать парсеру, что это выражение должно быть только на одной строке
т.е текст
{{
firstName
}}
не валидный
2. Как разрешить парсеру подобный пример?
Здравствуйте, ifle, Вы писали:
I>Начал играться грамматикой. Пока блекаоут По немногу разберусь
Если до этого с грамматиками никогда дела не имел, надо для начала разобраться в этом вопросе.
I>Грамматики нету, но есть пример реализации на антрл3. Но для меня это как филькина граммота. I>
Это и есть грамматика, только немного в другом формате. Наша будет по проще, так как не нужен лексер и приседания с ним.
I>Я послал тебе приглашение в гитхабе быть контрибутором.
Агя, вижу. Добавился... скачал... смотрю.
Уже первую правку внес. Сделал путь (в тестах) относительным, чтобы не зависеть от конкретных путей.
Так же разбил тесты на разные солюшены. Наличие сложной структуры у тестов сделано для того чтобы можно было делать тесты эмулирующие многфайловые проекты и многопроктные солюшены. Для простых тестов надо каждый раз создавать отдельный солюшен. Иначе у тебя будут слишком много всего в оном тесте тестироваться.
Так что обновись.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, ifle, Вы писали:
I>В этом случае получается, что весь текст как Plain. Прям как голодный регекс всё сжирает
У нитры жадный неуступчивый парсер.
Any+ съест всё.
используй
(!"{{" !"}}" Any)+
в этом случае это правило не будет есть {{ и }}
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, ifle, Вы писали:
I>>Начал играться грамматикой. Пока блекаоут По немногу разберусь
VD>Если до этого с грамматиками никогда дела не имел, надо для начала разобраться в этом вопросе.
С грамматиками раньше дело не имел. Пользовался готовыми парсерами рослин, решарпер, но сам никогда неписал
I>>Я послал тебе приглашение в гитхабе быть контрибутором.
VD>Агя, вижу. Добавился... скачал... смотрю.
VD>Уже первую правку внес. Сделал путь (в тестах) относительным, чтобы не зависеть от конкретных путей.
VD>Так же разбил тесты на разные солюшены. Наличие сложной структуры у тестов сделано для того чтобы можно было делать тесты эмулирующие многфайловые проекты и многопроктные солюшены. Для простых тестов надо каждый раз создавать отдельный солюшен. Иначе у тебя будут слишком много всего в оном тесте тестироваться.
VD>Так что обновись.
Спасибо. Я только начал и пока там ничего нету. Я хочу с начала реализовать самый простой случай {{ property }} с парсингом и evaluation.
А потом буду по немногу усложнять.
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, ifle, Вы писали:
I>>В этом случае получается, что весь текст как Plain. Прям как голодный регекс всё сжирает WH>У нитры жадный неуступчивый парсер. WH>Any+ съест всё. WH>используй WH>(!"{{" !"}}" Any)+ WH>в этом случае это правило не будет есть {{ и }}
Почти regex.
Поясни пожалуста этот синтакс. Т.е я понимаю по твоему примеру, что он делает.
Но я не очень понимаю почему так, а не наоборот? (Any !"{{" !"}}" )+
Можно ли логически разбивать на AND, OR?
Здравствуйте, ifle, Вы писали:
I>Простые правила. I>В этом случае получается, что весь текст как Plain. Прям как голодный регекс всё сжирает
Все правильно. В Нитре парсер "жадный". Конструкция Any+ сожрет весь текст до конца файла.
Чтобы это не происходило нужно использовать предикты. Я там подправил грамматику (за основу взял АНТЛР-овскую грамматику и подправил ее чтобы использовать фичи Нитры).
syntax Content
{
| Atom
| Plain = (!Atom Any)+
}
syntax Atom
{
| Tag
| Output = "{{" s sm OutputExpr s sm "}}"
| Assignment = "{%" s sm "assign" s sm Name s sm "=" s sm Expr s sm Filter? "%}"
}
token Reference = IdentifierBody;
token Name = IdentifierBody;
они должны быть в любой грамматике.
IgnoreToken — определяет содержимое пробельных правил. В последствии в них можно будет загнать комментарии и т.п.
Name и Reference нужны для связывания имен (на следующем этапе).
Ну, и я там накидал корневые правила (по АНТЛР-овской грамматике).
Тебе надо осмыслить все это и продолжить развивать грамматику.
Что касается пробельных правил. Для этого языка, как я понимаю, пробельные правила важны. Ими лучше управлять вручную. Так что я добавил атрибут [ExplicitSpaces] прямо на синтаксический модуль. Это приводит к тому, что все вложенные правила как будут неявно помечены этим атрибутом.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.