открывающая скобка начинает блок?

dimon40001
Posts: 21
Joined: 05.05.2022 18:52

открывающая скобка начинает блок?

Post by dimon40001 »

Нужна помощь коллективного разума. Не могу понять, баг, фича, или косяк с настройками и regexp.

Пытаюсь сделать свой лексер для indented text по типу Python lexer.

Возникла проблема: без явного указания на то редактор делает еще один "блок", если видит открывающую скобку вида ( { или [.

Пример лексера и скриншот в аттаче.
Текст примера положен в Sample text лексера.

Парсеры из настроек лексера:

^Text (любой символ, смещенный на кратное 4 расстояние от начала строки) - этот token активирует block rule

Code: Select all

(?<=^(\x20{4}|\t)*).
Text (любой символ)

Code: Select all

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

2022-05-06 00_59_18.png
Text (simple tabs).zip
(1.03 KiB) Downloaded 73 times
Last edited by dimon40001 on 05.05.2022 23:01, edited 1 time in total.
main Alexey
Posts: 2245
Joined: 25.08.2021 18:15

Post by main Alexey »

1- "Text" надо не просто "точка" а "точка с повтором" чтобы ОДИН токен ловил все символы до конца строки (или хотябы до конца слова - regex \S+ или .\S* ). когда у вас 30 токенов по 1 символу - это медленно.

2- да, в парсере есть требование чтобы скобки были парные, иначе блок не закроется. опять же - если Text захватит всю строку до конца то скобки не токенизируются и проблемы не будет
main Alexey
Posts: 2245
Joined: 25.08.2021 18:15

Post by main Alexey »

лексер (сбились рус-буквы, т к открыл в synwrite).
Attachments
Text (simple tabs)_AT.zip
(861 Bytes) Downloaded 69 times
dimon40001
Posts: 21
Joined: 05.05.2022 18:52

Post by dimon40001 »

1. От "точки с повтором" пришлось отказаться, т.к. есть желание подсвечивать отдельным стилем все символы типа + - % и скобок в том числе. Причем почему-то парсер

Code: Select all

[\+\-\(\)]+
не срабатывает, хотя находится выше по приоритету, чем парсер

Code: Select all

.\S*
2, да,это помогает отчасти, но если скобка будет стоять отдельно, разделенная пробелами, то она запарсится как самостоятельная скобка-токен и, соответственно, будет ожидать закрывающей скобки. Причем я обратил внимание, что порядок скобок при этом не важен. Т.е. конструкция вида )( не вызовет создание нового блока.

В целом, я делаю для себя вывод, что это особенность движка.

В примере из коробки Text with indentation скобки не вызывают проблем, т.к. там токен захыватывает строку целиком по принципу .*
Но как только возникает желание подсветить отдельными стилями строки внутри кавычек или цифры, или символы, то уже невозможно захватывать строку целиком, нужно прописывать отдельные регулярки, и тогда скобки начинают жить своей жизнью.
main Alexey
Posts: 2245
Joined: 25.08.2021 18:15

Post by main Alexey »

regex \S+ просто захватывает слишком много, и потому он захватывает все что мог
бы захватить regex [\+\-\(\)] . так что надо усложнить регулярку для слов.
не \S+ а [^\-\+\(\)] .
это поймает символы КРОМЕ тех что перечислены. из-за "галочки вверх".
а потом уже ловите вторым правилом что останется.
но скобки если будете ловить по одной - то нарветесь на поверение парсера когда он требудет парные скобки.
это пока не поменять.
dimon40001
Posts: 21
Joined: 05.05.2022 18:52

Post by dimon40001 »

Спасибо!

Я также пробовал отловить скобку, включая начальный пробел перед ней, т.е. не в чистом виде скобка, а 2 символа " (" Но это тоже не сработало:
\x20[\(\)]+

Еще вопрос:
можно ли как-то отслеживать уровень вложенности? Например, хочется сделать так, чтобы последние (самые глубокие) уровни вложености не отображались в code tree? По аналогии с тем, как в Проводнике Widows в дереве не отображаются файлы (конечные элементы), а только папки.
main Alexey
Posts: 2245
Joined: 25.08.2021 18:15

Post by main Alexey »

>>Но это тоже не сработало: \x20[\(\)]+

сработает если выключите опцию в лексере- Skip spaces while parsing.

>>чтобы последние (самые глубокие) уровни вложености не отображались в code tree?

можно, написав tree helper
https://wiki.freepascal.org/CudaText_API#TreeHelpers
main Alexey
Posts: 2245
Joined: 25.08.2021 18:15

Post by main Alexey »

или - если дать разные правила для "терминальных" узлов и нетерминальных. в лексере.
main Alexey
Posts: 2245
Joined: 25.08.2021 18:15

Post by main Alexey »

!!
делаю вам ПОБЛАЖКУ. теперь, если group_index=21, то проверка на скобки пропустится. если 20, то как и раньше.
это group index для Block Rule в св-вах лексера.
проверьте бету - http://uvviewsoft.com/c/
dimon40001
Posts: 21
Joined: 05.05.2022 18:52

Post by dimon40001 »

main Alexey wrote:>>Но это тоже не сработало: \x20[\(\)]+

сработает если выключите опцию в лексере- Skip spaces while parsing.

>>чтобы последние (самые глубокие) уровни вложености не отображались в code tree?

можно, написав tree helper
https://wiki.freepascal.org/CudaText_API#TreeHelpers
Это очень круто! Я просто впечатлен возможностями редактора и в то же время его легковестностью. Доделаю парсер и постараюсь сделать Tree Helper.

Как я понимаю, code tree и code blocks между собой никак не связаны. Точнее code blocks могут поставлять информацию для дерева, если отсутствует tree helper. Если tree helper найден, то используется он.
Post Reply