Я пытаюсь определить правило в flex, которое будет захватывать «многострочную строку».
Многострочная строка - это строка, которая начинается с трех апострофов: '''
, заканчивается тремя апострофами и может охватывать несколько строк.
Например:Как написать следующее регулярное выражение в Flex?
'''This is
an example of
a multiline
string'''
Так что моя попытка это было так:
%{
#include<iostream>
using std::cout;
using std::endl;
%}
MULTI_LN_STR '''(.|\n)*'''
%%
{MULTI_LN_STR} {cout<<"GotIt!";}
%%
int main(int argc, char* argv[]) {
yyin=fopen("test.txt", "r");
if (!yyin) {
cout<<"yyin is NULL"<<endl;
return 1;
}
yylex();
return 0;
}
Который работает для ввода:
'''This is
a multi
line
string!'''
This is
some random
text
Выход есть:
GotIt!
This is
some random
text
, но не работает (или, чтобы быть более точным, производит неверный вывод) для этого входа:
'''This is
a multi
line
string!'''
This is
some random
text
'''and this
is another
multiline
string'''
Который производит:
GotIt!
Эта причина, потому что мое правило говорит:
«сканирование трех апострофов, за которым следует любой возможный символ, за которым следуют три апострофа»,
, но, скорее, он должен сказать:
«Сканирование трех апострофов, за которыми следует любой возможный характер er кроме трех апострофов, а затем три апострофа ».
Как я могу это сделать?
Почему вы говорите быстрее? Поскольку flex создает AFD для этого регулярного выражения, результат тот же, что и при скорости. Только один проход по данным, так как вы не использовали оператор /. –
@ LuisColorado: Оператор '/' Flex не является особым. Любой шаблон может вызвать (однократное) повторное сканирование, но это может стать квадратичным в расширенном размере шаблона. Рассмотрим, например, ': |: {15}' и вход, состоящий из 14 двоеточий. Каждый двоеточие будет возвращен в качестве односимвольного токена, но только после сканирования до первого двоеточия и последующего отступления. Конечно, это не имеет никакого отношения к использованию чередования; ваш комментарий на 100% правильный, что два регулярных выражения будут скомпилированы с тем же DFA (por sus siglas en inglés). – rici
@ LuisColorado - Я хотел только подчеркнуть, что чередование очень медленное в любом контексте. Написал контрольный показатель, чтобы сравнить эти два. В классическом «развернутом» методе это быстрее на величину 2. – sln