Соответствие `\` во Flex

Я пытаюсь создать простой конечный автомат в flex, который должен гарантировать, что строки, охватывающие несколько строк, должны иметь \ для разрывов строк. В частности:

"this is \
ok"
"this is not
ok"

Первый действителен. Второй нет.

У меня есть следующий конечный автомат:

expectstring     BEGIN(expectstr);
<expectstr>[^\n]     {num_lines++;}
<expectstr>\         {flag = true;}
<expectstr>\n        {printf("%s\n", flag ? "True" : False);}

Но когда я пытаюсь скомпилировать этот конечный автомат, flex говорит мне, что правило с \ не может быть сопоставлено. Это почему?

Я смотрел на этот но не могу понять это.

0

Решение

В flex следующий шаблон соответствует чему-либо, кроме новой строки:

.

Вы также можете написать это как

[^\n]

но . более нормально.

Чтобы сопоставить обратную косую черту, вы можете написать

\\
"\\"[\\]

Опять же, первым будет обычный путь.

Важно понимать, что [...] это способ представления набора символов, и что большинство операторов регулярных выражений — это просто обычные символы в скобках. Так же, "..." это способ представления последовательности символов, и большинство операторов регулярных выражений — это просто обычные символы внутри кавычек.

Таким образом,

  • [a|b] соответствует одному символу, если это , |, или б
  • "a|b" соответствует трехсимвольной последовательности | б
  • and|but соответствует любой из трехсимвольных последовательностей N.

d или же бUT
Поскольку flex позволяет сопоставлять регулярные выражения, вам действительно не нужно вручную создавать конечный автомат. Просто используйте соответствующее регулярное выражение. Например, следующее будет соответствовать строки, которые начинаются и заканчиваются ", в котором \ может использоваться как для экранирования, так и для новых строк, и в которых новые строки (кроме экранированных) являются незаконными. Я думаю, что это ваша цель.

\"([^"\n\\]|\\(.|\n))*\"

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

\"     A literal double-quote
(...)* Any number of repetitions of:
[^"\n\\]   Anything other than a double-quote, newline, or backslash
|          Or
\\         A literal backslash, followed by
(...)      Grouping
.          Anything other than a newline
|          Or
\n         a newline
1

Другие решения


По вопросам рекламы [email protected]