Вы можете использовать следующий контекст с оператором '/'. Например,
abcd/efgh
будет соответствовать строке «abcd», только если за ней следует «efgh», а последняя строка остается на входе, поэтому она будет (частью) следующего сопоставленного токена.
Я точно не знаю, о чем вы спрашиваете с помощью "@" и "{" - вы хотите сопоставить их, но просто игнорировать их, или вы хотите вернуть их как отдельные токены? Для первого вы можете использовать "@abcd"/"{efgh"
, а затем просто использовать yytext + 1, чтобы получить «abcd». Последнее является более сложным, но это может быть сделано с использованием состояний flex. Вы можете сделать что-то вроде:
%x at
%%
"@" { BEGIN(at); return *yytext; }
<at>"abcd" { BEGIN(INITIAL); return ABCD; }
для сопоставления с "abcd", только если оно сразу после "@", которое было сопоставлено само собой.
Вы можете делать много сложных вещей в flex с начальными состояниями, но обычно попытка разобрать нерегулярный язык - плохая идея - вам лучше использовать для этого инструмент синтаксического анализа, такой как bison.