汇编代码的自定义缩进功能

时间:2018-03-28 14:46:17

标签: assembly emacs indentation

我想为我的汇编语言为Emacs编写一个自定义缩进。我写了一篇几乎有用的文章。

在我的语言中,有一些以点''开头的指令。 (例如.data .text),以':'结尾的标签(例如msg:x:buffer :)和指令(mov eax,$ 24)。我希望指令和标签向左缩进,指令用四个空格缩进。以下是elisp中的函数:

(defun myasm-indent-line ()
"Indent current line as myasm code"
(interactive)
(beginning-of-line)
(save-excursion
  (beginning-of-line)
  (cond ((bobp) (indent-line-to 0))
    ((looking-at "[ \t]*\\.[:alnum:]*") (indent-line-to 0))
    ((looking-at "[ \t]*[:alnum:]*:") (indent-line-to 0))
    (t (indent-line-to 4)))))

我使用以下代码测试了 scratch 缓冲区中的正则表达式:

(defun foo (s)
  (cond ((string-match-p "[ \t]*\\.[:alnum:]*" s) (message "directive"))
  ((string-match-p "[ \t]*[:alnum:]*:" s) (message "label"))
  (t (message "instruction"))))
(foo ".data")        ; prints "directive"
(foo "mov eax, 13")  ; prints "instruction"
(foo "msg:")         ; prints "label"

缩进对于指令和指令是正确的,但对于由四个空格缩进的标签不正确。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

你对字符类的语法感到困惑。 [:alnum:]表示一组字符,但它是在字符范围内使用的语法,而不是正则表达式中使用的语法。 你需要一组额外的括号:

((looking-at "[ \t]*\\.[[:alnum:]]*") (indent-line-to 0))
((looking-at "[ \t]*[[:alnum:]]*:") (indent-line-to 0))

这样您就可以拥有[_[:upper:][:digit:]][^[:alnum:]]等正则表达式。