Разработка компиляторов

       

Построение лексического анализатора по регулярному выражению


По имеющемуся регулярному выражению легко написать лексический анализатор вручную. Ниже приведен пример лексического анализа идентификатора, взятый из демонстрационного компилятора C-бемоль.

if (Char.IsLetter (src [pos]) || src [pos] == '_') { int fst = pos; do ++ pos; while (pos != src.Length && (Char.IsLetterOrDigit (src [pos]) || src [pos]=='_')); string name = src.Substring (fst, pos - fst); object tag = keys_table [name]; if (tag != null) return new Token.Single (new Coor (fname, fst, pos), (Token.Tag) tag); return new Token.Ident (new Coor (fname, fst, pos), name); }

В этом фрагменте производятся следующие действия:

  • анализ первого символа (буква или символ подчеркивания?)
  • продвижение вперед по исходной строке, покуда мы встречаем буквы, цифры или символ подчеркивания
  • проверка, не является ли разобранный идентификатор ключевым словом?
  • если это действительно ключевое слово, то выдается соответствующий лексический класс (ключевое слово, Single), вместе с привязкой к исходному тексту и точным значением ключевого слова
  • если это не ключевое слово, то это идентификатор, который и выдается вместе с привязкой к исходному тексту и его именем.



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