Только часть совпадающей строки в flex в yytext - PullRequest
3 голосов
/ 17 марта 2011

Я новичок, но я хотел бы знать, могу ли я с помощью flex анализировать что-либо с помощью регулярного выражения таким образом, что yytext будет только частью соответствующей последовательности. Например: @abcd{efgh,. Я хотел бы сопоставить abcd один раз и затем использовать efgh,, но мне нужно использовать @ и {для их сопоставления. Возможно ли это, или я должен полностью обработать его позже в C?

1 Ответ

1 голос
/ 18 марта 2011

Вы можете использовать следующий контекст с оператором '/'. Например,

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.

...