匹配TextMate/崇高文本/Atom语言语法中的嵌套结构

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (20)

在为Github编写语法时,语法高亮显示用Racket语言编写的程序,我偶然发现了一个问题。

在Racket中#|启动多行注释并|#结束它。

问题是多行注释可以嵌套:

  #| a comment  #| still a comment |# even 
                                      more comment |#

这是我的非工作尝试:

repository:
  multilinecomment: 
    begin:         \#\|
    end:           \|\#
    name:          comment
    contentName:   comment
    patterns:
    - include:     "#multilinecomment"
      name:        comment
    - match:       ([^\|]|\|(?=[^#]))*
      name:        comment

匹配模式的目的是:

  1. "#multilinecomment" 多行注释可以包含另一个多行注释。
  2. ([^\|]|\|(?=[^#]))* 子表达式的含义: [^\|] any characters not an `|` \|(?=[^#]) an `|` followed by a non-`#`

因此整个表达式匹配不包含的字符串|#

更新:

在TextMate邮件列表中找到了Allan Odgaard的回答:

http://textmate.1073791.n5.nabble.com/TextMate-grammars-and-nested-multiline-comments-td28743.html

提问于
用户回答回答于

所以我在Sublime中测试了一堆具有多行注释(C / C ++,Java,HTML,PHP,JavaScript)的语言,并且没有一种语言语法支持多行注释中嵌入的多行注释 - comment范围的语法高亮结束使用第一个“注释关闭”标记,而不是对称标记。现在,这并不是说这是不可能的,因为该BracketHighlighter插件非常适合匹配对称标签,括号和其他标记。然而,它是用Python编写的,并且使用自定义逻辑用于其匹配算法,这可能不是Oniguruma引擎中可用的,它可以为Sublime的语法高亮显示器提供动力,显然也是Github的

基本上,根据您对问题的描述,您需要一个代码解析器来确保嵌套注释是合法的,而您只能使用语法突出显示定义。如果您只是为Sublime编写这个,那么自定义插件可以解决这个问题,但我不太了解Github的Linguist语法高亮系统,如果您被允许这样做的话。我还不是一个正则表达式大师,但在我看来,纯粹通过正则表达式实现这一点是相当困难的,因为你需要以某种方式跟踪任意数量的内部对称“开放”和“关闭”找到(并识别!)最后一个之前的标记。

对不起,我不能提供明确的答案,除了我不确定这是否可行,但这是我能想到的最好的东西,而不了解更多关于Sublime和Github的内部结构,(至少在Sublime的情况下)不会除非它是开源的,否则就会发生。祝好运!

用户回答回答于

match拿出最后一个。你不需要它。它对于textmate会自然地做什么是多余的,即将所有附加文本匹配到comment范围,直到结束标记出现,或者整个模式依赖于自身。

扫码关注云+社区

领取腾讯云代金券