RazzorFlame Temat założony przez niniejszego użytkownika |
Własny preprocesor do C++ - jakie przydatne biblioteki » 2018-04-24 22:17:19 Załóżmy, że chce napisać coś w stylu własnego preprocesora do C++. Niech was nie zmyli nazwa, nie byłby on w ogóle podobny do tego faktycznego preprocesora C++. Dajmy na to, że chcę napisać narzędzie, które przekonwertuje ten kod: #include <iostream> int main() { std::cout << $ CurrentFunction.getName() << std::endl; }
na #include <iostream> int main() { std::cout << "main" << std::endl; }
Jakie programy / biblioteki mogą mi w tym pomóc? Parsowanie kodu C++ jest okropnie ciężkie i gdybym miał coś takiego samemu napisać to by mi pewnie życia nie starczyło. Jest chyba jednak dla mnie nadzieja, ponieważ... Clang lub GCC. Te ich narzędzia, typu clang-tidy czy clang-format jakoś działają prawda? Czy myślał już z Was myślał już kiedyś o czymś takim? Macie dla mnie jakieś sugestie? Plz, proszę mnie nie zniechęcać, robię to dla siebie. |
|
jankowalski25 |
» 2018-04-24 22:55:32 $ CurrentFunction.getName() |
Co jest złego w __func__ ? Parsowanie kodu C++ jest okropnie ciężkie i gdybym miał coś takiego samemu napisać to by mi pewnie życia nie starczyło. |
Tylko jeśli masz kod korzystający ze wszelkich możliwych ficzerów C++. Bo jeśli mowa o normalnym projekcie, to zwykle całość jest jednak jakoś poukładana. Jeśli chcesz parsować bagienny kod, to może być ciężko, ale możesz zacząć od jakichś prostych przypadków (proste klasy, funkcje, metody) i stopniowo to rozbudowywać w miarę potrzeby. Tak samo, jak z Unikodem: czy od razu potrzebujesz wszystkiego? Wątpię. Zacznij od paru prostych przykładów albo dokładniej opisz, co chcesz osiągnąć (bo na razie wiem tyle, że chcesz uzyskać nazwę obecnej funkcji, co wydaje się proste). A co do składni: może lubisz PHP, ale czarno widzę te dolary w C++ (podobnie, jak nie darzę sympatią znaków '^' przy "wskaźnikach Microsoftu", które jak dotąd bardziej mi przeszkadzały niż pomagały). proszę mnie nie zniechęcać, robię to dla siebie |
Ups, no dobra, trudno, nie będę kasował tego wyżej, lepiej doprecyzuję: nie tyle chodzi o zniechęcanie, co raczej dążenie do jakiegoś lepiej określonego problemu. Sam tytuł tematu sugeruje własne implementowanie preprocesora bez żadnych udziwnień, co może być trochę mylące (w sumie to nie wiem, w którą stronę skierować problem, aby uzyskać lepszą nazwę - mam nadzieję, że to się w miarę szybko wyklaruje). Określ dokładniej, do czego tego potrzebujesz, może wtedy łatwiej będzie coś doradzić. Bo na razie piszesz o preprocesorze w C++, używasz jakiejś bliżej nieokreślonej składni spoza C++, a jedynym podanym celem jest wyciągnięcie nazwy obecnej funkcji. |
|
RazzorFlame Temat założony przez niniejszego użytkownika |
» 2018-04-24 23:01:13 To był tylko przykład. Nie zamierzam się ograniczać do takiego jednego zastosowania. Dolar miałby symbolizować kod compile-time. To jest bardzo umowne, głównie chodzi mi o to, by znaleźć jakąś bibliotekę, która posłuży mi za bazę do parsowania języka. Co do nazwy tematu - wiem, że jest lekko myląca, ale czym innym, jak nie własnie preprocesorem, byłby ten program? Ewentualnie może "build step". EDIT: Znalazłem coś takiego https://github.com/foonathan/cppast |
|
jankowalski25 |
» 2018-04-24 23:16:48 Dolar miałby symbolizować kod compile-time. |
Hmm... a może pliki makefile lub jakieś skrypty basha/batcha/innego shella? Nic nie stoi na przeszkodzie, aby w C++ napisać program generujący kod C++ generujący kod C++... (takie szkatułkowe podejście nie zawsze jest dobre, ale w prostych przypadkach powinno wystarczyć). bibliotekę, która posłuży mi za bazę do parsowania języka |
Może inaczej: czego od tej biblioteki oczekujesz? Jakiś konkretny przykład byłby pomocny. Refleksja w czasie kompilacji? Wtedy problem może stanowić co najwyżej składnia, bo w samym C++ da się zrobić takie rzeczy (co zostało pokazane pod dywanem, może się do tego dokopię...). Ale wtedy odpowiednio dobrane pliki makefile lub jakiś metajęzyk może pomóc. czym innym, jak nie własnie preprocesorem, byłby ten program? |
Jeśli kod ma być "ładny", to dobrze byłoby nie tykać preprocesora bardziej niż to konieczne. Może wystarczą szablony? Albo nie wiem, choćby inny program, który wygeneruje jakiś prosty plik źródłowy. Zależy od problemu... A co do programu: przecież może być innym programem, który przyjmie jako wejście to, co chcesz (na przykład jakąś prosty diagram klas w UMLu, wyeksportowany do XML) i zrobi z tego pliki źródłowe C++, które sobie skompilujesz. Każdy program ma czas kompilacji i czas wykonania, ale jeśli składnia jest paskudna, to możesz napisać pomocniczy program, który w czasie wykonania przygotuje coś, czego inny program użyje w czasie kompilacji (a pliki makefile są po to, aby to wszystko sobie poukładać, co, kiedy, gdzie i jak ma być kompilowane). Co do linku do GitHuba: możesz spróbować. Na pierwszy rzut oka projekt wygląda ciekawie, a czy się sprawdzi, to już wyjdzie w praktyce. |
|
« 1 » |