Не знайте, немного ли это действительно лучше, но по крайней мере это использует StringBuilder, который может быть немного более эффективным.
Вниз ниже более универсальный подход, если можно создать список параметров ПРЕЖДЕ, ЧЕМ сделать какое-либо разграничивание параметра.
// Answers real question
public String appendWithDelimiters(String delimiter, String original, String addition) {
StringBuilder sb = new StringBuilder(original);
if(sb.length()!=0) {
sb.append(delimiter).append(addition);
} else {
sb.append(addition);
}
return sb.toString();
}
// A more generic case.
// ... means a list of indeterminate length of Strings.
public String appendWithDelimitersGeneric(String delimiter, String... strings) {
StringBuilder sb = new StringBuilder();
for (String string : strings) {
if(sb.length()!=0) {
sb.append(delimiter).append(string);
} else {
sb.append(string);
}
}
return sb.toString();
}
public void testAppendWithDelimiters() {
String string = appendWithDelimitersGeneric(",", "string1", "string2", "string3");
}
Вы также можете посмотреть на них ссылки:
Это сильно зависит от грамматики. Мне нравятся парсеры с рекурсивным спуском, которые обычно пишутся от руки (хотя можно сгенерировать один из описания грамматики).
Если вы собираетесь использовать генератор синтаксического анализатора, есть два хороших варианта: Byacc и Antlr. Если ты хочешь чего-то такого ' s (разумно) совместимый с yacc, Byacc (безусловно) ваш лучший выбор. Если вы начинаете с самого начала, не имея ни существующего кода, ни опыта, позволяющего использовать что-то совместимое с yacc, тогда Antlr почти наверняка ваш лучший выбор.
Поскольку это уже упоминалось, я также немного расскажу о Bison. Я бы избегал Бизона, как чумы. Здесь применим совет Брукса: «Планируйте выбросить один». Роберт Корбетт (автор Byacc) написал Bison как свою первую попытку создать генератор синтаксического анализатора. К сожалению, он отдал его GNU, а не выбросил. В классическом случае, когда маркетинг побеждает техническое совершенство, Bison широко используется (и даже рекомендуется теми, кто не знает лучшего), в то время как Byacc остается относительно неясным.
Edit: Я ненавижу это делать, но так как это тоже было упомянул, я Также прокомментирую Boost.spirit. Хотя это может быть самый крутой пример метапрограммирования шаблонов, у него есть несколько проблем, которые заставляют меня рекомендовать не пытаться использовать его серьезно.
Поверьте мне: тот факт, что вы вообще можете написать что-то вроде Spirit, находится прямо на границе между впечатляющим и удивительным - - но я'
Есть flex и bison . Двоюродные братья Лекс и Як, которые действительно принимают во внимание существование C ++.
Я использовал bison , нашел примеры, подходящие для моего уровня. С его помощью можно было создать простой калькулятор, конечно, он может гораздо больше.
Калькулятор взял, например, 1 + 2 * 3 и построил синтаксическое дерево. Однако в документации не описывалось, как построить дерево, и мне потребовалось немного времени, чтобы поработать.
Если бы я собирался снова, я бы посмотрел на «antlr», так как он выглядел хорошо и хорошо поддерживался.
Мартин .
Вы смотрели Лекса и Якка ? Цитата из раздела 5 связанного документа:
Мой предпочтительный способ создания синтаксического анализатора C ++ заключается в том, чтобы Лекс сгенерировал простой C файл и позволить YACC генерировать C ++ код. Когда вы затем свяжете свой приложение, вы можете столкнуться с некоторыми проблемы, потому что код C ++ по умолчанию не сможет найти C функции, если вы не сказали, что это extern "C".
Лучший способ создать синтаксический анализатор - использовать lex и yacc.