Подтвердить что ты не робот

Как написать не-жадный матч в LEX/FLEX?

Я пытаюсь проанализировать устаревший язык (который похож на "C" ) с использованием FLEX и BISON. Все работает хорошо, за исключением совпадающих строк.

Этот довольно странный унаследованный язык не поддерживает цитирование символов в строковых литералах, поэтому все допустимые строковые литералы:

"hello"
""
"\"

Я использую следующее правило для соответствия строковых литералов:

\".*\"            { yylval.strval = _strdup( yytext ); return LIT_STRING; }

К сожалению, это жадное совпадение, поэтому он соответствует коду, как показано ниже:

"hello", "world"

Как одна строка (hello", "world).

Обычный не-жадный квантор .*?, похоже, не работает в FLEX. Любые идеи?

4b9b3361

Ответ 1

Просто запретите цитату между кавычками.

\"[^"]*\"

Ответ 2

Косой чертой с обратной косой чертой

Следующее также позволяет:

\"(\\.|[^\n"\\])*\" {
        fprintf( yyout, "STRING: %s\n", yytext );
    }

и запрещает для строк новой строки внутри строковых констант.

например:.

>>> "a\"b""c\d"""
STRING: "a\"b"
STRING: "c\d"
STRING: ""

и не выполняется:

>>> "\"

При реализации таких C-подобных функций обязательно найдите существующие версии Lex, например: http://www.lysator.liu.se/c/ANSI-C-grammar-l.html