Я создал lexer для одного простого языка программирования. Теперь вместо регулярных выражений (RegEx в Java) я использую детерминированные конечные автоматы. Автоматы отлично работают, за исключением того, что он не будет сообщать об ошибке, например, если бы у меня были модульные модули (оба модуля и облака - это ключевые слова) в исходном коде. Вместо этого он создавал бы два токена KW_MODULE и KW_CLOUDS. Можно утверждать, что я мог бы смотреть в будущее на пробел, если автоматы находятся в конечном состоянии для KW_MODULE. Но это не решило бы проблему, потому что на языке я мог бы иметь что-то вроде 8-6 (не разделенное белыми пробелами), которое правильно переводилось бы в токены INT DASH INT.Как обрабатывать пробелы в лексере, реализованные как конечные автоматы?
Я знаю, что это не хорошая идея для обработки белых пространств в грамматике анализатора.
Мои автоматы реализованы как матрица (строки - это состояния, а столбцы - символы из алфавита, ячейки - состояния перехода). Когда автоматы идут в конечном состоянии, я возвращаю автоматы, чтобы начать с начала.
Я считаю, проблема в том, что этот язык программирования не использует полуколоны. Например:
модуль; облака;
вместо этого используется белое пространство для разделения линий: модуль облака
спасибо заранее.
С уважением.
Не надо. Пожалуйста, у меня есть работа с такими языками программирования, как ваша. Я предлагаю НЕ использовать строки, столбцы или пробелы для нового языка программирования, что усложняет жизнь пользователям вашего языка программирования. – umlcat
«Я считаю, что проблема в том, что этот язык программирования не использует полуколоны». Нет, это потому, что вы неправильно выполнили свой лексер. Практически каждый сохранившийся язык программирования выше уровня ассемблера использует пробелы для разделения токенов. Вы сделали что-то не так. Не зная, что вы сделали, невозможно сказать, что вы сделали неправильно. – EJP
Спасибо за ответ. Мой лексер напрямую не обрабатывает пробелы (у меня нет пробела в алфавите лексера). Я сделал это специально для упрощения lexer. Но поскольку это вышло, это необходимо. Проблема в том, что некоторые токены не требуют пробела между ними, как я уже говорил выше. Поэтому мне нужно включить пробел для некоторых токенов, но не обязательно для других. Напр. для KW_ENV я должен сделать рег. ех. (среда) или (среда), а также для INT, (INT) или (INT) или (INT) или (INT). Спасибо, что заставил меня понять это. С уважением. – greensquare