Лексеры с настольным приводом - PullRequest
1 голос
/ 21 марта 2020

Этот вопрос связан с другим вопросом, который я задал на сайте CS. Ссылка

Я пытался искать в онлайновых заметках о курсах из разных университетов, чтобы найти ответ на проблему, с которой я столкнулся.

Мне нужно внедрить компилятор для пользовательского языка для назначения. Этот язык содержит символы atomi c, такие как буквы алфавита Engli sh и цифры. И мне удалось найти примеры для них, и они довольно просты. Например: Go до 25

Однако этот язык также содержит зарезервированные слова , такие как , если и для .

Здесь у меня проблемы. Предположим, что лексер пытается прочитать строку « if ( выражение ) оператор». Если я использую реализацию, такую ​​как , она будет некорректно классифицировать , если в качестве идентификатора.

Так что моя идея состоит в том, чтобы реализовать механизм "lookahead", чтобы перед lexer классифицирует и отправляет в DFA то, что читает, он может принять обоснованное, правильное решение.

Например: лексер встречает i . Поскольку i может принадлежать зарезервированному слову (, если ), лексеру следует проверить наличие следующего символа . Если это f , то лексер должен убедиться, что это на самом деле не нормальная строка, которая начинается с , если , как ifxyz.

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

ОБНОВЛЕНИЕ !! Это для тех, кто получил здесь с помощью поиска пытается найти решение. Прошло много времени, я на самом деле решил проблему, и ответ в комментариях очень полезен . Я предлагаю вам go прочитать.

Вот как я решил эту проблему:


START (f) -> F

F ( o) -> FO

FO (r) -> FOR

FOR (_) -> ИДЕНТИФИКАТОР

Кроме того, все состояния имеют "Lex As" имущество. Причина этого: предположим, что вы пришли в состояние F без дальнейшего ввода. Следовательно, вы должны предполагать, что это идентификатор (в большинстве языков). Следовательно, F.lexAs вернет правильную интерпретацию состояния, в данном случае, IDENTIFIER.

1 Ответ

1 голос
/ 22 апреля 2020

Ваш пример на самом деле похож на DFA сам по себе. К сожалению, нет простого способа решить эту проблему, кроме жесткого кодирования ключевых слов в используемом DFA.

Для примера if я бы сделал тип токена с именем IF, который отличается от вашего типа ID.

Теперь вы должны изменить свой DFA, чтобы принять IF токен. Если мы находимся в начальном состоянии и читаем i, DFA не должен начинать нормальный путь ID, он должен go по отдельному пути.

Вот пример DFA для интерпретации только IF и ID токены и допускаются только символы a-z.

Keyword DFA

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...