Scintilla.NET 基于正则表达式的语法突出显示

本文关键字:语法 显示 正则表达式 NET Scintilla | 更新日期: 2023-09-27 18:31:57

是否可以使用正则表达式在Scintilla中定义语法突出显示?如果是这样,该怎么做?

我有一种自定义语言要处理,不能用简单的关键字和分隔符来描述。这种语言中特定结构的含义仅取决于它们相对于关键字的位置。我有这种格式的基于正则表达式的解析器,我所需要的只是将正则表达式定义的规则应用为文本样式。

我的意思是,如果某些东西与正则表达式 1 匹配,它应该具有 style1。可能吗?如何?

如果没有 - 我可以为手动选择的范围设置样式吗?我的意思是在编辑器中将样式编号分配给指定的字符范围。怎么办?

是否可以在代码中定义 Scintilla 样式,而不是在 xml 文件中定义?

编辑:好的,我找到了办法。

foreach (Match m in Patterns.Keyword0.Matches(Encoding.ASCII.GetString(e.RawText)))
                        e.GetRange(m.Index, m.Index + m.Length).SetStyle(1);

问题是原始文本属性。它是 UTF-8 编码文本的字节缓冲区。text 属性包含漂亮的 UTF-16 文本,但 GetRage 方法接受字节偏移量而不是字符偏移量。如果我在每个 TextChanged 事件上使用转换,我几乎失去了使用 Scintilla 的所有速度优势。

当然,最简单的方法是将内部编码更改为 UTF-16,但是当我这样做时,我收到异常说不支持此编码。唯一支持的一个似乎是 UTF-8,它处理起来非常困难(而且速度很慢)。

我在这里碰壁了。

Scintilla.NET 基于正则表达式的语法突出显示

这样做的关键是将词法分析器设置为 SCLEX_CONTAINER,然后处理SCN_STYLENEEDED通知。这意味着您只需要处理实际需要样式的文本。

在 Scintilla 文档的顶部链接了几个指南,详细介绍了实现海关词法分析器的各个方面,所以我不会在这里重复任何内容。

至于性能:我编写了自定义的 scintilla 词法分析器是 python,它在样式化时解码为 utf-8,并且从未注意到任何重大问题,所以如果你至少不能使用 C# 匹配它,我会感到惊讶。