Лексический анализатор языка Васик
Анализатор написан на языке Ди. Исходные тексты последней версии можно посмотреть здесь.
Класс scanner_t
Класс scanner_t реализует последовательное чтение входного файла и преобразование его в поток лексем типа lexeme_t.
| Атрибуты и методы | Описание |
| scanner_t (string filename) | Конструктор, открывает указанный файл на чтение. |
| void forward () | Метод, читает следующую лексему и устанавливает атрибут token. |
| lexeme_t token | Атрибут, содержит последнюю прочитанную лексему. При достижении конца файла равен null. |
| string filename | Атрибут, содержит имя обрабатываемого файла. |
Пример использования класса scanner_t:
scanner_t scanner = new scanner_t ("program.vasic");
for (;;) {
scanner.forward ();
if (! scanner.token)
break;
if (scanner.token.type < 0) {
writefln ("%s:%d:%d: %s", scanner.filename,
scanner.token.line, scanner.token.column,
scanner.token.source);
break;
}
scanner.token.print (0);
}
Класс lexeme_t
| Атрибуты и методы | Описание |
| int type | Целое число, обозначающее тип лексемы. |
| int line, column | Номера строки и колонки, задающие позицию лексемы. |
| string source | Строка, содержащая исходный текст лексемы. |
| string text | Строка, содержащая имя (строчными буквами) для идентификатора или метки, а также значение для строки-литерала. |
| double number | Значение для числа-литерала. |
| void print () | Метод, печатает содержимое лексемы (на стандаартный вывод). |
Коды типа лексемы:
| -1 | Неопознанная лексема, текст ошибки находится в source |
| LEX_NUMBER | Число-литерал, значение находится в number |
| LEX_STRING | Строка-литерал, значение находится в text |
| LEX_NAME | Идентификатор, имя (строчными буквами) находится в text |
| LEX_LABEL | Метка, имя (строчными буквами) находится в text |
| LEX_LE | <= |
| LEX_GE | >= |
| LEX_NEQ | <> |
| Символы +, - и т.д. | Символы операций и прочие |