2012-05-16 5 views
2

Я создал lexer для одного простого языка программирования. Теперь вместо регулярных выражений (RegEx в Java) я использую детерминированные конечные автоматы. Автоматы отлично работают, за исключением того, что он не будет сообщать об ошибке, например, если бы у меня были модульные модули (оба модуля и облака - это ключевые слова) в исходном коде. Вместо этого он создавал бы два токена KW_MODULE и KW_CLOUDS. Можно утверждать, что я мог бы смотреть в будущее на пробел, если автоматы находятся в конечном состоянии для KW_MODULE. Но это не решило бы проблему, потому что на языке я мог бы иметь что-то вроде 8-6 (не разделенное белыми пробелами), которое правильно переводилось бы в токены INT DASH INT.Как обрабатывать пробелы в лексере, реализованные как конечные автоматы?

Я знаю, что это не хорошая идея для обработки белых пространств в грамматике анализатора.

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

Я считаю, проблема в том, что этот язык программирования не использует полуколоны. Например:

модуль; облака;

вместо этого используется белое пространство для разделения линий: модуль облака

спасибо заранее.

С уважением.

+2

Не надо. Пожалуйста, у меня есть работа с такими языками программирования, как ваша. Я предлагаю НЕ использовать строки, столбцы или пробелы для нового языка программирования, что усложняет жизнь пользователям вашего языка программирования. – umlcat

+0

«Я считаю, что проблема в том, что этот язык программирования не использует полуколоны». Нет, это потому, что вы неправильно выполнили свой лексер. Практически каждый сохранившийся язык программирования выше уровня ассемблера использует пробелы для разделения токенов. Вы сделали что-то не так. Не зная, что вы сделали, невозможно сказать, что вы сделали неправильно. – EJP

+0

Спасибо за ответ. Мой лексер напрямую не обрабатывает пробелы (у меня нет пробела в алфавите лексера). Я сделал это специально для упрощения lexer. Но поскольку это вышло, это необходимо. Проблема в том, что некоторые токены не требуют пробела между ними, как я уже говорил выше. Поэтому мне нужно включить пробел для некоторых токенов, но не обязательно для других. Напр. для KW_ENV я должен сделать рег. ех. (среда) или (среда), а также для INT, (INT) или (INT) или (INT) или (INT). Спасибо, что заставил меня понять это. С уважением. – greensquare

ответ

1

FWIW, синтаксические анализаторы, с которыми я работал, справляются с этой проблемой, требуя, чтобы ключевые слова также были правильными идентификаторами, как определено в грамматике.

Так, например, если у вас есть идентификаторы, определенные как символ, необязательно сопровождаемый большим количеством символов или цифр, любое ключевое слово также должно вписываться в эту форму. Лексер тогда рассматривает только токен как потенциальное ключевое слово, если оно уже было классифицировано как идентификатор.

Мне было бы интересно услышать, как другие справляются с этой проблемой.

+0

Спасибо за ответ. Я знаю, что вы имеете в виду, но я забыл упомянуть, что исходный код состоит из двух частей: среда (где вы определяете облака, самолет, поле посадки, дорожки и т. Д.), А затем приходит исходный код с перемещением по плоскости, утверждения , идентификаторы и т. д. Итак, в среде нет никаких идентификаторов, и поэтому модульные области не будут распознаваться как идентификатор. – greensquare

Смежные вопросы