我正在创建一个简单的后缀编程语言。语法如下:
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'
(参见整个文件here)
这'工作',但这意味着当我在文件的末尾开始一个新的字符串时,它会被突出显示,好像它是一个函数定义。这是因为'开始' #definition
规则的一部分匹配。但我想要发生的事情是,只有在比赛结束时才对其进行着色。
有没有办法使用tmLanguage格式?
答案 0 :(得分:1)
主要问题是,至少在Sublime Text(我没有测试TextMate或VSCode)中,正则表达式引擎只能使用.tmLanguage
文件一次匹配一行。因此,像这样:
(?m:("([a-zA-Z_][\w]*[?!]?)")(.*)(def))
使用?m:
多行选项(.
匹配换行符)将无效,尽管它在Ruby中运行良好(正则表达式引擎基于Oniguruma)。由于语法突出显示一次只能输入一行,因此只要输入双引号字符串,beginCaptures
就会匹配。当然,一旦函数的主体和def
被写入,所有内容都会适当地突出显示。
很遗憾,我不能流利地为您提供相关的工作示例,但您可能希望在最新版本的sublime-syntax
中查看新的Sublime Text 3格式。它使用堆栈运行,因此您可以推送和弹出上下文,允许在多行上进行匹配。在“选定的示例”部分中,以Bracket Balancing为例 - 它突出显示右括号)
而没有匹配的开头paren (
。