====== Лексический анализатор языка Васик ====== Анализатор написан на языке Ди. Исходные тексты последней версии можно [[https://github.com/sergev/vasic/blob/master/src/scanner.d | посмотреть здесь]]. ==== Класс 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 | <> | | Символы +, - и т.д. | Символы операций и прочие |