[Qt-creator] SyntaxHighlighting + Bison/FLex

Nikolai Kosjar nikolai.kosjar at qt.io
Tue Jan 2 10:26:21 CET 2018


Hi!

Within your derived TextEditor::SyntaxHighlighter class, you should be 
able to access currentBlock().blockNumber() - if you document does not 
have any fancy layout items (images, tables), that one should correspond 
to the line number (maybe off by one, don't remember).

You probably would also derive from TextEditor::TextDocument. From 
there, you can start your async lexing/parsing operation if the document 
is opened or changed. Connect to IDocument::filePathChanged  and 
Core::IDocument::contentsChanged. See e.g. CppEditorDocument for details 
(this is more than you need, your version would look much simpler).

Nikolai


On 11/23/2017 10:26 AM, JeremY Larrieu wrote:
> Hello
> 
> @Eike that's exactly what I wanna do. But I don't know where I can 
> connect tout this signals and the "highlightBlock" method doesn't 
> provide the line number to highlight nor from which file the line comes 
> from.
> 
> Jeremy
> 
> Le 23 nov. 2017 10:06, "JeremY Larrieu" <adrenalinedj at gmail.com 
> <mailto:adrenalinedj at gmail.com>> a écrit :
> 
>     Hello,
> 
>     Thanks for your answers.
> 
>     I will look to semantic highlighting.
>     The purpose seems to fit my needs: syntax highlighting, symbol
>     detection, ... each time a file is opened or modified.
> 
>     @Nikolai the lex file works with at most 4/5 states and was not made
>     to work line by line. Modifying it in this direction will not help
>     me to stick closer to the language when new features will come. I
>     will have to make too many updates to my lex file each time the
>     one's coming with the language is updated.
> 
>     Thanks again.
> 
>     Jeremy
> 
>     Le 23 nov. 2017 09:19, "Nikolai Kosjar" <nikolai.kosjar at qt.io
>     <mailto:nikolai.kosjar at qt.io>> a écrit :
> 
>         On 11/23/2017 07:29 AM, JeremY Larrieu wrote:
> 
>             Hello,
> 
>             I'm working on making a plugin to support a specific
>             language: Anubis.
> 
>             I've started the highlighting part and I saw that QtCreator
>             is making syntax highlighting line by line instead of making
>             it "globally" for the whole file.
> 
>             I just wanna know, how can I use the Bison/Flex files, used
>             to check syntax for Anubis language, to make syntax
>             highlighting in QtCreator.
>             Knowing that most of the tokens declared in the Flex file
>             can be multiline, making a lexer, working line by line, able
>             to detect those tokens is hard and the code is too "verbose".
> 
>             I've tried to adapt what I've found in Bison/Flex files to
>             make a syntax highlighter, but it's really painful and it
>             makes further updates harder.
>             If I was able to apply highlighting on the whole file (not
>             line by line), it were simpler and I could use it to make
>             some other functionalities at the same time: code
>             completion, code analysis, symbol detection, ...
> 
>             Do you have an idea on how I can make syntax highlighting
>             without rewriting a full lexer ?
> 
>             Thanks in advance.
> 
>             Jeremy
> 
> 
>         Hi!
> 
>         I guess you've found TextEditor::SyntaxHighlighter, which does
>         the line by line highlighting with highlightBlock(). For C++ and
>         multi-line tokens (e.g. C comments) we call our custom lexer for
>         the current line with the lexer state from the line before. If
>         flex provides such a state based yylex() equivalent, this might
>         work.
> 
>         The alternative is to use
>         SemanticHighlighter::incrementalApplyExtraAdditionalFormats().
>         With this one, you can for example start parsing in a worker
>         thread and provide the highlighting information as a stream of
>         TextEditor::HighlightingResult items.
> 
>         Nikolai
> 




More information about the Qt-creator mailing list