LINUX.ORG.RU

QRegExp не работает

 , , ,


0

1

Пишу парсер Сишного кода, столкнулся с проблемой:
Дело в том что я ненавижу регулярные выражения и их кривую реализацию в 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.
Само собой, такая ошибка неприемлема, т.к объявление функции != описание функции.

Где я накосячил\недопонял и почему $ не обозначает конец строки?

★★★★★
Ответ на: комментарий от anonymous

А какая к черту связь?
Так то трем, и это работает. (это не STL-совместимо - единственный минус, но мне как-то похрен)

mersinvald ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Проверил...
Что так что так, одно и то же.
Но на всякий заменил на кошерный .size()

Повторюсь, если там и была ошибка, роли она не играет - в живом примере main() у меня не с краю.
Я ж тут с дебаггером сижу, неверно работает именно QRegExp, давая ложные срабатывания. Где ошибка в выражении?

mersinvald ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Ну да, в конструкторе у меня именно эта строка и стоит, не работает.

конечно же, бэкслэши удвоены в коде

mersinvald ★★★★★
() автор топика

Итак, нужно написать регулярное выражение для QRegExp,
которое будет четко соответствовать
int main(int argc, char **argv) (тип и параметры могут вариироваться)
и при этом не соответствовать
int main(int argc, char **argv);

mersinvald ★★★★★
() автор топика

Пишу парсер Сишного кода

QRegExp

Удачи!

yoghurt ★★★★★
()
[a-zA-Z][\\S]+\\s+main\\s*\\([^\\)]*\\)[\\s]*$

А вообще не понятно, зачем ты это рыгулярками разбираешь.

Кстати, да, на-ка попробуй, разгуляйся на своих регекспах:

int
test(a, b)
    int    a;
    char **b;
{
    // ...

    return 0;
}

Если ты разбил построчно — это не правильно. Правильно посимвольно читать букафки и складывать найденные токены куда-то там.

deep-purple ★★★★★
()
Последнее исправление: deep-purple (всего исправлений: 1)

Регэксп правильный, в Qt4.8 тестил - всё работает (правда, использовал indexIn). Ищи косяк в другом месте.

unC0Rr ★★★★★
()

парсер Сишного кода
QRegExp
[a-zA-Z]

Следуй за Томми.

Stil ★★★★★
()
Ответ на: комментарий от deep-purple

Да знаю что не правильно это, но пока что лень разбираться в тонкостях лексического анализа.
Пока что так, потом лексический анализатор перепишу
Цель - получить не токены, а ориентированный граф строк, и тут преформатированный построчный код намного удобнее.

mersinvald ★★★★★
() автор топика
Ответ на: комментарий от unC0Rr

Грешу на 5.4.1, пойду на стабильную версию откачусь

mersinvald ★★★★★
() автор топика

Я понял что идиот, да. Рекурсивный парсинг по контекстам вложенности, да еще и с регулярными выражениями - бред.
Ссылка на хабр

mersinvald ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.