2012-04-01 2 views
6

Я пишу эмулятор для машины с кодом операции printf, и хотя я знаю класс Formatter, который, вероятно, будет достаточно хорош для фактического форматирования строк, мне нужен способ подсчета количества аргументов которые потребляются вызовом printf.Есть ли библиотека Java для разбора строк формата printf?

Сверху моей головы я мог бы что-то сделать с регулярным выражением, чтобы подсчитать количество «%», но я не слишком хорошо знаком с строками формата, поэтому я мог не считать правильно ... (исключая экранированные и т. д.)

Редактировать: Мне действительно нужно количество параметров вместе с отображением параметра # в тип параметра, так что, например, «привет% s% +. 3i» даст {0 - > String, 1 -> Integer}

+1

Вы ищете что-то, что разбирает строки формата, действующие для класса Formatter, или форматируют строки, пригодные для C printf? (например, поддерживает строки '% * s' или'% *. * f', которые принимают 2 или 3 аргумента, поэтому вы не можете просто подсчитать количество% s) –

+1

, только типы аргументов, которые применяются в моем случае, являются символами , 32-разрядные целые числа со знаком, 64-разрядные удвоения и строки с нулевым завершением. В противном случае он должен действовать как c printf, поэтому я думаю, что Formatter не совсем прав, но он, вероятно, будет работать для моих целей, поскольку входные данные поступают от компилятора, который я написал в любом случае. – Bwmat

+0

Хм. Если вы написали компилятор, не можете ли вы написать (относительно) простой грамматический синтаксический анализатор для любого варианта 'printf()', который хотите поддерживать, и использовать абстрактное синтаксическое дерево для генерации аргумента count? больше работы, чем простой вызов библиотеки, но если у вас есть инструменты, такие как ANTLR или что-то в этом роде, я бы подумал, что это будет не так сложно, и вы можете убедиться, что ваша программа работает правильно. Единственная причина, по которой я это объясняю, заключается в том, что полный синтаксический анализ printf не так прост. Если вы можете жить без синтаксиса переменной ширины, это упрощает его, и вы, вероятно, можете сделать это с помощью Regex –

ответ

1

Почему бы вам просто не использовать регулярное выражение, что-то вроде %(?:%|[0-9]+([dox])), и изучить его спецификатор типа?

Была еще одна тема о parsing sprintf format strings with regex's, которая может дать вам еще несколько идей. Если вы не укажете, какие функции printf() вам нужны, сложно рекомендовать точное регулярное выражение.

Или, как я уже упоминал в своем комментарии, если вы используете другой инструмент компилятора в любом случае, как ANTLR или Parboiled, используйте это, чтобы деконструировать строку формата в соответствующие фрагменты с помощью простой спецификации грамматики.

7

Format Strings интерпретировать каждый % как заполнитель, с буквальным % быть экранированы, как %%, так что это должно быть так же просто, как это:

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

Этот код сначала удаляет все экранированы (вдвое) %, затем рассчитывает % через раскол.

+0

+1 Для 'counts% via split'. –

+0

Фактически, теперь, когда я думаю об этом, мне действительно нужно отобразить параметр # -> type, ugh. – Bwmat

Смежные вопросы