У меня есть заявка; Чтобы взаимодействовать с ним, я должен разработать интерактивную оболочку. Оболочка примет ввод от пользователя и отправит его на сервер, который обработает и вернет ответ.
В прошлом я делал такие вещи, но они обычно имели следующий формат:
Shell>> COMMAND arg1 arg2 arg3 ..
и моя реализация была похожа на:
/* Mock implementation */
while(true) {
in = readline()
tokens = in.split(' ') //split based on space
switch(token[0]) {
case "Command_a": processA(token[1], token[2])
case "Command_b": processB(token[1], token[2], token[3])
}
}
На этот раз я должен работать с более обширной грамматикой для пользовательского ввода. Если я использую свой текущий подход, это будет очень сложно с большим количеством if , if-elseif-else, if-else, switch
операторы для анализа и генерации ответа.
Как я могу подойти к этой проблеме таким образом, чтобы сделать переводчика модульным и обслуживаемым? Как реализован популярный CLI-интерфейс? Я буду очень признателен за некоторые примеры кода.
PS: выбор языка ограничен C ++ / Python
Вы можете разработать свой собственный синтаксический анализатор и интерпретатор, используя bison и flex, но, вероятно, разумнее встроить существующий интерпретатор, такой как Python, Lua или Squirrel.
Взгляни на повышение :: дух, или просто вставьте Lua, как предлагали другие.
CMD модуль в Python, возможно, с добавлением Pyparsing должен соответствовать вашим потребностям идеально.
Перейти к модулю cmd:
Класс Cmd обеспечивает простую структуру для написания ориентированных на строки интерпретаторов команд. Они часто полезны для тестовых наборов, административных инструментов и прототипов, которые позже будут обернуты в более сложный интерфейс.