Ответ 1
Просто запретите цитату между кавычками.
\"[^"]*\"
Я пытаюсь проанализировать устаревший язык (который похож на "C" ) с использованием FLEX и BISON. Все работает хорошо, за исключением совпадающих строк.
Этот довольно странный унаследованный язык не поддерживает цитирование символов в строковых литералах, поэтому все допустимые строковые литералы:
"hello"
""
"\"
Я использую следующее правило для соответствия строковых литералов:
\".*\" { yylval.strval = _strdup( yytext ); return LIT_STRING; }
К сожалению, это жадное совпадение, поэтому он соответствует коду, как показано ниже:
"hello", "world"
Как одна строка (hello", "world
).
Обычный не-жадный квантор .*?
, похоже, не работает в FLEX. Любые идеи?
Просто запретите цитату между кавычками.
\"[^"]*\"
Косой чертой с обратной косой чертой
Следующее также позволяет:
\"(\\.|[^\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