Этот вопрос связан с другим вопросом, который я задал на сайте 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.