Вам может быть сложно сделать это с помощью регулярного выражения, потому что оно не помогает вашей подсветке синтаксиса понять контекст, т.е. регулярное выражение будет соответствовать чему-то, что появляется где угодно, независимо от того, является ли оно частью более крупного возможного совпадения.
Вам необходимо изучить генераторы синтаксического анализатора, такие как Antlr, которые - при правильной, однозначной грамматике - способны выдавать вам токены, которые учитывают эти детали. Например. если комментарий определен как «//» до EOL, он вернет токен комментария, который заменит любые строковые символы или что-то внутри.
Стандартный подход для подобных синтаксических анализаторов заключается в чтении в потоке символов (или токенов, более конкретно) по одному, поэтому выделение зависит не от порядка правил, которые вы определяете, а от порядка их появления в потоке.
Например, строка может состоять из двух двойных кавычек и всего, что находится между ними (кроме другой двойной кавычки). Комментарий - это две косые черты и все до конца строки.
Если при синтаксическом анализе вы обнаружите двойные кавычки, то ваша программа перейдет в режим «Я думаю, что это строка», и как только она найдет совпадающую конечную кавычку, она подтвердит токен строки и вернет его для выделения. Точно так же, если он находит две косые черты, он ищет, пока не найдет конец строки (или конец файла, на самом деле), а затем возвращает это как токен для выделения.
Ситуация усложняется, когда существует несколько возможных правил сопоставления, например для однострочных и многострочных комментариев. Если вы захватите один символ косой черты, ваша программа должна прочитать другой символ, прежде чем она сможет отклонить некоторые из этих параметров, то есть до тех пор, пока она не получит либо вторую косую черту, либо *, тогда она не будет знать, в каком токене он находится.
По сути, все сводится к конечным автоматам. Вы можете попробовать создать свой собственный, или вы можете получить что-то вроде Antlr, скормить ему грамматику и позволить ему делать всю вашу работу за вас.
person
ChrisC
schedule
19.07.2011