Ваш основной цикл:
- читать строку (используйте
fgets(3)
для простой оболочки, readline(3)
для красивой)
- разобрать команду
- разветвить и выполнить трубопроводы
Для разбора команды есть два общих варианта. Напишите парсер рекурсивного спуска или используйте yacc(1)
для его генерации. Намного проще вывести исходный парсер с помощью yacc
, но вы можете полностью застрять в его отладке, и он действительно хочет быть свободным от контекста. Я предпочитаю рекурсивный спуск, но почти все в мире предпочитают использовать yacc. (Технически, bison
.) Если оболочка действительно очень проста, например оболочка для домашней работы, yacc может быть излишним.
Для проведения лексического анализа вы также можете свернуть свой собственный или использовать flex.
Вам не нужно будет использовать какие-либо темы.