У нас есть графический дизайнер, теперь им нужен текстовый дизайнер. Предложения? - PullRequest
4 голосов
/ 05 ноября 2008

Извините, я не мог придумать лучшего названия.

Проблема заключается в следующем:

Для нашего клиента мы создали (как часть более крупного приложения) графический дизайнер, который они могут использовать для построения "сценариев".

Эти сценарии состоят из «Композитов», которые, в свою очередь, состоят из "Команды". Все эти командные объекты являются производными от CommandBase и реализовать интерфейс под названием ICompilable.

Класс сценария также реализует ICompilable. Когда вызывается Compile () по команде возвращается массив байтов, который затем можно отправить на устройство для чего они предназначены (не могу раскрыть много информации об этом оборудовании, извините)

Просто чтобы дать вам представление:

var scenario = new Scenario();

scenario.Add(new DelayCommand(1));
scenario.Add(new CountWithValueCommand(1,ActionEnum.Add,1));
scenario.Add(new DirectPowerCommand(23,false,150));
scenario.Add(new WaitCommand(3));
scenario.Add(new DirectPowerCommand(23,false,150));
scenario.Add(new SkipIfCommand(1,OperatorEnum.SmallerThan,10));
scenario.Add(new JumpCommand(2));

byte[] compiledData = scenario.Compile();

Графический дизайнер абстрагирует все это от пользователя и позволяет ему (или ей) просто перетаскивать по капле композиты на дизайнерскую поверхность. (Композиты могут группировать команды, чтобы мы могли предоставить строительные блоки для возврата задач)

Недавно наш клиент пришел к нам и сказал: «Ну, дизайнер действительно классный, но у нас есть люди, которые предпочли бы какой-то язык программирования, просто что-то простое. "

(Простой для них, конечно)

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

Я понятия не имею, с чего начать или какие у меня есть варианты (не нарушая того, что имеем)

Я слышал о людях, внедряющих такие языки, как Python, люди пишут на своем языке парсеры и т.д ...

Есть предложения?

PS: пользователи работают только с композитами, но не с командами. Композиты загружаются динамически во время выполнения (вместе с их графическим дизайнером) и могут быть предоставлены третьими лицами в отдельных сборках.

Ответы [ 6 ]

4 голосов
/ 05 ноября 2008

Из того, что я думаю, я понял, у вас есть два варианта

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

Ваши альтернативы - да, вы могли бы встроить язык, но вам действительно нужно, разве это не излишне, и как вы можете его контролировать?

Если вам нужен только очень простой синтаксис, то, возможно, напишите свой собственный язык. На самом деле не так сложно создать простой интерпретатор, если у вас строгий, недвусмысленный язык. Посмотрите примеры компиляторов, которые вы используете, c #?

Я написал очень простой интерпретатор в Java в универе, это было не так сложно, как вы думаете.

2 голосов
/ 05 ноября 2008

Если вы действительно хотите использовать простой язык, вам нужен «парсер рекурсивного спуска».

Например, такой язык:

SCENARIO MyScenario
DELAY 1
COUNT 1 ADD 1
DIRECT_POWER 23, False, 150
WAIT 3
...
END_SCENARIO

У вас может быть такая грамматика:

scenario :: 'SCENARIO' label newline _cmds END_SCENARIO
cmds::  _delay or _count or _direct_power or...
delay:: 'DELAY' number

Что дает код вроде:

def scenario():
    match_word('SCENARIO')
    scenario_name = match_label()
    emit('var scenario = new Scenario();')
    cmds()
    match_word('END_SCENARIO')
    emit('byte[] ' + scenario_name + ' = scenario.Compile();')

def delay():
    match_word('DELAY')
    length = match_number()
    emit('scenario.Add(new DelayCommand('+ length +'))')

def cmds():
    word = peek_next_word()
    if word == 'DELAY':
       delay()
    elif ...
2 голосов
/ 05 ноября 2008

Это выглядит как идеальный сценарий для простого DSL. См. http://msdn.microsoft.com/en-us/library/bb126235(VS.80).aspx для получения дополнительной информации.

Вы также можете использовать язык сценариев, такой как lua.Net.

1 голос
/ 05 ноября 2008

Чтобы добавить к комментарию С. Лотта, вот как вы оцениваете скрипт Python из C #

1 голос
/ 05 ноября 2008

Вот решение Pythonic для создания DSL, которое вы можете использовать для компиляции и создания массивов байтового кода.

  1. Напишите простой модуль, который сделает ваши структуры C # доступными для Python. Цель состоит в том, чтобы определить каждый класс C #, с которым пользователям разрешено работать (композиты или команды или что-то еще), как класс Python.

    Обычно это включает в себя реализацию минимального набора методов с различными преобразованиями из типов C # в собственные типы Python и наоборот.

  2. Напишите несколько хороших демонстраций, показывающих, как использовать эти определения классов Python для создания своих сценариев. Вы должны иметь возможность создавать такие вещи в Python.

    import * from someInterfaceModule
    scenario= Scenario(
        Delay(1),
        Repeat( Range(10),
            DirectPower( 23, False, 150),
            Wait(3),
            DirectPower( 23, False, 150)
        )
    )
    scenario.compile()
    

Это относительно простые классы для определения. Каждый класс здесь достаточно просто реализовать как модули Python, которые напрямую вызывают ваши базовые модули C #.

Синтаксис - чистый Python, без дополнительного анализа или лексического сканирования.

0 голосов
/ 05 ноября 2008

Хотя создание этого мини-языка и его кодирование может быть очень увлекательным, реальные вопросы, которые вам нужно задать:

  1. Каково экономическое обоснование для добавления этой функции / средства?
  2. Кто будет платить за эту функцию?
  3. Кто собирается "подписать" эту функцию, если вы ее построите?

«Действительно аккуратные» функции могут быть созданы, когда реальность может указывать, что истинный ответ на такой запрос - «нет».

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

Приветствия

-R

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