7.7. Operators

We could stop now and have a pretty useful scanner for our purposes. In the fragments of KISS that we've built so far, the only tokens that have multiple characters are the identifiers and numbers. All operators were single characters. The only exception I can think of is the relops <=, >=, and <>, but they could be dealt with as special cases.

Still, other languages have multi-character operators, such as the := of Pascal or the ++ and >> of C. So while we may not need multi-character operators, it's nice to know how to get them if necessary.

Needless to say, we can handle operators very much the same way as the other tokens. Let's start with a recognizer:

{ Recognize Any Operator }
function IsOp(c: char): boolean;
   IsOp := c in ['+', '-', '*', '/', '<', '>', ':', '='];

It's important to note that we don't have to include every possible operator in this list. For example, the paretheses aren't included, nor is the terminating period. The current version of Scan handles single-character operators just fine as it is. The list above includes only those characters that can appear in multi-character operators. (For specific languages, of course, the list can always be edited.)

Now, let's modify Scan to read:

{ Lexical Scanner }
Function Scan: string;
   while Look = CR do
   if IsAlpha(Look) then
      Scan := GetName
   else if IsDigit(Look) then
      Scan := GetNum
   else if IsOp(Look) then
      Scan := GetOp
   else begin
      Scan := Look;

Try the program now. You will find that any code fragments you care to throw at it will be neatly broken up into individual tokens.