У нас осталось последнее одно-символьное ограничение - ограничение операторов отношений. Некоторые из операторов отношений действительно состоят из одиночных символов, но другие требуют двух. Это '<=' и '>='. Я также предпочитаю Паскалевское '<>' для "не равно" вместо '#'.
Как вы помните, в главе 7 я указал, что стандартный способ работы с операторами отношений - включить их в список ключевых слов и позволить лексическому анализатору отыскивать их. Но, опять, это требует выполнение полного анализа выражения, тогда как до этого мы у нас была возможность ограничить использование сканера началом утверждения.
Я упомянул тогда, что мы все же можем избежать неприятностей с этим, так как много символьных операторов отношений немного и они ограничены в применении. Было бы легко обрабатывать их просто как специальные случаи и поддерживать их специальным способом.
Требуемые изменения влияют только на подпрограммы генерации кода и процедуры Relation и ее друзей. С начала, нам понадобятся еще две подпрограммы генерации кода:
{ 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;