[C++] Grep + wyrażenia reg.

0

Witam!
Muszę napisać Grepa, który jako argument będzie przyjmował słowa oraz wyrażenia regularne. Wersje podstawową (same słowa) już mam, tylko nie wiem jak się zabrać za wyrażenia regularne. Jaką bibliotekę użyć? Chodzi mi o coś prostego w opanowaniu, żeby to jakoś sprawnie i szybko napisać.

Mój Grep wczytuje plik ze standardowego wejścia, słowo podawane jest jako argument programu, do wyszukiwania słowa w linii wykorzystuję algorytm KMP.

Z góry dzięki.
Pozdrawiam, Ziem!

0

A mozesz użyc boosta? Bo jeśli tak to tam masz boost::regex i kilka przydatnych zabawek ;)
http://www.boost.org/doc/libs/1_42_0/libs/regex/doc/html/index.html

0
Shalom napisał(a)

A mozesz użyc boosta? Bo jeśli tak to tam masz boost::regex i kilka przydatnych zabawek ;)
http://www.boost.org/doc/libs/1_42_0/libs/regex/doc/html/index.html

Dzięki za odpowiedź!

Można spróbować :P. Tylko mam mały problem. Ściągnąłem DevPacka z boostem, zainstalowałem, ale mam problem z linkowaniem (chyba).

Gdy dodaję -lboost_regex - wywala błąd, że nie może znaleźć.
Gdy dodaję -boost_regex - niby wszystko ok, ale kompilacja kończy się: Compilation Failed. Make returned 1

Co jest grane?

Przykład ściągnąłem, gdzieś z neta, żeby tylko sprawdzić czy wszystko działa, kod:

#include <iostream>
#include <boost/regex.hpp>
#include <string>

using namespace std;

bool printRep(const boost::smatch &what)
{
    std::cout << what[1] << " ";  // Wyświetl na standardowe wyjście pierwsze podwyrażenie.
    return true;                  // Nie zatrzymuj wykonywania pętli for_each.
}
 
// Wczytaj linię z wejścia i sprawdź czy są w niej powtórzenia "słów",
// a jeżeli są, podaj jakie.
int main() {
    // Wyrażenie regularne reprezentujące powtarzające się słowa.
    boost::regex rep("(\\<\\w+\\>)(?:\\s+\\<\\1\\>)+");
    std::string line;
    std::getline(std::cin, line);
    // Początkowy iterator dopasowań do wyrażen regularnych.
    boost::sregex_iterator begin(line.begin(), line.end(), rep);
    // Terminalny iterator dopasowań do wyrażen regularnych.
    boost::sregex_iterator end;
    // Dla każdego dopasowania wywołaj funkcję printRep.
    std::for_each(begin, end, &printRep);
    std::cout << std::endl;

    system("PAUSE");
    return 0;
}
0

A czym to kompilujesz? Jeśli jakimś IDE to czy ustawiłeś ściezki dla linkera do bibliotek i ścieżki dla kompilatora dla include?
Jeśli z konsoli za pomocą g++ to musisz podać ścieżkę do includów parametrem -I i dla bibliotek -L

0
Shalom napisał(a)

A czym to kompilujesz? Jeśli jakimś IDE to czy ustawiłeś ściezki dla linkera do bibliotek i ścieżki dla kompilatora dla include?
Jeśli z konsoli za pomocą g++ to musisz podać ścieżkę do includów parametrem -I i dla bibliotek -L

wxDev-C++, liby mam w dobrych folderach (\lib), includy też (\include\boost).

Jak do linkera nie dodam -boost_regex to wywala undefined referencje, a gdy to dodam to log kompilacji wygląda tak:

Kompilator: Default GCC compiler
Wykonywanie g++.exe...
g++.exe "C:/Users/Ziem/Desktop/Grep/regex.cpp" -o "C:/Users/Ziem/Desktop/Grep/regex.exe" -boost_regex -I"C:/Program Files/Dev-Cpp/lib/gcc/mingw32/3.4.5/include" -I"C:/Program Files/Dev-Cpp/include/c++/3.4.5/backward" -I"C:/Program Files/Dev-Cpp/include/c++/3.4.5/mingw32" -I"C:/Program Files/Dev-Cpp/include/c++/3.4.5" -I"C:/Program Files/Dev-Cpp/include" -I"C:/Program Files/Dev-Cpp/" -I"C:/Program Files/Dev-Cpp/include/3rdparty/wx/plotctrl" -I"C:/Program Files/Dev-Cpp/include/3rdparty/wx/sheet" -I"C:/Program Files/Dev-Cpp/include/3rdparty/wx/treemultictrl" -I"C:/Program Files/Dev-Cpp/include/3rdparty/wx/things" -I"C:/Program Files/Dev-Cpp/include/3rdparty/wx" -I"C:/Program Files/Dev-Cpp/include/3rdparty" -I"C:/Program Files/Dev-Cpp/include/common/wx/msw" -I"C:/Program Files/Dev-Cpp/include/common/wx/generic" -I"C:/Program Files/Dev-Cpp/include/common/wx/fl" -I"C:/Program Files/Dev-Cpp/include/common/wx/gizmos" -I"C:/Program Files/Dev-Cpp/include/common/wx/html" -I"C:/Program Files/Dev-Cpp/include/common/wx/mmedia" -I"C:/Program Files/Dev-Cpp/include/common/wx/net" -I"C:/Program Files/Dev-Cpp/include/common/wx/ogl" -I"C:/Program Files/Dev-Cpp/include/common/wx/plot" -I"C:/Program Files/Dev-Cpp/include/common/wx/protocol" -I"C:/Program Files/Dev-Cpp/include/common/wx/stc" -I"C:/Program Files/Dev-Cpp/include/common/wx/svg" -I"C:/Program Files/Dev-Cpp/include/common/wx/xml" -I"C:/Program Files/Dev-Cpp/include/common/wx/xrc" -I"C:/Program Files/Dev-Cpp/include/common/wx" -I"C:/Program Files/Dev-Cpp/include/common" -L"C:/Program Files/Dev-Cpp/Lib"
g++.exe: `-b' must come at the start of the command line

Wykonanie zakończone
Compilation Failed. Make returned 1

0

-boost_regex takie coś na bank nie moze wystąpić, bo i z jakiej racji? To nie jest przecież żaden parametr kompilatora. To nie miało być jakieś -Lboost_regex czy coś takiego?

0
Shalom napisał(a)

-boost_regex takie coś na bank nie moze wystąpić, bo i z jakiej racji? To nie jest przecież żaden parametr kompilatora. To nie miało być jakieś -Lboost_regex czy coś takiego?

Próbowałem -l* i nie działało... Gdy dodam -Lboost_regex dostaję undefined reference:

[Linker Error] undefined reference to boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::do_assign(char const*, char const*, unsigned int)' [Linker Error] undefined reference to boost::re_detail::perl_matcher<__gnu_cxx::__normal_iterator<char const*, std::string>, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::string> > >, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::find()'
[Linker Error] undefined reference to `boost::re_detail::perl_matcher<__gnu_cxx::__normal_iterator<char const*, std::string>, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::string> > >, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::construct_init(boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > > const&, boost::regex_constants::_match_flags)'

0

Głowy nie dam, ale raczej musisz miec podane -lnazwa_biblioteki.
Nie wiem dokładnie jak to jest w Devie, może tam coś jest skopane.
Na twoim miejscu spróbowałbym pod innym IDE po prostu to zrobić, albo poszukać w necie czy ktoś inny też miał taki problem.

0
Shalom napisał(a)

Głowy nie dam, ale raczej musisz miec podane -lnazwa_biblioteki.
Nie wiem dokładnie jak to jest w Devie, może tam coś jest skopane.
Na twoim miejscu spróbowałbym pod innym IDE po prostu to zrobić, albo poszukać w necie czy ktoś inny też miał taki problem.

Zwykle -l* działało, ale teraz nie idzie..

Ale udało mi się nareszcie to skompilować :D :D. Zamiast bawić się w -l.. dodałem plik i zaskoczyło.

Dzięki serdeczne za pomoc :)!

1 użytkowników online, w tym zalogowanych: 0, gości: 1