2012-04-01 13 views
6

Piszę emulator dla maszyny z opcją 'printf', i choć mam świadomość klasy Formatter, która prawdopodobnie będzie wystarczająco dobra do faktycznego formatowania łańcuchów, potrzebuję sposobu na zliczenie liczby argumentów które są zużywane przez wywołanie printf.Czy istnieje biblioteka Java do analizowania łańcuchów formatu printf?

Z góry mojej głowy, mógłbym prawdopodobnie zrobić coś z wyrażeń regularnych, aby policzyć liczbę "%", ale nie jestem zbyt obeznany z ciągami formatowania, więc mogę nie liczyć poprawnie ... (z wyłączeniem tych, z których uniknięto, itp.)

edit: Potrzebuję numeru parametru wraz z odwzorowaniem parametru # na typ parametru, więc na przykład "hello% s% + .3i" dałoby {0 - > String, 1 -> Integer}

+1

szukasz czegoś, co analizuje ciągi formatów ważnych dla klasy Formatter lub ciągi formatów ważnych dla printf C? (np. obsługuje łańcuchy '% * s' lub'% *. * f', które pobierają 2 lub 3 argumenty, więc nie możesz po prostu policzyć liczby% s) –

+1

jedynymi typami argumentów, które mają zastosowanie w moim przypadku są znaki , 32-bitowe liczby całkowite ze znakiem, 64-bitowe liczby podwójne i łańcuchy zakończone znakiem NUL. W przeciwnym razie powinien działać jak c printf, więc myślę, że Formatter nie jest dokładnie w porządku, ale prawdopodobnie zadziała dla moich celów, ponieważ dane wejściowe pochodzą z kompilatora, który napisałem. – Bwmat

+0

Hmm. Jeśli napisałeś kompilator, nie możesz napisać (względnie) prostego analizatora gramatyki dla jakiegokolwiek wariantu 'printf()', który chcesz obsługiwać, i użyć abstrakcyjnego drzewa składni do wygenerowania liczby argumentów? więcej pracy niż proste wywołanie biblioteki, ale jeśli masz narzędzia takie jak ANTLR lub cokolwiek innego do zrobienia parsowania, uważam, że nie byłoby to takie trudne, i możesz upewnić się, że twój program działa poprawnie. Jedynym powodem, dla którego to przedstawię, jest to, że pełne przetwarzanie printf nie jest takie łatwe. Jeśli możesz żyć bez składni o zmiennej szerokości, to upraszcza to całkiem sporo, a prawdopodobnie mógłbyś to zrobić z Regeksem –

Odpowiedz

1

Dlaczego po prostu nie użyjesz Regexa, który jest podobny do %(?:%|[0-9]+([dox])) i zbadasz w ten sposób specyfikator formatu?

Wystąpił inny temat związany z SO dotyczący parsing sprintf format strings with regex's, który może dać ci więcej pomysłów. Dopóki nie określisz, które funkcje printf() chcesz, trudno jest polecić dokładne wyrażenie regularne.

Lub, jak wspomniałem w moim komentarzu, jeśli używasz innego narzędzia kompilatora, tak jak ANTLR lub Parboiled, użyj tego do dekonstrukcji ciągu formatów na odpowiednie elementy za pomocą prostej specyfikacji gramatyki.

7

Format Strings interpretować każdą % jako miejsce, z dosłowne % czym uciekł jak %%, więc powinno być tak proste, jak to:

String formatString; 
int parameterCount = formatString.replace("%%", "").split("%").length - 1; 

Ten kod najpierw usuwa wszystkie uciekł (podwójny) %, wtedy liczy % poprzez rozłamu.

+0

+1 Dla 'counts% via split'. –

+0

Tak naprawdę, teraz, gdy o tym myślę, potrzebuję mapowania parametru # -> typ parametru, ugh. – Bwmat

Powiązane problemy