C++ создает [закрытый] синтаксический анализатор

Не знайте, немного ли это действительно лучше, но по крайней мере это использует 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");
}
9
задан Szymon Lipiński 3 December 2009 в 22:37
поделиться

6 ответов

Вы также можете посмотреть на них ссылки:

18
ответ дан 4 December 2019 в 06:14
поделиться

Это сильно зависит от грамматики. Мне нравятся парсеры с рекурсивным спуском, которые обычно пишутся от руки (хотя можно сгенерировать один из описания грамматики).

Если вы собираетесь использовать генератор синтаксического анализатора, есть два хороших варианта: Byacc и Antlr. Если ты хочешь чего-то такого ' s (разумно) совместимый с yacc, Byacc (безусловно) ваш лучший выбор. Если вы начинаете с самого начала, не имея ни существующего кода, ни опыта, позволяющего использовать что-то совместимое с yacc, тогда Antlr почти наверняка ваш лучший выбор.

Поскольку это уже упоминалось, я также немного расскажу о Bison. Я бы избегал Бизона, как чумы. Здесь применим совет Брукса: «Планируйте выбросить один». Роберт Корбетт (автор Byacc) написал Bison как свою первую попытку создать генератор синтаксического анализатора. К сожалению, он отдал его GNU, а не выбросил. В классическом случае, когда маркетинг побеждает техническое совершенство, Bison широко используется (и даже рекомендуется теми, кто не знает лучшего), в то время как Byacc остается относительно неясным.

Edit: Я ненавижу это делать, но так как это тоже было упомянул, я Также прокомментирую Boost.spirit. Хотя это может быть самый крутой пример метапрограммирования шаблонов, у него есть несколько проблем, которые заставляют меня рекомендовать не пытаться использовать его серьезно.

  1. Время компиляции с его помощью может быть мучительным - 10 минут обычно, а более крупная / более сложная грамматика может занять еще больше времени (при условии, что это не приведет к сбою компилятора).
  2. Если вы сделаете какую-либо ошибку, она может и часто будет выдавать безумно длинные сообщения об ошибках, которые практически невозможно расшифровать. Сообщения об ошибках из кода с большим количеством шаблонов в любом случае заведомо плохи, и Spirit нагружает систему больше, чем что-либо еще.

Поверьте мне: тот факт, что вы вообще можете написать что-то вроде Spirit, находится прямо на границе между впечатляющим и удивительным - - но я'

9
ответ дан 4 December 2019 в 06:14
поделиться

Есть flex и bison . Двоюродные братья Лекс и Як, которые действительно принимают во внимание существование C ++.

8
ответ дан 4 December 2019 в 06:14
поделиться

Я использовал bison , нашел примеры, подходящие для моего уровня. С его помощью можно было создать простой калькулятор, конечно, он может гораздо больше.

Калькулятор взял, например, 1 + 2 * 3 и построил синтаксическое дерево. Однако в документации не описывалось, как построить дерево, и мне потребовалось немного времени, чтобы поработать.

Если бы я собирался снова, я бы посмотрел на «antlr», так как он выглядел хорошо и хорошо поддерживался.

Мартин .

2
ответ дан 4 December 2019 в 06:14
поделиться

Вы смотрели Лекса и Якка ? Цитата из раздела 5 связанного документа:

Мой предпочтительный способ создания синтаксического анализатора C ++ заключается в том, чтобы Лекс сгенерировал простой C файл и позволить YACC генерировать C ++ код. Когда вы затем свяжете свой приложение, вы можете столкнуться с некоторыми проблемы, потому что код C ++ по умолчанию не сможет найти C функции, если вы не сказали, что это extern "C".

3
ответ дан 4 December 2019 в 06:14
поделиться

Лучший способ создать синтаксический анализатор - использовать lex и yacc.

2
ответ дан 4 December 2019 в 06:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: