1

При редактировании этого и того же в Vim я часто обнаруживаю, что его подсветка синтаксиса (для некоторых типов файлов) имеет некоторые недостатки. На данный момент я не могу вспомнить ни одного примера, но кто-то наверняка это сделает. Обычно он состоит из строк, которые в некоторых случаях сильно выделяются, некоторые вещи с арифметическими и булевыми операторами и некоторые другие мелкие вещи.Что такое альтернативы регулярным выражениям для подсветки синтаксиса?

Теперь vim использует регулярные выражения для этого рода вещей (собственный вкус).

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

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

Редактировать-1: Например, редакторы, такие как Emacs, Notepad2, Notepad ++, Visual Studio - знаете ли вы, какой механизм они используют для синхронизации. высокая. ?

ответ

4

Мысль о том, что вам нужно использовать вместо регулярных выражений для выделения синтаксиса, - синтаксический анализ. Regexes имеет много преимуществ, но, как мы видим с подсветкой vim, существуют ограничения. (Если вы ищете темы об использовании регулярных выражений для анализа XML, вы найдете обширный материал о том, почему регулярные выражения не могут делать то, что делают синтаксические анализаторы.)

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

1

Я предлагаю использовать RE для подсветки синтаксиса. Если он не работает должным образом, ваш RE не является достаточно мощным или сложным :-) Это одна из тех областей, где REs блестят.

Но при условии, что вы не можете предоставить примеры неудач (чтобы мы могли рассказать вам, в чем проблема), или имена редакторов, которые делают это лучше (чтобы мы могли рассказать вам, как они это делают), есть не намного больше мы сможем дать вам ответ.

У меня никогда не возникало проблем с Vim с основными языками, и мне никогда не приходилось использовать странные эзотерические языки, поэтому это подходит для моих целей.

+0

@Pax, вы действительно используете REs над полноразмерным синтаксическим анализатором для выделения синтаксиса? Я думал, что это будет один из тех случаев, когда вы хотите использовать парсер. – mmcdole

+0

Парсеры лучше, но обычно им приходится обрабатывать больше источников и сложнее писать. REs (если сделано правильно) может быть быстрее и работать в подавляющем большинстве случаев, потому что источник имеет естественные контрольные точки (например, точка с запятой для C, если предположить, что это не внутренние кавычки). Имейте в виду, что это окрашено моим опытом - мне никогда не приходилось писать код Forth в Vim, поэтому, насколько я знаю, REs может быть дерьмом. Языки, которые я использую, похоже, работают нормально, хотя я, вероятно, мог бы их разбить, если бы я сделал свой исходный код довольно уродливым. – paxdiablo

2

Если вам нужна точная подсветка, вам нужно настоящее программирование, а не регулярные выражения. RegExs редко являются ответом на что-либо, кроме тривиальных задач. Чтобы сделать выделение лучше, вам нужно написать простой парсер. У парсеров в основном есть отдельные компоненты, каждый из которых может делать что-то вроде идентификации и потреблять цитированную строку или числовой литерал. Если указанный компонент при взгляде на заданный курсор не может потреблять то, что находится под ним, он ничего не делает. Из этого вы можете легко разобрать или выделить достаточно просто и легко.

Относится к

статическое поле int = 123;

• Первый макрос пропустил пробел перед «статическим». Ключевое слово, литералы и т. Д. Не будут делать ничего, потому что обработка пробелов не является их вещью.

• Ключевое слово, сопоставленное, когда оно расположено над «статическим», будет потреблять это. Поскольку «s» не является цифрой, литеральное совпадение ничего не делает. Пробел-шкипер ничего не делает, потому что «s» не является символом пробела.

Естественно, ваша петля продолжает продвигать курсор над входной строкой до тех пор, пока не будет достигнут конец. Важное значение имеет упорядочение ваших помощников.

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

3

Некоторые языки программирования имеют формальное определение/спецификации написано в Backus-Naur Form. В нем могут быть описаны все языки программирования *). Все, что вам нужно, это какой-то парсер для обозначения.

*) не проверено

Например, C's BNF определение "длиной всего пять страниц".