Lexer распознает части идентификатора как ключевое слово - PullRequest
0 голосов
/ 11 июня 2018

Я сейчас пишу свой собственный лексер (и, в конечном итоге, парсер), и пока все работает нормально.Я могу распознать все, что мне нужно, за исключением того, что недавно я столкнулся с небольшой проблемой.Когда я ввожу идентификатор, такой как «символ», лексер выводит токен [ KEYWORD, "char" ] и другой токен [ IDENTIFIER, "acter" ].В настоящее время я обрабатываю вводимые данные: я ищу ключевые слова перед идентификаторами, поэтому что-то вроде int, которое является действительным для ключевого слова и идентификатора, назначается ключевому слову первым.Но когда идентификатор содержит ключевое слово в начале, он разделяет ID на две части: одну часть для ключевого слова и вторую часть для ID.Мне нужно, чтобы остаться как IDENTIFIER.Если какой-либо код требуется, я буду рад опубликовать его.

РЕДАКТИРОВАТЬ: Вот грамматика (правил синтаксического анализа еще нет) Примечание.перед идентификаторами они имеют приоритет.

КЛЮЧЕВЫЕ СЛОВА: «если» |"еще" |"пока" |"для" |"ложь" |"правда" |"перерыв" |«возврат» |"int" |"плавать" |"чар" |"строка" |"bool" |"пустота" |"null";

ИДЕНТИФИКАТОР: [a-zA-Z _] [a-zA-Z0-9 _] *;

INT_LITERAL: [0-9] +;

FLOAT_LITERAL: [0-9] + '.'[0-9] +

1 Ответ

0 голосов
/ 11 июня 2018

Я предполагаю, что ключевые слова являются подмножеством идентификаторов.

Вам не следует полагаться на лексер при поиске ключевых слов.Вместо этого ваш лексер должен жадно искать только идентификаторы, т. Е. Он должен соответствовать самой длинной последовательности символов, составляющих идентификатор.

Когда он находит один, вы должны проверить себя, является ли текст идентификатора одним изключевые слова.Если это так, верните токен KEYWORD, иначе верните токен IDENTIFIER.

...