Простейший лексический анализатор
Простейший лексический анализатор можно построить, не прибегая ни к каким формальным методам, просто анализируя последовательности символов, образующих лексические единицы. Соответствующий пример приведен в файле 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; }