Как я могу обнаружить и обработать некоторый недействительный токен, который не указан в шаблонах в программе Lex? - PullRequest
1 голос
/ 02 апреля 2019

Я делаю домашнее задание по созданию лексического анализатора с помощью Flex.

Я должен преобразовать какое-то инфиксное выражение только с оператором +, - для выражения после исправления. Также я должен обрабатывать целые числа, действительные числа, идентификаторы (их не нужно объявлять) как операнд.

Я определил некоторые регулярные определения и шаблоны, подобные этому,

/* regular definition */
delim   [ \t]
ws  {delim}+
letter  [A-Za-z_]
digit   [0-9]
id  {letter}({letter}|{digit})*
number  {digit}+(\.{digit}+)?(E[+-]?{digit}+)?

%%

{ws}        {/* no action and no returns */}
{id}        { return (ID); }
{number}    { return (NUMBER); }
[+-]        { return (OPERATOR); }
[\n]        { return (ENTER); }
<<EOF>>     { return (END_OF_FILE); }
[.*]        { return (INVALID); }

%%

и я определил шаблон [. *], Чтобы описать все недействительные токены. Например, неверный идентификатор, начинающийся с цифры (0abc), неверное литеральное представление (12.23.2) ...

Если в выражении есть недопустимый токен (каждое выражение - одна строка), я просто хочу напечатать какое-нибудь сообщение об ошибке и проигнорировать эту строку.

Итак, мой вопрос: есть ли лучшие способы описать или обнаружить неверный токен в моем случае?

1 Ответ

0 голосов
/ 02 апреля 2019

[.*] соответствует точке или звездочке.Чтобы сопоставить произвольный символ, используйте . без скобок.

Обратите внимание, что здесь требуется сопоставлять только одиночные символы.Вы не хотите .*, поскольку это будет соответствовать целым строкам и часто будет выбираться поверх других правил, потому что это приведет к более длинным совпадениям.Например, foo bar будет интерпретироваться как один INVALID токен вместо двух ID, разделенных пробелом, если вы используете .*.Так что . - это то, что вы хотите.

...