Использование UNIX для синтаксического и лексического анализа



         

Простейший пример Lex


Можно использовать Lex для извлечения слов из файла с последующей распечаткой их по одному в каждой строке. Это полезно при сортировке ввода для определения слова, чаще всего используемого в тексте. Нижеприведенный код Lex решает эту задачу:

word [A-Za-z][-A-Za-z']* eol \n %% {word} { printf ("%s\n", yytext);} {eol} ; . ; %%

Первым в структуре спецификаций Lex располагается набор определений. В этом примере я определил "word" как произвольную последовательность символов. После первого символа допускается наличие черточки или апострофа. Согласно определению, сокращенные и написанные через дефис слова рассматриваются как одиночные, не разделенные на отдельные компоненты. Как видим, определение регулярного выражения в качестве "word" довольно несложно.

Я также включаю определение конца строки. И таким образом получаю возможность отбрасывать символ конца строки. В противном случае, из-за того, что Lex тупо передает любые символы, которые не фильтруются потоком стандартного вывода, на экране появится множество посторонних новых строк. Аналогичным образом я объявляю любые другие игнорируемые непечатаемые символы. По такой схеме можно игнорировать, к примеру, знаки пунктуации.

После создания такого программного файла я обработал им черновик моей предыдущей главы. Первые 10 строк вывода приведены ниже:

Программа написана давайте сделаем ее быстрее после удаления всех ошибок

Ясно, что, подсчитывая слова, я должен отсортировать их и обработать с помощью uniq -с:




Содержание  Назад  Вперед