Прикрутил студийный Nemerle.Completion2.ScanLexer для подсветки кода Nemerle.
Все вроде работает, кроме комментариев: лексер их попросту игнорирует (не выпускает нужные токены). Ни в лексере, ни в менеджере (ну там ясно, что не должно быть), ни в препарсере, не нашел как их включить. LexerString и PreParser так же их игнорируют. LexerFile вообще не захотел работать: говорит duplicate files in project.
Пока что просто использую простенький парсер на Irony, чтобы найти и раскрасить комментарии (работает, но капли не элегантно).
Куда копать? Что это вообще может быть? Может, как-то связано с тем, что я использую Manager от Nemerle.Completion2.Engine?
Здравствуйте, catbert, Вы писали:
C>Прикрутил студийный Nemerle.Completion2.ScanLexer для подсветки кода Nemerle.
C>Все вроде работает, кроме комментариев: лексер их попросту игнорирует (не выпускает нужные токены).
ScanLexer комментарии точно обрабатывает. См. стоку 807 ScanLexer.n
Проблема может быть в том, что ScanLexer рассчитан на построчную обработку (так как он предназначен для редактора кода) с промежуточным сохранением состояния.
Возможно тебе лучше использовать LexerString.
C>Ни в лексере, ни в менеджере (ну там ясно, что не должно быть), ни в препарсере, не нашел как их включить. LexerString и PreParser так же их игнорируют. LexerFile вообще не захотел работать: говорит duplicate files in project.
В лексерах отличных от ScanLexer комментарии игнорируются если в Manager.Options.LexerStoreComments установлено false. Но и при этом токены не формирются, а комментарии запихиваются в какую-то хэш-таблицу.
Лучше всего (наверно) поступить так...
Создать наследника LexerString. Переопределить в нем метод comment_beginning и в нем уже отлавливать местоположение комментариев и обрабатывать как надо.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Лучше всего (наверно) поступить так...
VD>Создать наследника LexerString. Переопределить в нем метод comment_beginning и в нем уже отлавливать местоположение комментариев и обрабатывать как надо.
Так и сделал. Из тех конструкций языка, которые я тестировал, нераспознанными остались только директивы препроцессора. В связи с чем маааахонький фич-реквест. Метод parse_preprocessor в LexerBase надо сделать виртуальным защищенным. Это позволит из лексера видеть директивы (что полезно для подсветки синтаксиса и для внешних анализаторов кода), а издержкой будет только виртуальный вызов для каждой прагмы (что недорого).
Для этого просто надо строчку 1366 в /nemerle/trunk/ncc/parsing/Lexer.n поменять:
Здравствуйте, catbert, Вы писали:
C>Так и сделал. Из тех конструкций языка, которые я тестировал, нераспознанными остались только директивы препроцессора. В связи с чем маааахонький фич-реквест. Метод parse_preprocessor в LexerBase надо сделать виртуальным защищенным. Это позволит из лексера видеть директивы (что полезно для подсветки синтаксиса и для внешних анализаторов кода), а издержкой будет только виртуальный вызов для каждой прагмы (что недорого).
C>Для этого просто надо строчку 1366 в /nemerle/trunk/ncc/parsing/Lexer.n поменять: C>