Разработка интерактивной оболочки

У меня есть заявка; Чтобы взаимодействовать с ним, я должен разработать интерактивную оболочку. Оболочка примет ввод от пользователя и отправит его на сервер, который обработает и вернет ответ.

В прошлом я делал такие вещи, но они обычно имели следующий формат:

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

4 ответа

Решение

Вы можете разработать свой собственный синтаксический анализатор и интерпретатор, используя bison и flex, но, вероятно, разумнее встроить существующий интерпретатор, такой как Python, Lua или Squirrel.

Модуль cmd в Python, возможно, с добавлением Pyparsing, должен идеально соответствовать вашим потребностям.

Взгляните на boost::spirit или просто вставьте Lua, как предлагали другие.

Перейти к модулю cmd:

Класс Cmd обеспечивает простую структуру для написания линейно-ориентированных командных интерпретаторов. Они часто полезны для тестовых наборов, административных инструментов и прототипов, которые позже будут обернуты в более сложный интерфейс.

Другие вопросы по тегам