【问题标题】:.tmlanguage escape sequences and rule priorities.tmlanguage 转义序列和规则优先级
【发布时间】:2014-10-18 05:22:46
【问题描述】:

我正在通过解析 .tmlanguage 文件并将样式应用于 NSMutableAttributtedString 来实现 Apple Swift 语言中的语法高亮显示。

我正在使用 javascript 代码、javascript.tmlanguage 文件和 monokai.tmtheme 主题(最后都包含在 sublime text 3 中)进行测试,以检查语法是否正确突出显示。通过以相同的顺序应用.tmlanguage 文件中的每个规则(模式),语法几乎完美地突出显示。

我现在遇到的问题是,当引号 (") 前面有反斜杠 (\") 时,我不知道如何知道它应该被转义。我是否遗漏了 .tmlanguage 文件中指定的内容?另一个问题是我不知道如何知道在其他规则中应该忽略其他规则,例如:

当在字符串中时,我将双斜杠视为 cmets:"http://stackoverflow.com/" 网址在 //

之后被识别为注释

在 cmets 中也将双引号或单引号作为字符串:// press "Enter" to continue,当应与 cmets 相同颜色时,单词“Enter”将突出显示为字符串

所以,我不知道公约中的某些规则是否比其他规则具有某种优先级,或者文件中是否有我没有注意到的内容。

请帮忙!

更新:

这是我所说的转义引号的一个更好的例子:

我得到了这个:,而所有字母都应该是黄色的,除了转义序列 (/") 应该是蓝色的。

问题是。我怎么知道 /" 应该被转义?那段代码的规则是:

【问题讨论】:

  • 转义字符不应该是\而不是/吗?这可以解释为什么你的颜色是关闭的......
  • 查看this screenshotthis one 之间的区别。第一个显示正斜杠和反斜杠试图转义字符串中间的双引号,使用内置的 JavaScript 语法突出显示。第二个显示相同的文本,但用JavaScriptNext 突出显示,IMO 是一种更好的语法。常规 JS 根本不显示转义字符,而 JSN 则显示。有趣...
  • 该文件是从 sublime text 3 中提取的,它可以在 sublime 中运行,所以它应该可以在我的应用程序上运行。顺便说一句,我忘了提到当应用程序尝试匹配规则 \\(x\h{2}|[0-2][0-7]{,2}|3[0-6][0-7]|37[0-7]?|[4-7][0-7]?|.) 时,我收到此错误:"Error Domain=NSCocoaErrorDomain Code=2048 \"The operation couldn’t be completed. (Cocoa error 2048.)\" UserInfo=0x7fc862ea7220 {NSInvalidValue=\\\\(x\\h{2}|[0-2][0-7]{,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)}",正如我在这个问题中所述:stackoverflow.com/questions/25439948/…
  • 那么对于引号之间的所有内容,我是否应该忽略“模式”字段中正则表达式匹配的任何内容?我应该使用什么正则表达式,"\\(x\h{2}|[0-2][0-7]{,2}|3[0-6][0-7]|37[0-7]?|[4-7][0-7]?|.)"?好像不行……

标签: swift sublimetext2 syntax-highlighting textmate textkit


【解决方案1】:

也许我回答这个问题已经晚了。您可以应用以下方法。

  1. (丑陋) 在你的end 正则表达式中,使用([^/])(") 和你的endCaptures,它会是

    1 = string.quote.double.js
    2 = punctuation.definition.string.end.js

  2. 如果字符串必须是单行,可以使用match=(")(.*)(")captures=

    1 = punctuation.definition.string.begin.js
    2 = string.quote.double.js
    3 = punctuation.definition.string.end.js
    并使用您的patterns

  3. 你可以试试applyEndPatternLast看看是否允许。设置applyEndPatternLast=1 即可。

【讨论】:

    【解决方案2】:

    优先级是文件中较早的规则优先于后面的规则。例如,在我的Python Improved 语言定义中,我有一个范围,其中包含一系列在流行的 Python Web 框架 Django 中使用的全大写常量。我还有一个通用的constant.other.allcaps.python 范围,可以识别(几乎)所有大写的任何内容。由于 Django 常量规则在 .tmLanguage 文件中的 allcaps 规则之前,我可以使用一种颜色为它着色,而后来出现的“突出显示所有大写的所有内容”只获取不属于的标识符第一个列表。

    因此,您应该尽可能早地将“cmets”范围放在文件中,然后以符合我上面描述的规则的方式编写解析器。但是,它比这稍微复杂一些,因为我相信 repository 中的项目的优先级是基于它们的 include 行所在的位置,而不是文件中定义存储库规则的位置。不过,您可能需要进行一些测试来验证这一点。

    很遗憾,我不确定您对转义引号的含义 - 您能否对此进行扩展,并添加一两个示例?

    希望这会有所帮助。

    【讨论】:

    • 感谢您的回答@MattDMo,非常有帮助。我更新了我的问题,以便您更好地理解我对转义引号的含义
    • 回复:“存储库中的项目的优先级基于它们的包含行所在的位置,而不是文件中定义存储库规则的位置”是的,这是正确的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多