Мелкий сценарист Командной строки (как команды AutoCAD) один строчный редактор

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

команда> Новый Счет-> создает новый счет

команда> клиентский профиль-> открывает клиентскую форму где проклятый идентификатор = CustID

команда> выполненный Конец Дня - выполняет конец дневного процесса

команда> scr 1020-> открывает идентификатор формы = 1020

Как я могу запустить? У меня нет проблемы рекомендации никаких сторонних компонентов (синтаксические анализаторы, средства анализа, и т.д.).

то, что отсутствует, является базовой структурой никакие детали, просто теория для реализации.

Спасибо, Objectberg

5
задан Objectsberg 24 March 2010 в 16:36
поделиться

8 ответов

Первый вопрос: если это ограниченное количество стандартных команд, почему бы просто не реализовать их с помощью меню?

Но если вам нужен настоящий сценарий, есть множество скриптовых движков, которые вы можете подключить к Delphi. Однако большинство из них основано на реальных языках программирования, что звучит немного сложнее, чем то, что вы ищете.

Если вы хотите создать свой собственный простой язык сценариев, вам потребуются некоторые знания теории синтаксического анализатора. Я бы порекомендовал заглянуть на сайт GOLD Parser , где есть некоторая теоретическая информация, а также некоторые инструменты, которые помогут вам установить свои собственные языковые правила. На сайте доступна реализация Delphi.

1
ответ дан 13 December 2019 в 05:33
поделиться

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

1
ответ дан 13 December 2019 в 05:33
поделиться

Я думаю, у TMS и Greatis есть скриптеры для этого.

1
ответ дан 13 December 2019 в 05:33
поделиться

Возможно, вам это понравится, возможно, нет. Но вообще-то звучит так, как будто вы тоже хотели бы получить некоторое базовое понимание. Вам может понравиться то, что я считаю классическим первым чтением о том, как создать компилятор, написанным Джеком Креншоу. Вы можете найти его по этому адресу. Это больше, чем то, что вы ищете, но она написана на Turbo Pascal, и ее изложение действительно интересно читать.

Удачи.

3
ответ дан 13 December 2019 в 05:33
поделиться

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

type
  TCommandRec = record
    Command: string;
    Proc: array(AArgs: TStringList);
  end;

const
  Commands: array(0..4) of TCommandRec = (
    (Command: 'New';      Proc: DoNew),
    (Command: 'Customer'; Proc: DoCustomer),
    (Command: 'Run';      Proc: DoRun),
    (Command: 'Scr';      Proc: DoScr),
    (Command: 'Find';     Proc: DoFind));

procedure RunScript(const AFileName: string);
var
  Script, Args: TStringList;
  i, j: Integer;
begin
  Script := TStringList.Create;
  try
    Script.LoadFromFile(AFileName);
    Args := TStringList.Create;
    try
      Args.Delimiter := ' ';
      for i := 0 to Script.Count - 1 do begin
        Args.DelimitedText := Script[i];
        for j := Low(Commands) to High(Commands) do
          if SameText(Args[0], Commands[j].Command) then begin
            Commands[j].Proc(Args);
            Break;
          end;
      end;
    finally
      Args.Free;
    end;
  finally
    Script.Free;
  end;
end;

procedure DoRun(AArgs: TStringList);
begin
  if SameText(AArgs[1], 'End-of-day') then
    RunEndOfDayProcess
  else if SameText(AArgs[1], 'Hourly') then
    RunHourlyProcess
  else
    raise EInvalidScript.Create;
end;

procedure DoFind(AArgs: TStringList);
var
  FindType: string;
begin
  if (AArgs.Count <> 5) or not SameText(AArgs[2], 'by') then
    raise EInvalidScript.Create;
  if SameText(AArgs[1], 'Cust') then begin
    if SameText(AArgs[3], 'Name') then
      FindCustomer(AArgs[4], '')
    else if SameText(AArgs[3], 'LastName') then
      FindCustomer('', AArgs[4])
  end
  else if SameText(AArgs[1], 'Contact') then begin
    ...
  end
  else
    raise EInvalidScript.Create;
end;

Если у вас есть несколько необязательных аргументов (например, НАЙТИ ИМЯ ПО ИМЕНИ John AND LASTNAME Smith ), тогда вместо жесткого кодирования смещения списка строк, как я сделал выше удалите каждый аргумент из списка строк по мере его обработки (или добавьте его в свой запрос). Таким образом, когда он пустой, вы знаете, что закончили со строкой, и вам нужно только посмотреть на AArgs [0] , чтобы увидеть, распознаете ли вы следующий бит.

3
ответ дан 13 December 2019 в 05:33
поделиться

Вы можете интегрировать Python с Python для Delphi . В демонстрациях есть "пример командной строки", если я правильно помню.

1
ответ дан 13 December 2019 в 05:33
поделиться

Строчный скрипт, подобный вашему предложению, не очень сложно написать, вы можете легко использовать tStringList, установить разделитель на пробел, установить свойство текста для каждая строка, затем нужно оценить первый элемент и передать остальные «параметры» в строке определенной функции. Если вы не соответствуете ожидаемым критериям, вы обрабатываете условие ошибки и прекращаете обработку скрипта.

Если вы ищете нечто большее, чем простой строковый скрипт, обратите внимание на PascalScript , который позволяет вам писать скрипты, используя знакомый язык паскаль.

1
ответ дан 13 December 2019 в 05:33
поделиться

Если вы серьезно относитесь к тому, чтобы «накрутить свое собственное», получите копию «Окончательной справки по ANTLR» Теренса Парра.

Он полностью ориентирован на Java, но дает хорошую основу для синтаксического анализа и генерирует код синтаксического анализатора, который действительно понятен.

Существует также коммерческий продукт ANTLR для Delphi, но я на самом деле его не пробовал.

1
ответ дан 13 December 2019 в 05:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: