2014-12-11 1 views
1

У меня есть простой текстовый редактор. Я хотел бы добавить к нему C-like /* comment blocks */. Я имею в виду многострочные комментарии, конечно.Алгоритм для раскраски блоков комментариев C-like/* */

Его структура данных выглядит следующим образом:

struct TextEdit 
{ 
    struct Line 
    { 
     char* str; 
     int len; 
    }; 

    Line* index; 
    int lines; 

    void Modified(int line_from, int line_to); 

    bool IsInBlockComment(int line, int column); 
}; 

Modified() называется каждый раз, когда текст изменён таким образом, редактор имеет возможность повторного сканирования содержимого модифицированного спектра линий.

  • Как бы вы реализовали метод IsInBlockComment(), который может определить, находится ли данная позиция в тексте внутри комментария блока?
  • Какие дополнительные данные следует добавлять и поддерживать на уровне Modified(), чтобы иметь возможность делать это эффективно?

Важная деталь:

/* и */ маркеры не должны быть в действительности, если они происходят после // комментария или внутри "" и '' текстовых строк.

Я не прошу использовать исходный код или подробные спецификации, я прошу только краткую концепцию.

+3

Что вы попробовали? – thumbmunkeys

+0

На самом деле это не тривиальная задача. Вам придется реализовать парсер, который будет обрабатывать однострочные комментарии и строки. – MightyPork

+0

Он уже разбирает отдельные строки и «литералы», главное - с/* * /, таким образом, мне не нужно будет переписывать весь документ каждый раз, когда он имеет небольшое изменение, как указано в модифицированном методе. – Anonymous

ответ

2

Прежде всего обратите внимание на то, что C поддерживает многострочные строки, поэтому у вас уже была эта проблема, просто не рассматривалась.

Ваш синтаксический анализатор имеет состояние . Вы должны знать, находитесь ли вы в литеральной строке или C, например, комментарии и т. Д.

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

Контролируя частоту таких снимков состояния (например: сохраняя их только для каждой 10-й линии), вы можете контролировать компромисс между скоростью и объемом памяти.

+0

Хорошо, можно ли как-то обнаружить после повторного анализа модифицированного блока, когда остановиться разборе? Я действительно не хочу повторно разбирать до конца файла. Достаточно ли этого, чтобы проверить, было ли предыдущее состояние синтаксиса таким же, как текущий синтаксический анализатор? – Anonymous

+0

Да. Об этом я уже сказал в ответ. –

+0

Это блестящий ответ! Сэкономил много времени на других вещах и обеспечил оптимальную производительность, он прост в обслуживании и имеет очень низкие потребности в дополнительном хранилище. – Anonymous