Курс Основы построения трансляторов

       

Простейший лексический анализатор


Простейший лексический анализатор можно построить, не прибегая ни к каким формальным методам, просто анализируя последовательности символов, образующих лексические единицы. Соответствующий пример приведен в файле hardlex.cpp. Из приведенного ниже фрагмента видно, что программа "зацепляет" первый символ, определяющий начало лексической единицы (букву, цифру и т.д.)  а затем просматривает строку до конца элемента лексики (идентификатора, константы). Некоторые лексические единицы при этом имеют еще и собственное значение, которое выходит за рамки алгоритма распознавания. Например, для идентификатора и константы важен не только факт их распознавания, но и их значение, заключенное в цепочке символов. Поэтому анализатор перед началом очередного цикла фиксирует начало распознаваемой последовательности символов, для сохранения ее значения.

while (1)

      { fix=i;

        switch(s[i])

            {

case '"':   // Распознавание строковой константы ". . ."

            // с двойными "" внутри

mmm:        i++; while (s[i] !='"') i++;

            i++; if (s[i]=='"') goto mmm;

            lexem(1); break;

case '/':   i++;      // Распознавание / и /*

            if (s[i]!='*')

                  { lexem(14); break; }

            // Распознавание комментария /* ... */

n1:         while (s[i] !='*') i++;

            i++; if (s[i]=='/')

                  { i++; lexem(2); break; }

            goto n1;

case '+':   i++;      // Распознавание += и +

            if (s[i]=='=')

                  { i++; lexem(5); }

            else  lexem(15);

            break;

case '<':   i++;      // Распознавание << и < 

if (s[i]=='<')

                  { i++; lexem(6); }

            else      lexem(16); break;

default:    if (isalpha(s[i]))

            // Распознавание идентификатора

{ i++; while (isalpha(s[i])) i++;

              lexem(11); break; }

            // Распознавание константы

            if  (isdigit(s[i]))

                  { i++; while (isdigit(s[i])) i++;

                  lexem(12); break; }

     



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