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

Posted

技术标签:

【中文标题】汇编代码的自定义缩进功能【英文标题】:Custom indent function for assembly code 【发布时间】:2018-03-28 14:46:17 【问题描述】:

我想为我的汇编语言为 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】:

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

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

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

【讨论】:

以上是关于汇编代码的自定义缩进功能的主要内容,如果未能解决你的问题,请参考以下文章

缩进不适用于自定义 UITableViewCell

编辑 TableView 时自定义 TableCell 中没有缩进

16位汇编 多文件 intel汇编 编译器masm5.0 调用子程序库即静态库的自定义函数 WINDOWS

php 具有高级自定义字段块功能的自定义Gutenberg块的源代码

使用 IIS ApplicationInitialization remapManagedRequestsTo 功能时返回用于提供静态 html 的自定义响应代码?

Mongoose:简单的自定义验证功能不起作用