У меня есть программа, где у меня есть правило грамматики, например:
set_command
: SET STRING set_option_value_opt
{
parse_set( $2, $3 );
}
;
set_option_value_opt
: /* empty */ { $$ = NULL; }
| '=' STRING { $$ = $2; }
;
То есть для команды SET
я хочу, чтобы имя и необязательное значение были любыми строками, не содержащими пробелов и я хочу, чтобы функция parse_set()
выполняла синтаксический анализ, а не указывала его в грамматике.
В моем файле flex у меня есть:
letter [A-Za-z_]
D [0-9]
S [ \f\r\t\v]
identifier {letter}({letter}|{D})*
%x SET_OPTION
%%
{identifier} {
keyword *k = keyword_find( yytext );
if ( k != NULL ) {
if ( strcmp( yytext, "set" ) == 0 )
BEGIN( SET_OPTION );
return k->token;
}
return IDENTIFIER;
}
<*>{S}+ ; /* ignore all other whitespace */
/* ... */
<SET_OPTION>{
"=" { return '='; }
";" { BEGIN( INITIAL ); return ';'; }
\n { BEGIN( INITIAL ); return END; }
[^ \n]+ { return STRING; }
}
То есть: когда сканирует лексер токен SET
, переключите начальное состояние в SET_OPTION
; если токен ;
или \n
, вернитесь в состояние INITIAL
. (Здесь описаны области запуска Flex здесь .)
Правильно переключается в состояние SET_OPTION
, но когда я вхожу в строку и нажимаю Return , она никогда переключается обратно в состояние INITIAL
. После добавления некоторого кода отладки он никогда не совпадает с \n
в области действия <SET_OPTION>
. Почему бы нет? И как я могу получить то, что я хочу?