2

我正在创建一种简单的后缀编程语言。语法如下: 2 3 add将两个整数2相加3"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 格式)是:

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'

(在此处查看整个文件)

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

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

4

1 回答 1

1

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

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

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

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

祝你好运!

于 2016-08-25T23:39:30.600 回答