Я пишу эмулятор для машины с кодом операции printf, и хотя я знаю класс Formatter, который, вероятно, будет достаточно хорош для фактического форматирования строк, мне нужен способ подсчета количества аргументов которые потребляются вызовом printf.Есть ли библиотека Java для разбора строк формата printf?
Сверху моей головы я мог бы что-то сделать с регулярным выражением, чтобы подсчитать количество «%», но я не слишком хорошо знаком с строками формата, поэтому я мог не считать правильно ... (исключая экранированные и т. д.)
Редактировать: Мне действительно нужно количество параметров вместе с отображением параметра # в тип параметра, так что, например, «привет% s% +. 3i» даст {0 - > String, 1 -> Integer}
Вы ищете что-то, что разбирает строки формата, действующие для класса Formatter, или форматируют строки, пригодные для C printf? (например, поддерживает строки '% * s' или'% *. * f', которые принимают 2 или 3 аргумента, поэтому вы не можете просто подсчитать количество% s) –
, только типы аргументов, которые применяются в моем случае, являются символами , 32-разрядные целые числа со знаком, 64-разрядные удвоения и строки с нулевым завершением. В противном случае он должен действовать как c printf, поэтому я думаю, что Formatter не совсем прав, но он, вероятно, будет работать для моих целей, поскольку входные данные поступают от компилятора, который я написал в любом случае. – Bwmat
Хм. Если вы написали компилятор, не можете ли вы написать (относительно) простой грамматический синтаксический анализатор для любого варианта 'printf()', который хотите поддерживать, и использовать абстрактное синтаксическое дерево для генерации аргумента count? больше работы, чем простой вызов библиотеки, но если у вас есть инструменты, такие как ANTLR или что-то в этом роде, я бы подумал, что это будет не так сложно, и вы можете убедиться, что ваша программа работает правильно. Единственная причина, по которой я это объясняю, заключается в том, что полный синтаксический анализ printf не так прост. Если вы можете жить без синтаксиса переменной ширины, это упрощает его, и вы, вероятно, можете сделать это с помощью Regex –