Регулярные выражения
Единственный сложный случай представляет собой выражение, начинающееся с символа и звездочки, например х*. В этом случае мы осуществляем вызов matchstar, где первым аргументом является операнд звездочки (то есть х), а следующими аргументами – шаблон после звездочки и сам текст.
Здесь мы опять используем do-while – из-за того, что регулярному выражению х* может соответствовать и ноль символов. Цикл проверяет, совпадает ли текст с остатком регулярного выражения, пытаясь сопоставить их, пока первый символ текста совпадает с операндом звездочки.
Наша реализация получилась довольно простенькой, однако она работает и занимает всего лишь три десятка строк кода – можно утверждать, что для того, чтобы ввести в обращение регулярные выражения, не нужно применять никаких сложных средств.
Скоро мы представим некоторые соображения по расширению возможностей нашего кода, а пока напишем свою версию grep, использующую match. Вот как выглядит основная часть:
По соглашению программы на С возвращают 0 при успешном завершении и ненулевое значение – при различных сбоях. Наша программа Ф, так же как и Unix-версия, считает выполнение успешным, если ла найдена строка, соответствующая шаблону. Поэтому она возвращает 0, если было найдено хотя бы одно соответствие; 1 – если соответствий найдено не было, и 2 (посредством eprintf) – если произошла ошибка. Эти значения можно протестировать, использовав в качестве оболочки какую-то другую программу.