Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
1 / 3 / 2
Регистрация: 22.12.2016
Сообщений: 144

Реализация команд для своего командного интерпретатора

17.06.2018, 01:00. Показов 4552. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
namespace Commands
{
    class Program
    {
        static void Main()
        {
            while (true)
                ConsoleCom.Command(Console.ReadLine());
        }
 
    }
    internal static class ConsoleCom
    {
        private static readonly Dictionary<string, string> ComDictionary = new Dictionary<string, string>
        {
            {"exit", "Exit"},
            {"cls", "Clear"}
        };
 
        public static void Command(string command)
        {
            if (!ComDictionary.ContainsKey(command))
            {
                Console.WriteLine("Error");
                return;
            }
            switch (ComDictionary[command])
            {
                case "Exit":
                    Environment.Exit(0);
                    return;
                case "Clear":
                    Console.Clear();
                    return;
            }
        }
    }
}
Требуется реализовать свой командный интерператор, некоторые команды реализовал используя dictionary и case , осталось реализовать 2-е команды cd и mkdir, всё бы ничего, но они принимают параметры, к примеру cd d:/ и mkdir TestFolder
Так вот, как парсить аргументы(параметры) команды? Всё должно быть реализовано используя труЪ ООП
Если использовать для команд [switch/case] , [if/else] , String.split[0..n] , то препод нехило пригорает, ведь это не оопе и т.д
Как максимально красиво реализовать команды для своего интерпретатора?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.06.2018, 01:00
Ответы с готовыми решениями:

Написание командного интерпретатора на C++
Добрый день! я очень надеюсь на вашу помощь! при компиляции программы высвечивает ошибки и я никак не могу найти. вот код программы: ...

Разработка командного интерпретатора
Добрый день, ребят помогите пожалуйста написать командный интерпретатор на с++

Код командного интерпретатора на С++
Добрый день всем! Нужен командный интерпретатор под любую ОС только написанная на С++. может и кого-то уже есть готовый и если не жалко то ...

2
Эксперт .NET
 Аватар для Usaga
14307 / 9388 / 1355
Регистрация: 21.01.2016
Сообщений: 35,407
17.06.2018, 05:50
Цитата Сообщение от mastercard Посмотреть сообщение
Так вот, как парсить аргументы(параметры) команды?
Вам поможет конечный автомат. Ищите примеры реализации парсеров, их много.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
18.06.2018, 15:47
Цитата Сообщение от mastercard Посмотреть сообщение
Как максимально красиво реализовать команды для своего интерпретатор
Создаем базовый класс для команд с двумя абстрактными методами TryParse и Execute:
CommandBase
C#
1
2
3
4
5
6
    //base abstract class for commands
    abstract class CommandBase
    {
        public abstract bool TryParse(string str);
        public abstract void Execute();
    }


Далее, создаем реализацию команд - по одному классy на каждую команду:
Commands
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
    class ExitCommand : CommandBase
    {
        public override bool TryParse(string str)
        {
            return str.Split(' ')[0].ToLower() == "exit";
        }
 
        public override void Execute()
        {
            Environment.Exit(0);
        }
    }
 
    class ClearCommand : CommandBase
    {
        public override bool TryParse(string str)
        {
            return str.Split(' ')[0].ToLower() == "cls";
        }
 
        public override void Execute()
        {
            Console.Clear();
        }
    }
 
    class CdCommand : CommandBase
    {
        private string[] parts;
 
        public override bool TryParse(string str)
        {
            parts = str.Split(' ');
            return parts[0].ToLower() == "cd";
        }
 
        public override void Execute()
        {
            if (parts.Length == 0) throw new Exception("Syntax error: path expected");
            Environment.CurrentDirectory = Path.Combine(Environment.CurrentDirectory, parts[1]);
        }
    }
 
    class MkDirCommand : CommandBase
    {
        private string[] parts;
 
        public override bool TryParse(string str)
        {
            parts = str.Split(' ');
            return parts[0].ToLower() == "mkdir";
        }
 
        public override void Execute()
        {
            if (parts.Length == 0) throw new Exception("Syntax error: dir name expected");
            Directory.CreateDirectory(parts[1]);
        }
    }


Создаем класс для командного интерпретатора:
Shell
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
    //command shell
    class Shell
    {
        private List<CommandBase> commands = new List<CommandBase>
        {
            new ExitCommand(),
            new ClearCommand(),
            new CdCommand(),
            new MkDirCommand()
        };
 
        public void Start()
        {
            //infinte command loop
            while (true)
            try
            {
                //prompt
                Console.Write("{0}>", Environment.CurrentDirectory);
                //read and execute commands
                Execute(Console.ReadLine());
            }
            catch (Exception ex)
            {
                //write error message
                Console.WriteLine(ex.Message);
            }
        }
 
        void Execute(string str)
        {
            //enumerate commands and try to parse and execute them
            foreach(var com  in commands)
            if (com.TryParse(str))
            {
                com.Execute();
                return;
            }
 
            throw new Exception("Syntax error: unknown command");
        }
    }


И наконец класс Program:
Program
C#
1
2
3
4
5
6
7
8
    class Program
    {
        static void Main(string[] args)
        {
            //create and start command shell 
            new Shell().Start();
        }
    }


0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.06.2018, 15:47
Помогаю со студенческими работами здесь

Язык командного интерпретатора CMD
Всем доброго/ой утра, дня, вечера/ночи! Вопрос следующего характера: необходимо в командной строке windows вывести список файлов по 4 слова...

Изменить конфигурационные файлы командного интерпретатора
Здравствуйте, помогите пожалуйста! Задание: Изменить конфигурационные файлы командного интерпретатора чтобы в конце сеанса работы...

Изменить конфигурационный файл командного интерпретатора
Очень нужна помощь. В задаче требуется изменить конфигурационный файл командного интерпретатора, чтобы формировалась динамически...

Изменить конфигурационный файл командного интерпретатора / Shell, Bash
Изменить конфигурационные файлы вашего командного интерпретатора таким образом, что бы формировался журнал работы пользователя с системой...

Изменить конфигурационный файл командного интерпретатора / Shell, Bash
Необходимо написать скрипт. К сожалению нету времени что бы разобраться. Помогите кто может. Помогите пожалуйста Изменить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru