В основном я не знаю от того, где запустить, я должен добавить сценарий строки для своего приложения, которое не является так сложным, только для выполнения заранее заданных команд, например:
команда> Новый Счет-> создает новый счет
команда> клиентский профиль-> открывает клиентскую форму где проклятый идентификатор = CustID
команда> выполненный Конец Дня - выполняет конец дневного процесса
команда> scr 1020-> открывает идентификатор формы = 1020
Как я могу запустить? У меня нет проблемы рекомендации никаких сторонних компонентов (синтаксические анализаторы, средства анализа, и т.д.).
то, что отсутствует, является базовой структурой никакие детали, просто теория для реализации.
Спасибо, Objectberg
Первый вопрос: если это ограниченное количество стандартных команд, почему бы просто не реализовать их с помощью меню?
Но если вам нужен настоящий сценарий, есть множество скриптовых движков, которые вы можете подключить к Delphi. Однако большинство из них основано на реальных языках программирования, что звучит немного сложнее, чем то, что вы ищете.
Если вы хотите создать свой собственный простой язык сценариев, вам потребуются некоторые знания теории синтаксического анализатора. Я бы порекомендовал заглянуть на сайт GOLD Parser , где есть некоторая теоретическая информация, а также некоторые инструменты, которые помогут вам установить свои собственные языковые правила. На сайте доступна реализация Delphi.
Вы можете посмотреть tcl. Это было его первоначальной целью - быть средой командного языка инструментов, которую можно было бы встроить в другую программу. Tcl предоставляет синтаксис языка с переменными и управляющими структурами (циклами и т. Д.). Вы должны добавить команды и функции tcl для доступа к функциям вашей программы.
Возможно, вам это понравится, возможно, нет. Но вообще-то звучит так, как будто вы тоже хотели бы получить некоторое базовое понимание. Вам может понравиться то, что я считаю классическим первым чтением о том, как создать компилятор, написанным Джеком Креншоу. Вы можете найти его по этому адресу. Это больше, чем то, что вы ищете, но она написана на Turbo Pascal, и ее изложение действительно интересно читать.
Удачи.
Если это достаточно просто (даже с необязательными аргументами), что-то, основанное на 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]
, чтобы увидеть, распознаете ли вы следующий бит.
Вы можете интегрировать Python с Python для Delphi . В демонстрациях есть "пример командной строки", если я правильно помню.
Строчный скрипт, подобный вашему предложению, не очень сложно написать, вы можете легко использовать tStringList, установить разделитель на пробел, установить свойство текста для каждая строка, затем нужно оценить первый элемент и передать остальные «параметры» в строке определенной функции. Если вы не соответствуете ожидаемым критериям, вы обрабатываете условие ошибки и прекращаете обработку скрипта.
Если вы ищете нечто большее, чем простой строковый скрипт, обратите внимание на PascalScript , который позволяет вам писать скрипты, используя знакомый язык паскаль.
Если вы серьезно относитесь к тому, чтобы «накрутить свое собственное», получите копию «Окончательной справки по ANTLR» Теренса Парра.
Он полностью ориентирован на Java, но дает хорошую основу для синтаксического анализа и генерирует код синтаксического анализатора, который действительно понятен.
Существует также коммерческий продукт ANTLR для Delphi, но я на самом деле его не пробовал.