长期潜伏者,第一次海报。
我正在尝试为 TeraTerm (ttl) 编写一个 vscode 语法,其中有相当多的学习经验,并且已经碰到了几堵墙。我遇到的最大问题是为 ttl 的 if/then/endif 编写正则表达式。通常我很享受为自己解决问题的满足感,但每次我把事情搞砸时,我最终都会把事情锁起来。if then 的 ttl 格式为:
if expression then
statement
elseif expression then
statement
endif
单个 if/then 很容易在 tmlanguage 中解决,但是将一个正则表达式放在一起用于嵌套 if/thens 会导致多个 ctrl-alt-deletes。我已经非常擅长单行中的先行/后行,但是多行一直是皇家的痛苦。这有点像我一直在做的事情:
"if-endif":{
"patterns": [
{
"begin":"(?im)(?<ifthen>(^\\s*if\\s+(\\w+|\\s+|=)+\\s+then$))(?=(g<ifthen>).*^\\s*endif$)*.*^\\s*endif$)",
"beginCaptures":{"1":{"name":"keyword.control.ifthen.ttl"}},
"end":"(?i)(?<=(ditto above lookahead)*)(^\\s*endif$))",
"endCaptures":{"1":{"name":"keyword.control.endif.ttl"}}
"patterns":[{"include":"#if-endif"},{"include":"#alltheotherthings"}]
}
]
}
不知何故,我需要获取 if/then 及其匹配的 endif,而不是意外抓取属于的 endif,然后执行不同的 if。我最大的问题是我真的不知道如何处理正则表达式中的多行,除了包括(?m)
.
我不确定在语法中是否有其他问题。我想要一种方法来查看是否已经在上面的脚本中定义了一个变量,这样如果我试图在错误的地方使用字符串/整数,或者它没有被定义,我可以适当地标记。但是,我不知道有任何方法可以在正则表达式中将一个捕获组与另一个捕获组进行比较。如果有人知道一个很好的例子或文档,我会非常高兴。我为此使用的主要文档是 MS 的vscode stuff和macromates。
任何指针/帮助/链接将不胜感激。这几乎是阻碍我的最后一个正则表达式,因为其他一切都是单行事务。