[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

13.2 GPC's Lexical Analyzer

The source file `gpc-lex.c' contains the so-called lexical analyzer of the GNU Pascal compiler. (For those of you who know `flex': This file was not created using `flex' but is maintained manually.) This very-first stage of the compiler (after the preprocessor which is a separate executable) is responsible for reading what you have written and dividing it into tokens, the "atoms" of each computer language. The source `gpc-lex.c' essentially contains one large function, `yylex()'.

Here is, for example, where the real number `3.14' and the subrange `3..14' are distinguished, and where Borland-style character constants like `#13' and `^M' are recognized. This is not always a trivial task, for example look at the following type declaration:

 
type
  X = ^Y;
  Y = packed array [^A .. ^B] of Char;
  Z = ^A .. ^Z;

If you wish to know how GPC distinguishes the pointer forward declaration `^Y' and the subrange `^A..^Z', see `gpc-lex.c', function `yylex()', `case '^':' in the big `switch' statement.

There are several situation where GPC's lexical analzyer becomes context-sensitive. One is described above, another example is the token `protected', a reserved word in ISO-10206 Extended Pascal, but an ordinary identifier in ISO-7185 Pascal. It appears in parameter lists

 
procedure foo (protected bar: Integer);

and says that the parameter `bar' must not be changed inside the body of the procedure.

OTOH, if you write a valid ISO-7185 Pascal program, you can declare a parameter `protected':

 
procedure foo (protected, bar: Integer);

Here both standards contradict each other. GPC solves this problem by checking explicitly for "protected" in the lexical analyzer: If a comma or a colon follows, this is an ordinary identifier, otherwise it's a reserved word. Having this, GPC even understands

 
procedure foo (protected protected: Integer);

without losing the special meaning of `protected' as a reserved word.

The responsible code is in `gpc-lex.c' -- look out for `PROTECTED'.

If you ever encouter a bug with the lexical analyzer -- now you know where to hunt for it.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

This document was generated by Frank Heckenbach on May, 10 2002 using texi2html