(require 'smie) (defvar foo-smie-grammar (smie-prec2->grammar (smie-bnf->prec2 '((statements (statement) (statement ";" statements)) (statement ("def" non-block-expr "do" statements "end") ("def" non-block-expr "COMMA" "dop" non-block-expr)) (non-block-expr ("STRING")))))) (define-derived-mode foo-mode prog-mode "Foo" (set (make-local-variable 'comment-start) "# ") (smie-setup foo-smie-grammar #'ignore))