Пишу парсер Сишного кода, столкнулся с проблемой:
Дело в том что я ненавижу регулярные выражения и их кривую реализацию в qt ниасилил.
Предположим код уже предварительно разбит построково, отформатирован и забит в QStringList.
Задача: найти среди строк в листе соответствующую точке входа (main), без оглядки на тип, параметры итд.
Я использую регулярное выражение «[a-zA-Z]*\smain[\s]*\([\S\s]*\)$» (конечно же, бэкслэши удвоены в коде, чтобы QString не пыталась обрабатывать);
QStringList code = { \
"void func1();"\
"void func2();"\
"void main(void)"};
for(int i = 0; i<code.length(); i++){
if(main_rx.exactMatch(code[i])){
mainLine = i;
break;
}
}
Загвоздка, собственно, в том, что регулярное выражение кривое срабатывает ложно:
Что при «void main(void)» что при «void main(void);» срабатывает exactMatch.
Само собой, такая ошибка неприемлема, т.к объявление функции != описание функции.
Где я накосячил\недопонял и почему $ не обозначает конец строки?