Wpis z mikrobloga

Hej,

W jaki sposób mogę przeparsować argumenty w określonym wywołaniu funkcji?

Przykładowo mam takie wywołanie(zawsze wiem z iloma argumentami będzie wywoływane)
obj.call("a1", "a2", "a3")
w których argumentami są

a1
a2
a3

i to robię wyszukując tekst pomiędzy przecinkami.

Niby dobrze to działa, ale wysypuje się przy np.
obj.call(call2("a1,"a2"),"a3")
ponieważ jako argumenty wyszukuje

call2("a1
"a2)
a3

zamiast tylko dwóch

#programowanie #regex
  • 7
  • Odpowiedz
@qarmin: Takich rzeczy raczej nie robi się regexami, większość języków z którymi miałem styczność miała jakieś narzędzia do manipulacji kodu, na przykład przy JSie możesz używać Babel albo API kompilatora TypeScriptu, kod przerabiany jest na AST (Abstract Syntax Tree) i tam możesz łatwo robić co chcesz
  • Odpowiedz
via Wykop Mobilny (Android)
  • 0
@qarmin: Wyjaśnij dlaczego akurat regexem. I podałeś zdecydowanie za mało danych - nie wiemy czy argumentami zawsze są stringi, czy to zagnieżdżone wywołanie jest zawsze tylko jedno itd. Jeśli jest to "powtarzalne", to regex + może jakieś lookbehind/lookahead ogarną, ale z trudem.

Używasz AST jak kolega @Aryze powiedział, albo jakiegoś antlr itp.
  • Odpowiedz
@aloucie: Argumentami mogą być dowolne rzeczy, stringi(z cudzysłowami), obiekty(bez cudzysłowów), dowolnie zagnieżdżone funkcje etc. tak jak w zwykłych funkcjach C++.

Akurat grzebię nie przy swoim projekcie, więc nie mogę dodawać żadnych nowych narzędzi a jedyne istniejące narzędzia to RegEx albo czysty C++ i funkcje np. ze Stringa
  • Odpowiedz
@qarmin: Nie musisz niczego dodawać na stałe, znajdź narzędzie tego typu, zrób co masz zrobić i commituj tylko co masz commitować, chyba? :D

Tego regexami raczej nie zrobisz, musiałbyś pisać kod pod to, zliczać ile było " by wiedzieć czy jesteś w stringu czy nie, przy tym zliczaniu patrzeć czy są escapowane itd, jak dla mnie bez sensu, #!$%@? się pod górkę zamiast wziąć istniejące narzędzie do twojego języka.
  • Odpowiedz
via Wykop Mobilny (Android)
  • 2
@qarmin: napisz własną gramatykę przy użyciu np tego
https://github.com/yhirose/cpp-peglib . Jak header only nie pasuje to możesz napisać coś takiego samemu. Iterujesz się po każdym znaku. Dla każdego typu nawiasów trzymasz licznik, który odpowiednio zwiekszasz/zmniejszasz gdy napotkasz nawias otwierający/zamykający. Jak napotkasz przycinek to sprawdzasz licznik nawiasów: jak wszystkie są na 0 (nie liczymy tego głównego) to masz granicę pomiędzy argumentami
  • Odpowiedz