如何使用 ”!”作为注释指示符,还不是语言语法突出显示的运算符?

时间:2019-05-23 17:03:44

标签: regex visual-studio-code vscode-extensions tmlanguage

我正在使用VScode并创建自己的语言扩展以突出语法,在这里我需要使用正则表达式来查找注释。

基本规则是!之后的所有内容均为注释,但是有特殊情况。当!位于eval()命令中时,表示不可以。

例如,我的一些代码如下:

if condition=(eval(!DB_EXIST)) ! this is a comment
(eval( !DB_UPDATED && !DB_EXIST)) !---"!" inside eval() means NOT
!this is another comment
<some commands> ! this is also a comment

第1行和第2行中的!DB_EXIST不应被解释为注释,并且!之后将是一个非空格。

空格在注释中无关紧要。

"comments": {
    "patterns" [{
        "match":"regex1",
        "name":"comment"
    }]
},
"operator": {
    "patterns" [{
        "match":"regex2",
        "name":"keyword.operator.NOT"
    }]
},

我应该使用哪种正则表达式1和2来显示不同的颜色,而不是注释?

我不擅长此扩展写作,因此,如果有更好的方法来完成这项工作,我将不胜感激。 谢谢!

更新

@ Gama11帮助了我,但我并未在代码示例中完全涵盖所有情况。 “!”之后的任何非空白也应该是注释,只要“!”不在eval()内部。

1 个答案:

答案 0 :(得分:3)

这里是一种方法:

{
    "$schema": "https://raw.githubusercontent.com/Septh/tmlanguage/master/tmLanguage.schema.json",
    "scopeName": "source.abc",
    "patterns": [
        {
            "begin": "(eval)\\(",
            "end": "\\)",
            "captures": {
                "1": {
                    "name": "entity.name.function"
                }
            },
            "patterns": [
                {
                    "include": "#parens"
                },
                {
                    "match": "!",
                    "name": "keyword"
                }
            ]
        },
        {
            "match": "!.*?$",
            "name": "comment"
        }
    ],
    "repository": {
        "parens": {
            "begin": "\\(",
            "end": "\\)",
            "patterns": [
                {
                    "include": "#parens"
                }
            ]
        }
    }
}

我们将非注释!的模式放在第一位,因为它更具体,应该优先于其他注释。另外,我使用了"keyword"范围而不是更合适的"keyword.operator.NOT",因此它实际上在屏幕截图中显示了不同的颜色。

第一个正则表达式是begin-end模式,它允许我们仅将模式应用于这两个匹配项之间的文本(在这种情况下,在eval() calll中)。讨论时,我们不妨将eval突出显示为具有entity.name.function范围的函数。

如果我们在eval()内,则允许两种模式:

  • 一种递归begin-end模式(包括它自己)来平衡括号(您可能在{{1}中有eval(foo() + !bar()))之类的东西) }不应结束foo()模式)
  • 首先是我们感兴趣的eval运算符

第二个正则表达式只匹配!,然后匹配任何内容(!),直到行尾(.*?)。

通常,我强烈建议使用regex101.com之类的工具来处理TM语法文件的正则表达式。比起在VSCode本身中进行迭代,要容易得多,因为您可以获得即时反馈。