Могут ли действия в Lex получить доступ к отдельным группам регулярных выражений? - PullRequest
3 голосов
/ 30 июля 2011

Могут ли действия в Lex получить доступ к отдельным группам регулярных выражений?

(ПРИМЕЧАНИЕ. Думаю, что нет, поскольку групповые символы - круглые скобки - соответствуют документации , используемой для изменения приоритета. Но если это так, порекомендуйте ли вы альтернативный генератор сканера C / C ++, который я могу сделать это? Мне не очень нравится писать свой собственный лексический анализатор.)

Пример:

Допустим, у меня есть этот ввод: foo [tagName attribute="value"] bar, и я хочу извлечь тег с помощью Lex / Flex. Я, конечно, мог бы написать это правило:

\[[a-z]+[[:space:]]+[a-z]+=\"[a-z]+\"\]       printf("matched %s", yytext);

Но допустим, я бы хотел получить доступ к определенным частям строки, например, атрибут, но без необходимости повторного анализа yytext (так как строка уже отсканирована, на самом деле нет смысла снова сканировать ее часть). Поэтому что-то вроде этого было бы предпочтительным (группы регулярных выражений):

\[[a-z]+[[:space:]]+[a-z]+=\"([a-z]+)\"\]     printf("matched attribute %s", $1);

Ответы [ 2 ]

1 голос
/ 28 марта 2014

Вы можете отделить его для запуска условий.Примерно так:

%x VALUEPARSE ENDSTATE
%%
char string_buf[100];
<INITIAL>\[[a-z]+[[:space:]]+[a-z]+=\"     {BEGIN(VALUEPARSE);}
<VALUEPARSE>([a-z]+)    (strncpy(string_buf, yytext, yyleng);BEGIN(ENDSTATE);}  //getting value text
<ENDSTATE>\"\]    {BEGIN(INITIAL);}
%%

Об альтернативном генераторе сканеров C / C ++ - я использую класс QT QRegularExpression для тех же самых вещей, он может очень легко получить группу регулярных выражений после совпадения.

0 голосов
/ 09 июня 2012

Конечно, по крайней мере, некоторые из них делают.Но по умолчанию lex / flex, загружаемый с sourceforge.org, похоже, не содержит его в своей документации, и этот пример оставляет полную строку в yytext.

Из Документация IBM LEX для AIX :

(Выражение) Соответствует выражению в скобках.Оператор () (в скобках) используется для группировки и приводит к тому, что выражение в скобках читается в массив yytext.Группа в скобках может использоваться вместо любого отдельного символа в любом другом шаблоне.

Пример: (ab | cd +)? (Ef) * соответствует таким строкам, как abefef, efefef, cdef или cddd;но не abc, abcd или abcdef.

...