Как понять регулярное выражение строки flex C / C ++? - PullRequest
0 голосов
/ 23 февраля 2020

Я изучаю флекс / бизон для технологии разбора. Книга flex & bison показывает такой пример изгиба:


UCN (\\u[0-9a-fA-F]{4}|\\U[0-9a-fA-F]{8})

{%
...
%}

%%

\"([^\"\\]|\\['"?\\abfnrtv]|\\[0-7]{1,3}|\\[Xx][0-9a-fA-F]+|{UCN})+\" { ... save token here }

%%

Я понятия не имею об этих частях внутри регулярного выражения:

  1. делает [^\"\\] значит не совпадает \" или \\? если да, то зачем указывать это не соответствует ? поскольку \" и \\, кажется, не появляются в другой группе.
  2. что означает \\[0-7]{1,3}?
  3. что означает \\[Xx][0-9a-fA-F]?
  4. делает UCN значит utf-8?

Ответы [ 2 ]

3 голосов
/ 23 февраля 2020

Это регулярное выражение соответствует следующему:

  • A " символ,
  • С последующим любой комбинацией одного или нескольких из следующих:
    • [^\"\\] - Любой символ, отличный от " или \
    • \\['"?\\abfnrtv] - A \, за которым следует любой из ', ", ?, \, a, b, f, n, r, t или v.
    • \\[0-7]{1,3} - A \, за которыми следуют от одной до трех восьмеричных цифр.
    • \\[Xx][0-9a-fA-F]+ - A \, за которым следует X или x, за которым следуют одна или несколько шестнадцатеричных цифр.
    • {UCN}, которая расширяется до (\\u[0-9a-fA-F]{4}|\\U[0-9a-fA-F]{8}) - Любой из следующие:
      • \\u[0-9a-fA-F]{4} - A \, за которым следует u, за которым следуют четыре шестнадцатеричные цифры
      • \\U[0-9a-fA-F]{8} - A \, за которыми следует U, за которыми следуют восемь шестнадцатеричных цифр
  • С последующим закрывающим символом "

Обратите внимание, что на самом деле это неправильный шаблон для сопоставления всей строки C ++ литералы, потому что

  • Это делает не соответствует пустой строке ("")
  • Шестнадцатеричные escape-коды должны начинаться со строчной буквы x. Лучшим шаблоном для их сопоставления будет \\x[0-9a-fA-F]+

Для получения дополнительной информации о том, что означают все escape-последовательности C ++, см. эту страницу .

To ответьте на указанные c вопросы:

  1. \ обозначает escape-последовательность, которая обрабатывается другими опциями, а неотключенный " означает конец строкового литерала. Родовое c совпадение «любой символ» не соответствует ни одному из этих символов, так что они могут быть сопоставлены с другими частями выражения.
  2. Ответ выше: \\[0-7]{1,3} означает \, за которым следует от одной до трех восьмеричных цифр.
  3. Ответ выше: \\[Xx][0-9a-fA-F]+ означает \, за которым X или x следует одна или несколько шестнадцатеричных цифр
  4. UCN - это короткая для универсального имени персонажа. Он обозначает символ Unicode, но ничего не говорит о его кодировке.
1 голос
/ 23 февраля 2020
  1. [^...] означает совпадение с любым отдельным элементом, который не ...

  2. \\[0-7]{1,3} означает совпадение с \ follow от одного до трех символов из набора 0-7 (совпадения не обязательно должны совпадать с одним и тем же символом, например, сопоставляется "\ 123")

  3. \\[Xx][0-9a-fA-F] означает совпадение с \ сопровождаемый или x или X, сопровождаемым символом от набора 0-9a-fA-F

  4. UCN - пример пользовательского определения lex, такие определения допускают образец регулярного выражения быть повторенным позже без необходимости копировать весь шаблон; Вместо этого он может быть заключен в фигурные скобки определения: https://www.cs.virginia.edu/~cr4bd/flex-manual/Definitions-Section.html#Definitions -раздел

...