语法使用特殊字符时突出显示

时间:2015-08-25 17:40:12

标签: rascal

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

行为的原因是默认的突出显示规则,它启发式地检测出"关键字"要突出显示的是通过将任何文字与正则表达式[A-Za-z][A-Za-z0-9\-]*进行匹配。在这些启发式默认值旁边,突出显示可通过解析树中语法 @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,以获取有关解析树在引擎盖下的详细内容的详细定义。

要使后一个解决方案生效,当您使用registerLanguage中的util::IDE函数实例化IDE时,请确保使用执行此访问的某个函数将调用包装到解析器中。