4X_Pro
Руководитель Проекта
Настоящий Компьютерщик
Откуда: Москва Всего сообщений: 2994 Рейтинг пользователя: 79 Дата регистрации на форуме: 29 сен. 2001
|
Профиль | Сообщить модератору | ИгнорироватьNEW! Сообщение отправлено: 2 октября 2005 14:00 Сообщение отредактировано: 2 октября 2005 14:01
Собственно, так и не понял, в чем проблема. По идее, все сводится к написанию достаточно простого анализатора выражений, который разобьет командную строку на массив строк по пробелам (правда, придется учитывать символы кавычек и апострофов, а также производить замену $var на содержимое этой самой var).
Короче, работать это будет примерно так: в основном цикле идешь по строке и делаешь такой case:
while (i<strlen(buffer)) {
switch (buffer[ i ]) {
case " " : i=i+NextLine(buffer+i); break;
case "\\" : i=i+SpecialSymbol(buffer+i); break;
case "\" " : i=i+Quote(buffer+i); break;
case "$" : i=i+Variable(buffer+i); break;
else i=CommonChar(buffer+i); break;
}
}
Соответственно, функция Quote делает почти такой же парсинг, но без учета пробелов, зато выходит, если ей встретится символ ". Функция NextLine берет символ, стоящий по смещению 1 относительно buffer+i, выполняет преобразование в соответствии с обозначениями спецсимволов (это обработка всяких \n, \t, \", \') и засовывает в новый буфер. Функция CommonChar просто помещает текущий символ в новый буфер, а функция NextLine производит смену буфера в массиве.
Ну и естественно, по хорошему, надо бы добавить обработчики различных ошибочных ситуаций...
Оффтопик: Надо же, я наконец-то сам разобрался, как пишутся парсеры...
--- Каждый человек всегда может найти, чем он может быть полезен окружающим. Проблема только в одном: слишком многие не хотят это искать.
|