@ElderHobo

Распознавание кода, конечный автомат, лексический анализатор и прочие умные слова?

Я имею очень смутные представления о том как решить мою проблему. Существует некий редактор текста, нужно сделать так чтобы все элементы этого кода распознавались этим редактором. Это реализовано в любом фреймворке. Фреймворк может определить где начинается ,например,класс, и где он заканчивается. На форумах мне рассказали про конечный автомат, и я все равно не понял как он может работать с конкретно этой задачей. Так как я вижу что эта задача уже решена во многих проектах, появляется предположение что где-то лежит готовый пример.
0d6d863f25494a97967f02453f53c8c0.PNG
  • Вопрос задан
  • 2408 просмотров
Решения вопроса 1
Nipheris
@Nipheris Куратор тега C++
Если вам нужна конкретно простейшая подсветка синтаксиса (как в вашем примере с html), то вам достаточно лексического анализа. Вам нужно выбирать токены в тексте, и в зависимости от типа токена, выбирать цвет для подсветки. В разных средах это будет реализовано по-разному - в Саблайме это делается через спец. язык описания конечных автоматов, в других редакторах могут использоваться регулярные выражения, в Visual Studio пишется лексический анализатор на ЯП общего назначения.

Поглядите на эти инструменты, С/С++: Flex, ANTLR для дотнет-языков еще FsLex хорош (правда, синтаксис у него F#-овский).

Если нужен более сложный анализ (например, подстановки в зависимости от контекста), смотрите ответ Дмитрий Макаров - это уже синтаксический анализ, следующий этап после лексического. Упомянутый Yacc - это классическая пара к Lex/Flex. Есть и более современный аналог, совместимый с Yacc - Bison. Под дотнет могу посоветовать тот же ANTLR, и FsYacc в пару к FsLex.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
DmitryITWorksMakarov
@DmitryITWorksMakarov
Я так понимаю вам сюда: Синтаксический анализ и, например, сюда: yacc
Ответ написан
Комментировать
@abcd0x00
На форумах мне рассказали про конечный автомат, и я все равно не понял как он может работать с конкретно этой задачей.

Если не знаешь, что такое конечный автомат (никогда не делал), то задачу эту не решишь (только с ошибками если). Конечный автомат не даёт, к примеру, выделить ключевое слово, которое находится внутри комментария, потому что он понимает, где место снаружи комментария, а где место внутри комментария. Поэтому в таких случаях и регулярные выражения не помогут (как многие, бывает, думают).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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