Табличные лексеры — как насчет зарезервированных ключевых слов?

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


person Novicegrammer    schedule 21.03.2020    source источник
comment
Ответил здесь на Информатика   -  person rici    schedule 21.03.2020
comment
Если вы попали сюда с помощью поиска, этот ответ также может быть актуален.   -  person rici    schedule 21.03.2020


Ответы (1)


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

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

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

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

Ключевое слово DFA

person c.abate    schedule 21.04.2020
comment
С тех пор я решил проблему, и (как указано в комментариях к вопросу) это в значительной степени решение, которое я выбрал. - person Novicegrammer; 23.04.2020