Этот вопрос связан с другим вопросом, который я задал на сайте CS. Справочник
Я пробовал искать онлайн-заметки о курсах из разных университетов, чтобы найти ответ на проблему, с которой я столкнулся.
Мне нужно реализовать компилятор для пользовательского языка для задания. Этот язык содержит некоторые атомарные символы, такие как буквы английского алфавита и цифры. И мне удалось найти примеры для них, и они довольно просты. Например: Перейти на страницу 25
Однако этот язык также содержит зарезервированные слова, такие как if и for.
Вот тут у меня проблемы. Предположим, лексер пытается прочитать строку оператора if (expression). Если я использую такую реализацию, как стр. 4 он будет неправильно классифицировать if как идентификатор.
Итак, моя идея состоит в том, чтобы реализовать механизм просмотра вперед, чтобы до того, как лексер классифицирует и отправит в DFA то, что читается, он мог принять информированное и правильное решение.
Например: лексер встречает i. Поскольку i может принадлежать зарезервированному слову (if), лексер должен проверить наличие следующего символа. Если это f, то лексер должен убедиться, что на самом деле это не обычная строка, начинающаяся с if, например ifxyz.
Мне нравится эта идея, за исключением того, что мне не удалось найти ничего похожего, просматривая конспекты курсов в Интернете, что наводит меня на мысль, что, возможно, я делаю что-то не так.
ОБНОВЛЕНИЕ!! Это для тех, кто попал сюда через поиск, пытаясь найти решение. Прошло некоторое время, я действительно решил проблему, и ответ, указанный в комментариях, очень полезен. Предлагаю пойти прочитать.
Вот как я решил это:
СТАРТ(f) -> F
F(o) -> FO
FO(r) -> ДЛЯ
FOR(_) -> ИДЕНТИФИКАТОР
Более того, все состояния имеют свойство Lex As. Причина этого: предположим, что вы пришли в состояние F без каких-либо дополнительных входных данных. Следовательно, вы должны предположить, что это идентификатор (в большинстве языков). Следовательно, F.lexAs вернет правильную интерпретацию состояния, в данном случае IDENTIFIER.