Я пытаюсь создать простой конечный автомат в 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 говорит мне, что правило с \
не может быть сопоставлено. Это почему?
Я смотрел на этот но не могу понять это.
В 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