Напишите регулярное выражение для числовых литералов C - PullRequest
0 голосов
/ 10 октября 2010

Моя домашняя работа - написать регулярное выражение, представляющее язык числовых литералов языка Си. Я могу использовать l для буквы, d для цифры, a для +, m для - и p для точки. Предположим, что нет никаких ограничений на количество последовательных цифр в любой части выражения.

Некоторыми примерами допустимых числовых литералов были 13., .328, 41.16, +45.80, -2.e + 7, -.4E-7, 01E-06, + 0

Я придумал: (d + p + a + m) (d + p + E + e + a + m) *
update2: (l + d + p + a + m) (d + p + ((E + e) ​​(a + m + d) d *)) * я не уверен, как предотвратить что-то вроде 1.0.0.0eee-e1.

Ответы [ 3 ]

3 голосов
/ 10 октября 2010

Ваше регулярное выражение не поддерживает различные суффиксы (l, u, f и т. Д.), А также не поддерживает шестнадцатеричные или восьмеричные константы.

Ведущие знаки (+ или - перед числом) не являются лексической частью константы;это унарные операторы + и -.Фактически, все целочисленные и плавающие константы являются положительными.

Если вам нужно полностью поддерживать плавающие константы C99, вам необходимо поддерживать шестнадцатеричные показатели (p вместо e).

ВашРегулярное выражение также принимает много недопустимых последовательностей символов, например 1.0.0.0eee-e1.

Одно регулярное выражение, совпадающее со всеми целочисленными и плавающими литералами C, будет довольно длинным.

1 голос
/ 10 октября 2010

Не проверено, но это должно быть вдоль правильных линий, по крайней мере, для десятичного числа. (Кроме того, он принимает строку «.», Или я думаю, что в любом случае это делает; исправить это исключило бы последний из общего кода между целым числом и FP, ведущий [0-9]*.)

Пожалуйста, не понижайте голос, если вы видите недостаток. Оставьте конструктивный комментарий, и я сделаю это сообщество вики.

[0-9]*([0-9]([uU](ll?+LL?)+(ll?+LL?)?[uU]?)+(\.[0-9]*)?([eE][+-]?[0-9]+)[fFlL])
0 голосов
/ 10 октября 2010

Это регулярное выражение будет соответствовать всем вашим потребностям:

  [+-]?(?P<Dot1>\.)?\d+(?(Dot1)(?#if_dot_exist_in_the_beginning__do_nothing)|(?#if_dot_not_exist_yet__we_accept_optional_dot_now)(?P<Dot2>\.)?)\d*(?P<Exp>[Ee]?)(?(Exp)[+-]?\d*)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...