Регулярное выражение для констант в C - PullRequest
0 голосов
/ 31 августа 2010

Я хочу написать регулярное выражение для констант на языке Си.Поэтому я попробовал это:

Позвольте

  • цифра -> 0-9,
  • digit_oct -> 0-7,
  • digit_hex ->0-9 |аф |AF

Тогда:

  • RE = цифра + U 0digit_oct + U 0xdigit_hex +

Я хочу знать, правильно ли я написал RE Есть ли какие-либоДругой способ написать это?

Ответы [ 4 ]

7 голосов
/ 31 августа 2010

Существует еще один тип целочисленных констант, а именно целочисленные символьные константы , такие как 'a' или '\n'. В C99 это константы, и их тип просто int.

Наилучшие регулярные выражения для всего этого находятся в стандарте, раздел 6.4, http://www.open -std.org / jtc1 / sc22 / wg14 / www / docs / n1124.pdf

2 голосов
/ 31 августа 2010

Во-первых, C не поддерживает литералы Unicode, поэтому вы можете удалить последнее правило. Вы также определяете только целочисленные литералы, а не литералы с плавающей точкой и не строковые или символьные литералы. Ради моего удобства я предполагаю, что это именно то, что вы намеревались.

INT    := OCTINT | DECINT | HEXINT
DECINT := [1-9] [0-9]* [uU]? [lL]? [lL]?
OCTINT := 0 [0-7]* [uU]? [lL]? [lL]?
HEXINT := 0x [0-9a-fA-F]+ [uU]? [lL]? [lL]?

Они описывают только форму литералов, а не какую-либо логику, например максимальные значения.

2 голосов
/ 31 августа 2010

«RE» имеет смысл, если мы интерпретируем «U» как подобие объединению множеств. Однако более обычным является использование «|» символ для обозначения альтернатив.

Во-первых, вы имеете дело только с целочисленными константами, а не с плавающей точкой, символьными или строковыми константами, не говоря уже о более сложных константах.

Во-вторых, вы пропустили '0X' в качестве допустимого шестнадцатеричного префикса.

В-третьих, вы опустили различные суффиксы: U, L, LL, ULL (а также их синонимы и перестановки в нижнем и смешанном регистре).

Кроме того, стандарт C (§6.4.4.1) проводит различие между цифрами и ненулевыми цифрами в десятичной константе:

decimal-constant:
    nonzero-digit
    decimal-constant digit

Любая целочисленная константа, начинающаяся с нуля, является восьмеричной константой, а не десятичной. В частности, запись 0 - это запись восьмеричной константы.

0 голосов
/ 07 августа 2013

С точки зрения perl, после прочтения ISO C 2011 я придумал следующее регулярное выражение:

my $I_CONSTANT = qr/^(?:(0[xX][a-fA-F0-9]+(?:[uU](?:ll|LL|[lL])?|(?:ll|LL|[lL])[uU]?)?)             # Hexadecimal
                      |([1-9][0-9]*(?:[uU](?:ll|LL|[lL])?|(?:ll|LL|[lL])[uU]?)?)                    # Decimal
                      |(0[0-7]*(?:[uU](?:ll|LL|[lL])?|(?:ll|LL|[lL])[uU]?)?)                        # Octal
                      |([uUL]?'(?:[^'\\\n]|\\(?:[\'\"\?\\abfnrtv]|[0-7]{1..3}|x[a-fA-F0-9]+))+')    # Character
                    )$/x;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...