【问题标题】:tmLanguage syntax highlighting with begin-end rules without highlighting a begin that doesn't have an endtmLanguage 使用开始-结束规则突出显示语法而不突出显示没有结束的开始
【发布时间】:2016-08-25 13:13:32
【问题描述】:

我正在创建一种简单的后缀编程语言。语法如下: 2 3 add 将两个整数 23 加在一起。 "hello, world!" puts 将字符串 "hello, world!" 放入 STDOUT。

可以使用的新功能的定义如下:

"fourth_pow"
  "This function raises the argument on the top of the stack to the fourth power."
  [
    dup dup dup mul mul mul
  ]
def

空格和换行符在语言语法中并不重要。这意味着上面的定义也可以写成"fourth_pow" "..." [ dup dup dup mul mul mul] def(当然,这不太可读)。

我现在想突出显示这种语言的语法,这样在上面的定义语句中,新定义的函数名和def 关键字就会突出显示。

来自.tmLanguage 文件(YAML 格式)的 sn-p 是:

definition:
    name: "entity.other.function.jux-beta_syntax"
    begin: ("([a-zA-Z_][\w]*[?!]?)")
    end: (def)
    beginCaptures:
      '1': {name: "entity.name.function.jux-beta_syntax"}
    contentName: "support.constant.jux-beta_syntax"
    patterns:
    - include: '#comment'
    - include: '#quotation_start'
    - include: '#quotation_end'
    - include: '#string'
    - include: '#identifier'
    - include: '#integer'

(查看整个文件here

这“有效”,但这意味着当我在文件末尾开始一个新字符串时,它会被突出显示,就好像它是一个函数定义一样。这是因为 #definition 规则的“开始”部分匹配。但我想要发生的事情是,只有在比赛可以结束时才给它上色。

有没有办法使用 tmLanguage 格式做到这一点?

【问题讨论】:

    标签: syntax-highlighting tmlanguage


    【解决方案1】:

    主要问题是,至少在 Sublime Text 中(我没有测试过 TextMate 或 VSCode),正则表达式引擎一次只能匹配一行使用 .tmLanguage 文件。因此,像这样:

    (?m:("([a-zA-Z_][\w]*[?!]?)")(.*)(def))
    

    使用?m: 多行选项(. 匹配换行符)将不起作用,尽管它在 Ruby 中工作得很好(正则表达式引擎基于 Oniguruma)。因为语法高亮一次只显示一行,所以只要输入双引号字符串,您的 beginCaptures 就会匹配。当然,一旦函数体和def 编写完成,所有内容都会适当地突出显示。

    不幸的是,我不够熟练,无法为您提供相关的工作示例,但您可能想查看Sublime Text 3 最新版本中的新sublime-syntax 格式。它使用堆栈运行,因此您可以推送和弹出上下文,允许在多行上进行匹配。在 Selected Examples 部分,以括号平衡为例 - 它突出显示右括号 ) 而没有匹配的左括号 (

    祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-26
      • 1970-01-01
      相关资源
      最近更新 更多