我试图创建一个非常基本的.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
-我错过了什么?
旁注:我知道命名的上下文,但在这个例子中我使用匿名上下文。
1条答案
按热度按时间igsr9ssn1#
somethingElse
的作用域为storage.type.uscript
的原因是因为它仍然在Meta作用域meta.variable.assignment
的上下文中。(如果上下文命名为btw.这里的简单解决方案是正确地在逗号后面定义变量的作用域--因此,在指定作用域
variable.other.readwrite.uscript
之后,而不是弹出,例如,只弹出分号。字符串