regex 如何修复我的自定义Sublime Text语法突出显示?

zynd9foi  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(87)

我试图创建一个非常基本的.sublime-syntax文件,以了解基于YAML的定义是如何工作的,并最终创建一个完整的定义(该语言是UnrealScript的旧版本-已经存在这种语言的定义,但我这样做更多的是作为学习练习)。
我试图解决的第一件事是变量的声明,它可以以几种不同的形式存在:

var int myInt;
var int myIntA, myIntB, myIntC;
var() int myInt;
var(foo) int myInt;

字符串
我的语法文件目前看起来像:

%YAML 1.2
---
name: UnrealScript

file_extensions:
  - uc

scope: source.uscript

variables:
  valid_variable_name: '[a-zA-Z_][a-zA-Z_0-9]{0,}'
  valid_type_name: '{{valid_variable_name}}'

contexts:
  main:
    - match: ;
      scope: punctuation.terminator.statement.empty.uscript

    - match: '(?i)\bvar'
      scope: storage.variable.var.uscript
      push:
        - meta_scope: meta.variable.assignment
        - match: \(
          scope: punctuation.variable.property.begin.uscript
          push:
            - match: '{{valid_variable_name}}'
              scope: variable.parameter.uscript
            - match: ''
              pop: 1
        - match: \)
          scope: punctuation.variable.property.end.uscript
        - match: '{{valid_type_name}}(?=\s+)'
          scope: storage.type.uscript
          push:
            - match: '{{valid_variable_name}}'
              scope: variable.other.readwrite.uscript
              pop: 1
        - match: ;
          pop: 1


这似乎正确地突出了事情,但让我们假设我开始输入这个,还没有添加分号:

var int myInt, somethingElse
               ^^^^^^^^^^^^^


变量名somethingElse被分配了storage.type.uscript作用域,但我希望它被分配了variable.other.readwrite.uscript-我错过了什么?
旁注:我知道命名的上下文,但在这个例子中我使用匿名上下文。

igsr9ssn

igsr9ssn1#

somethingElse的作用域为storage.type.uscript的原因是因为它仍然在Meta作用域meta.variable.assignment的上下文中。(如果上下文命名为btw.
这里的简单解决方案是正确地在逗号后面定义变量的作用域--因此,在指定作用域variable.other.readwrite.uscript之后,而不是弹出,例如,只弹出分号。

%YAML 1.2
---
name: UnrealScript

file_extensions:
  - uc

scope: source.uscript

variables:
  valid_variable_name: '[a-zA-Z_][a-zA-Z_0-9]{0,}'
  valid_type_name: '{{valid_variable_name}}'

contexts:
  main:
    - match: ;
      scope: punctuation.terminator.statement.empty.uscript

    - match: '(?i)\bvar'
      scope: storage.variable.var.uscript
      push:
        - meta_scope: meta.variable.assignment
        - match: \(
          scope: punctuation.variable.property.begin.uscript
          push:
            - match: '{{valid_variable_name}}'
              scope: variable.parameter.uscript
            - match: ''
              pop: 1
        - match: \)
          scope: punctuation.variable.property.end.uscript
        - match: '{{valid_type_name}}(?=\s+)'
          scope: storage.type.uscript
          push:
            - match: '{{valid_variable_name}}'
              scope: variable.other.readwrite.uscript
            - match: ','
              scope: punctuation.separator.sequence.uscript
            - match: (?=;)
              pop: 1
        - match: ;
          scope: punctuation.terminator.uscript
          pop: 1

字符串

相关问题