首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >匹配TextMate / Sublime Text / Atom语言语法中的嵌套构造

匹配TextMate / Sublime Text / Atom语言语法中的嵌套构造
EN

Stack Overflow用户
提问于 2014-12-13 23:03:31
回答 4查看 1.4K关注 0票数 2

在为Github编写语法以突出用球拍语言编写的程序时,我偶然发现了一个问题。

在球拍中,#|开始一个多行注释,|#结束它。

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

代码语言:javascript
复制
  #| a comment  #| still a comment |# even 
                                      more comment |#

这是我的非工作尝试:

代码语言:javascript
复制
repository:
  multilinecomment: 
    begin:         \#\|
    end:           \|\#
    name:          comment
    contentName:   comment
    patterns:
    - include:     "#multilinecomment"
      name:        comment
    - match:       ([^\|]|\|(?=[^#]))*
      name:        comment

匹配模式的目的是:

  1. "#multilinecomment"多行注释可以包含另一个具有子表达式含义的多行comment.
  2. ([^\|]|\|(?=[^#]))*

^|不是non-#的任何字符|(?=^#)后跟||

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

更新:

从TextMate邮件列表上的Allan Odgaard那里得到了答案:

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-12-14 12:30:41

因此,我在Sublime中测试了一系列具有多行注释的语言(C/C++、Java、HTML、JavaScript),但没有一种语言语法支持在多行注释中嵌入多行注释- comment作用域的语法突出显示以第一个“注释关闭”标记结束,而不是对称标记。现在,这并不是说这是不可能的,因为BracketHighlighter插件可以很好地匹配对称标记、括号和其他标记。然而,它是用Python语言编写的,并在匹配算法中使用了自定义逻辑,这在为Sublime的语法高亮工具提供动力的Oniguruma引擎中可能是不可用的,显然也是Github's引擎所不具备的。

基本上,根据您对问题的描述,您需要一个代码解析器来确保嵌套注释是合法的,这是您不能仅使用语法突出显示定义所做的事情。如果你只是为Sublime写这篇文章,一个定制的插件就可以解决这个问题,但是我对Github的语言语法突出显示系统了解不够,不知道你是否被允许这样做。我还不是regex高手,但在我看来,纯粹通过regex很难做到这一点,因为在查找(和识别)之前,您需要以某种方式跟踪任意数量的内部对称"open“和"close”标记。最后一个。

很抱歉,除了我不确定这是否可能之外,我不能提供一个明确的答案,但在不了解Sublime和Github的内部结构的情况下,这是我能想到的最好的答案,除非Sublime是开源的,否则这是不会发生的事情(至少在Sublime的情况下)。祝好运!

票数 2
EN

Stack Overflow用户

发布于 2015-05-23 13:50:44

旧帖子,我没有评论的名声,但绝对不可能使用纯粹的正则表达式来检测任意嵌套的评论。直观地说,这是因为所有正则表达式都可以转换为有限的状态机,并且跟踪嵌套深度需要(理论上)无限数量的状态(状态的数量至少需要等于不同的可能嵌套深度,这里是无限的)。

在实践中,这个数字增长非常慢,所以如果你不想太麻烦,你可以写一些东西,允许嵌套到合理的深度。否则,您可能需要一个单独的阶段来解析并找到注释,以告诉语法高亮工具忽略它们。

票数 2
EN

Stack Overflow用户

发布于 2015-03-08 03:58:11

您的想法是正确的,但是看起来您的第二个模式也匹配"begin nested comment“序列#|,它永远不会给您的递归#multilinecomment模式提供发挥作用的机会。

您所要做的就是将第二个模式替换为类似于

代码语言:javascript
复制
(#(?=[^|])|\|(?=[^#])|[^|#])+
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27460207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档