Re[2]: Написание DSL на Nemerle и создание Enum в макросах
От: CodingUnit Россия  
Дата: 03.02.10 15:36
Оценка:
Здравствуйте, VladD2, Вы писали:

CU>>Вопрос такой, как определить перечисление в макросе и добавить как подтип в классе?


VD>Что-то вроде этого:

VD>
VD>[MacroUsage(MacroPhase.BeforeTypedMembers,MacroTargets.Class,Inherited=true)]  
VD>macro statemachine(ty : TypeBuilder)
VD>{
VD>  // генерируем список определений полей перечисления
VD>  def cases = ty.DeclaredNestedTypes.Map(t => <[ decl: | $(t.ParsedName : name); ]>);

VD>  def enumTypeBuilder = ty.DefineNestedType( // вложенные типы нужно добавлять только с помощью DefineNestedType
VD>    <[ decl:
VD>        public enum StateID
VD>        {
VD>          ..$cases
VD>        }
VD>    ]>, true);
  
VD>  enumTypeBuilder.Compile();
VD>}
VD>


спасибо, работает!

CU>>И последний вопрос, если писать DSL то потребуется много ключевых слов, при этом они как то должны взаимодействовать между собой, проходит синтаксические и семантические проверки, для этого надо чтобы текст разбирался и получалось некое описание на DSL, для этого нужен какой то объект который хранит в себе все состояние описанной структуры, то есть должен быть доступен на этапе компиляции и при вызове макроса через помеченные объекты или описание в методе, добавлять информацию в этот объект, то есть должен создаваться один раз и жить в остальное время.


VD>Это все очень сильно зависит от задачи говорить о чем-то в ообщем невозможно.


CU>>Еще может потребоваться некоторые члены удалять, которые не несут в себе никакой информации для приложения, например классы для описания вложенной иерархии нужные макросу, но ненужные в рантайме, было бы хорошо удалить чтобы они были не видны, но TypeBuilder допускает объявлять члены, но не допускает удалять и многие внутренние поля компилятора read-only, можно ли решить как то эту задачу?


VD>Удалаять нельзя. Но нужную метаинформацию можно описать в другом виде. Например в виде доп-синтаксиса, или в виде мета-атрибутов.


VD>В общем, лучше опиши стоящую задачу (без ее реализации), а мы попробуем как ее лучше реализовать.


Задача такова, есть библиотека описания автоматов состояний в коде аналогичным в UML, проблема в том что описание структуры автомата сложно читаемое и создаваемое вручную, хотелось бы автоматизировать этот процессс за счет макросов и DSL, я уже видел решение подобной задачи в Boo, но хотелось бы попробовать сделать такое решение на Nemerle, под нужную библиотеку, там имеются разные процедуры для описания иерархии автомата, хотелось бы например сделать иерархическое визуальное описание иерархии, например:


[statemachine]
class TestFSM
{

  [state]
  class Top
  {
    
    [state]
    class Start
    {
       
      [state]
      class Sub
      {
       entry() : void
       {
        // действие при входе
       }
       exit() : void
       {
        // действие при выходе
       }
      } 
    }
    
    [state]
    class Next
    {
      transition("Sub",UserEvt) // описание перехода
    }
  }
}


как то так, на Boo там вообще абстрактно описали автомат, типа

state @Parked:
    when @EngineStarted      >> @IdleInNeutral
    
state @IdleInNeutral:
    when @EngineKilled       >> @Parked
    when @GearEngaged        >> @IdleInGear
    
state @IdleInGear:
    when @GearDisengaged     >> @IdleInNeutral
    when @GasApplied         >> @RacingAlong

state @RacingAlong:
    when @BrakeApplied       >> @IdleInGear
    when @CarCrashedIntoTree >> @CarDestroyed

state @CarDestroyed


хотелось бы что то подобное создать и переводить все это на этапе компиляции в вызовы соответствующих методов в библиотеке автомата для инициализации, главная проблема в легком описании на каком то DSL или псевдоязыке, метааттрибутов, какие могут быть возможнные решения?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.