Как определить язык для notepad ++ с использованием регулярных выражений и грамматики, определенной в flex-bison - PullRequest
0 голосов
/ 21 марта 2020

Я работаю над компилятором для круто в качестве назначения курса по компилятору, но я хотел бы написать код на классном языке в notepad ++, поэтому мне нужно определить этот язык для notepad ++, я уже написал определение лексера в гибкий формат и я собираюсь разработать парсер для клёва. Есть ли возможность использовать эти материалы для определения языка для блокнота ++?

1 Ответ

1 голос
/ 23 марта 2020

Я бы так подумал. (Я не использую Notepad ++, потому что я не использую Windows, поэтому у меня нет хорошего способа проверить эту теорию.)

Насколько я понимаю, Noteoad ++ основан на Scintilla, а Scintilla предоставляет механизм добавления пользовательских лексеров, использующий протокол, описанный в файле doc / Lexer.txt в исходном коде Scintilla.

По сути, чтобы сгенерировать сгибаемый текст процесса лексера с использованием этого протокола, вам нужно будет либо прочитать текст, который нужно отсканировать, во временный буфер, либо показать yylex, как читать текст (что означает компиляцию лексера с помощью пользовательского YY_INPUT макроса ).

Я бы go для первого варианта, потому что для настройки YY_INPUT, вам нужно убедиться, что несколько значений видны в функциях, которые включают расширения YY_INPUT и, к сожалению, авторы Flex никогда не принимал во внимание такую ​​потребность. (Однако это можно сделать. Я просто избегаю длинного описания того, как это сделать.)

Чтобы предоставить правильные аргументы для styler.ColourTo(), вам необходимо отследить текущий сцинтиллы положение курсора. Для этого инициализируйте переменную курсора startPos и увеличивайте ее с cursor += yyleng в каждое действие . Flex позволяет легко что-то делать в каждом действии: просто определите макрос YY_USER_ACTION. ( ПРИМЕЧАНИЕ: Если вы используете yyless или yymore, вам необходимо исправить положение курсора в соответствующих действиях.)

...