Textmate Regex语法定义.b后缀

时间:2014-02-10 18:12:09

标签: regex assembly sublimetext2 textmate

Regex不在我的驾驶室,但我仍在尝试将PIC 18 Assembly(https://github.com/amorrow/pic-assembly-textmate-bundle)的现有语法定义更新为较新的PIC 24/33指令集。

我基本上只是扩展关键字列表。问题是许多(但不是全部)指令具有字节变体,例如mov指令具有mov.b变体。突出显示适用于指令的mov部分,但忽略突出显示.b。将movmov.b添加到关键字列表不起作用,也没有添加mov\.b

这是它的样子(为便于阅读而缩写的指令列表):

    <dict>
        <key>match</key>
        <string>\b(add|addc|mov)\b</string>
        <key>name</key>
        <string>keyword.mnemonic</string>
    </dict>

正则表达式对我来说仍然非常陌生,我不确定如何让它知道mov.b是一整条指令。

3 个答案:

答案 0 :(得分:0)

\b(?:add|addc|mov)(?:\.\S+)?\b怎么样?适用于“mov.b”,“mov.b.cde”等等。

我添加了一个可选的“。”后跟一个或多个非空白字符。

答案 1 :(得分:0)

在列表中的基本指令之前添加前缀指令解决了问题。

例如:

<dict>
    <key>match</key>
    <string>\b(add\.b|add|addc\.b|addc|mov\.b|mov)\b</string>
    <key>name</key>
    <string>keyword.mnemonic</string>
</dict>

答案 2 :(得分:0)

正如我在评论中建议的那样,您可以使用非捕获组(?:...)和量词?来减少正则表达式引擎的工作:

<dict>
    <key>match</key>
    <string>\b(add(?:\.b)?|addc(?:\.b)?|mov(?:\.b)?)\b</string>
    <key>name</key>
    <string>keyword.mnemonic</string>
</dict>

或更多因子分解:(我添加了noprlf助记符来显示括号的水平深度)

<dict>
    <key>match</key>
    <string>\b(nop|(?:addc?|mov)(?:\.b)?|rlf)\b</string>
    <key>name</key>
    <string>keyword.mnemonic</string>
</dict>