使用特殊字符时的语法高亮

Syntax Highlighting when using special characters

我目前正在 Rascal 中完成基于 LaTeX 代码的数学 DSL。这意味着我有很多特殊字符({,},),例如在下面显示的语法中,总和不会突出显示,除非我从语法中删除 \ 和 _{。

syntax Expression = left sum: '\sum_{' Assignment a '}^{' Expression until '}' Expression e 

我注意到包含 \ 或 { 和 } 的关键字没有突出显示。有没有办法克服这个问题?

编辑:我不小心在这个例子中使用了数据而不是语法

至少有两种解决方案,一种是基于改变语法,一种是基于post-解析树遍历。选择你的毒药:-)

该行为的原因是默认的突出显示规则,该规则通过将任何文字与正则表达式 [A-Za-z][A-Za-z0-9\-]* 匹配来试探性地检测要突出显示的 "keyword" 是什么。除了这些启发式默认值,突出显示可通过语法中的@category 标记完全编程 解析树中的@category 注释。

如果你像这样改变语法,你可以通过标签影响突出显示:

data Expression = left sum: SumKw Assignment a '}^{' Expression until '}' Expression e
data SymKw = @category="MetaKeyword" '\sum_{';

或者,另一种基于语法的解决方案是将定义拆分(这不是保留语法重构的语言,因为它增加了空格的可能性):

data Expression = left sum: "\" 'sum' "_{" Assignment a '}^{' Expression until '}' Expression e

(后面的方案会再次触发关键词的启发)

如果您不喜欢修改语法来适应突出显示,另一种方法是通过树遍历添加注释,如下所示:

visit(yourTree) {
  case t:appl(prod(cilit("\sum_{"),_,_),_) => t[@category="MetaKeyword"]
}

代码有些复杂,因为您必须匹配并替换一棵树,这在考虑您自己的语言时通常会被忽略。这是为每个(不区分大小写的)文字生成的语法规则的概念,它适用于它所包含的各个字符。请参阅标准库中的 ParseTree.rsc,了解解析树在幕后的详细和正式定义。

为了使后一种解决方案生效,当您使用 util::IDE 中的 registerLanguage 函数实例化 IDE 时,请确保使用某些函数包装对解析器的调用执行这次访问。