Токенизация произвольной строки после ключевого слова до конца строки в flex - PullRequest
0 голосов
/ 10 января 2020

У меня есть программа, где у меня есть правило грамматики, например:

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>. Почему бы нет? И как я могу получить то, что я хочу?

...