Для сопоставления целых чисел вам просто необходимо:
[[:digit:]]+ { /* handle a number */ }
Если вы хотите сопоставить четные целые числа, вы можете использовать
[[:digit:]]*[02468] { /* handle an even number */ }
Если вы хотите сопоставить четные и нечетные целые числаделая что-то другое для каждого паритета, вы бы использовали два правила:
[[:digit:]]*[02468] { /* handle an even number */ }
[[:digit:]]*[13579] { /* handle an odd number */ }
Или вы можете сделать это с первыми двумя шаблонами, если вы поместите их в правильном порядке:
[[:digit:]]*[02468] { /* handle an even number */ }
[[:digit:]]+ { /* handle any other number */ }
Это работает, потому что (f) lex всегда использует первое правило, если два шаблона одинаково хороши.
Нет смысла пытаться сопоставить пробел или символы новой строки как часть числа.Они не являются частью числа, и идея flex заключается в том, что вы разбиваете входные данные на осмысленные части («токены»).Возможно, вам нет дела до других частей ввода, но вам все равно нужно их распознать, хотя бы для того, чтобы явно их игнорировать.Например, чтобы игнорировать все, что не является цифрой, вы можете добавить следующее правило:
[^[:digit:]] ; /* Do nothing*/
Точка с запятой требуется, поскольку (f) lex не допускает пустых действий.
Теперь, возможно, вы намеревались не считать числа в середине слова, например F29
или 23skidoo
.В этом случае вы захотите добавить другой шаблон, который распознает те строки, которые могут содержать числа.Тогда вам, вероятно, придется явно распознавать пробелы, а не смешивать их с «не цифрой».Удивительно, но это довольно просто:
[[:digit:]]*[02468] { /* handle an even number */ }
[[:digit:]]+ { /* handle any other number */ }
[[:space:]]+ ; /* Ignore whitespace */
[^[:space:]]+ ; /* Ignore everything else */
Последний шаблон может нуждаться в некотором объяснении, поскольку число также является последовательностью непробельных символов.Но это работает по той же причине, что нам не нужно явное совпадение для нечетных чисел;Правило «максимального мунка» гласит, что (f) lex всегда использует шаблон с самым длинным соответствием, а если для самого длинного соответствия связано более одного шаблона, он использует первый.Другими словами, если последовательность символов, разделенных пробелами, оказывается числом, будет выбрано одно из правил нумерации, а не последнее правило.С другой стороны, если за номером сразу следует мусор, будет использовано последнее правило, поскольку оно имеет более длинное совпадение.