YuS wrote:Так это может в корне поменять подход к написанию регулярки. Если я правильно понял, то пробел не может являться разделителем самих аргументов? Если так, то в массиве с валидными строками это правило нарушено...
Да, правильно поняли: нет, пробел может быть разделителем только первого аргумента от команды. Между аргументами раздилителем может быть всегда только неэкранированная запятая.
YuS wrote:Если символ экранирования "`" присутствует в конце аргумента, то значит последующий символ экранируется и является частью аргумента, т.е. при наличии комментария в строке, последующий комментарий не выдерживает условия наличия пробела перед ";", так что всё правильно, а в случае отсутствия комментария - ничего не ломается. Или таки символ экранирования может принимать другие значения, кроме, собственно, экранирования? Если да, то такую неоднозначность трудно обработать, если вообще возможно...
Ну, можно и опустить этот случай, конечно, хотя ` в конце строки поломает окраску даже тогда, когда после неё нет комментария. В принципе, просто пробел нельзя же экранировать, поэтому когда ` присутствует в конце строки (перед комментарием или когда комментария нет) он парсером просто пропускается (считается как опущенный аргумент, если в аргументе ничего кроме ` нет). Довольно редкий случай, поэтому, можно и опустить.
YuS wrote:Ну, не совсем так. Движок по регуляркам, пока достаточно точно соответствует PCRE, за исключением некоторых особенностей, но это скорее необходимость, чем прихоть. Единственный момент - очень не хватает поиска по условию, с ним было бы гораздо проще в написании регулярок...
Я не про "вообще изменить его", а лишь подправить что-то, чтоб конструкция ([^,]|(?<=`),)* нормально заработала.
YuS wrote:Не подсвечивается только та часть массива, где нарушено правило разделителей, т.е. шесть строк с тремя аргументами...
Да, я позже только заметил, что эти строки ошибочно присутствуют в "SHOULD WORK:", извините.
YuS wrote:В общем, как-то так:
Code: Select all
0 "^\s*(?:(Else)(?:\s*,\s*|\s+)|(Try)(?:\s*,\s*|\s+)|([^:]{1,38}(?=::))::)*\s*(#IfWinActive\b)\s*?,?\s*?([^;,`]+(?!`.)|[^`,;]+`.|`.)*?\s*?,?\s*?([^;,`]+?(?!`.)|[^`,;]+?`.|`.)*?(\s+;.*)?\s*$" `\1=(4,${OP},0) \2=(4,${IF},0) \3=(2,${STR},0) \4=(2,${TYPE},0) \5=(2,${ATTR},#ff0000) \6=(2,${ATTR},#00ff00) \7=(3,${COMM},0)`
Спасибо, сходу прошло все существующие тесты и даже не ломается на двух подряд идущих экранированных символа.
Спасибо огромное!
Пока что, это лучшее из всех правил и ломается только на ` в конце строки, других отхождений от канонов парсера - пока не заметил.