Анализатор написан на языке Ди. Исходные тексты последней версии можно посмотреть здесь.
Класс 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); }
| Атрибуты и методы | Описание |
|---|---|
| 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 | <> |
| Символы +, - и т.д. | Символы операций и прочие |