长时间潜伏,第一次张贴。
我正在尝试为TeraTerm(ttl)编写vscode语法,这是相当不错的学习经验,并且遇到了一些困难。我最大的问题是为ttl的if / then / endif写一个正则表达式。通常,我很乐意为自己弄清楚事情,但是每次我搞砸了,我最终都会非常努力地锁定事情。 ttl的if格式为:
if expression then
statement
elseif expression then
statement
endif
单个tif / then很容易在tmlanguage中计算出来,但是将正则表达式放在一起以嵌套if / thens会导致多个ctrl-alt-delete。我已经很擅长在单行中进行前瞻/后退,但是多行一直是您的头疼问题。这是我一直在做的事情:
"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的endif,那就换一个if。我最大的问题是,除了包含(?m)
之外,我真的不知道该如何处理正则表达式中的多行。
我不确定语法中是否还有其他问题。我想要一种方法来查看上面的脚本中是否已定义了变量,以便在尝试在错误的位置使用字符串/整数或未定义变量/整数时可以进行适当的标记。但是我不知道有什么方法可以将一个捕获组与一个正则表达式中的另一个捕获组进行比较。如果有人知道一个好的例子或文档,我会很高兴。我一直使用的主要文档是MS的vscode stuff和macromates。
任何指针/帮助/链接将不胜感激。这几乎是最后一个阻止我的正则表达式,因为其他所有事情都是单行事务。