Операционная система UNIX. Руководство программиста

       

Уловки анализа лексики


Некоторые решения, принимаемые лексическим анализатором, зависят от контекста. Например, лексический анализатор может игнорировать пробелы всюду, но не в текстах, взятых в кавычки, или имена могут включаться в таблицу в описаниях, но не в выражениях. Один из способов обработки таких ситуаций - использование глобального признака, устанавливаемого действиями и опрашиваемого лексическим анализатором. Например, спецификация

%{ int dflag; %} ... другие определения ... %% prog : decls stats ; decls : /* пусто */ { dflag = 1; } | decls declaration ; stats : /* пусто */ { dflag = 0; } | stats statement ; ... другие правила ...

описывает программу, состоящую из нуля или большего числа описаний, за которыми следует нуль или более операторов. Признак dflag равен 0, когда читаются операторы, и 1, когда читаются описания, за исключением первой лексемы в первом операторе. Эта лексема требуется алгоритму разбора для того, чтобы выяснить, что описания закончились и начались операторы.

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



Содержание раздела