СНОВА ОПЕРАТОРЫ ОТНОШЕНИЙ
У нас осталось последнее одно-символьное ограничение - ограничение операторов отношений. Некоторые из операторов отношений действительно состоят из одиночных символов, но другие требуют двух. Это '<=' и '>='. Я также предпочитаю Паскалевское '<>' для "не равно" вместо '#'.
Как вы помните, в главе 7 я указал, что стандартный способ работы с операторами отношений - включить их в список ключевых слов и позволить лексическому анализатору отыскивать их. Но, опять, это требует выполнение полного анализа выражения, тогда как до этого мы у нас была возможность ограничить использование сканера началом утверждения.
Я упомянул тогда, что мы все же можем избежать неприятностей с этим, так как много символьных операторов отношений немного и они ограничены в применении. Было бы легко обрабатывать их просто как специальные случаи и поддерживать их специальным способом.
Требуемые изменения влияют только на подпрограммы генерации кода и процедуры Relation и ее друзей. С начала, нам понадобятся еще две подпрограммы генерации кода:
Code: |
{---------------------------------------------------------------} { Set D0 If Compare was <= } procedure SetLessOrEqual; begin EmitLn('SGE D0'); EmitLn('EXT D0'); end; {---------------------------------------------------------------} { Set D0 If Compare was >= } procedure SetGreaterOrEqual; begin EmitLn('SLE D0'); EmitLn('EXT D0'); end; {---------------------------------------------------------------} |
Затем измените подпрограммы анализа отношений как показано ниже:
Code: |
{---------------------------------------------------------------} { Recognize and Translate a Relational "Less Than or Equal" } procedure LessOrEqual; begin Match('='); Expression; PopCompare; SetLessOrEqual; end; {---------------------------------------------------------------} { Recognize and Translate a Relational "Not Equals" } procedure NotEqual; begin Match('>'); Expression; PopCompare; SetNEqual; end; {---------------------------------------------------------------} { Recognize and Translate a Relational "Less Than" } procedure Less; begin Match('<'); case Look of '=': LessOrEqual; '>': NotEqual; else begin Expression; PopCompare; SetLess; end; end; end; {---------------------------------------------------------------} { Recognize and Translate a Relational "Greater Than" } procedure Greater; begin Match('>'); if Look = '=' then begin Match('='); Expression; PopCompare; SetGreaterOrEqual; end else begin Expression; PopCompare; SetGreater; end; end; {---------------------------------------------------------------} |
Это все, что требуется. Теперь вы можете обрабатывать все операторы отношений. Попробуйте.
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!