Emacs 是否有 BNF 模式?

9

我需要编辑很多以.bnf格式的语法文件。Emacs有没有这方面的模式?

我查看了CEDET的semantic包,似乎它曾经有一个bnf-mode,但现在已经没有了。这段代码可以通过谷歌搜索到,但是semantic-bnf-mode似乎不存在:

(autoload 'semantic-bnf-mode "semantic-bnf" "Mode for Bovine Normal Form." t)
(add-to-list 'auto-mode-alist '("\\.bnf$" . semantic-bnf-mode))
4个回答

14

感谢Don。我稍微改进了代码,这是一个新版本。

(define-generic-mode 'bnf-mode
  () ;; comment char: inapplicable because # must be at start of line
  nil ;; keywords
  '(
    ("^#.*" . 'font-lock-comment-face) ;; comments at start of line
    ("^<.*?>" . 'font-lock-function-name-face) ;; LHS nonterminals
    ("<.*?>" . 'font-lock-builtin-face) ;; other nonterminals
    ("::=" . 'font-lock-const-face) ;; "goes-to" symbol
    ("\|" . 'font-lock-warning-face) ;; "OR" symbol
    ("\{:\\|:\}" . 'font-lock-keyword-face) ;; special pybnf delimiters
   )
  '("\\.bnf\\'" "\\.pybnf\\'") ;; filename suffixes
  nil ;; extra function hooks
  "Major mode for BNF highlighting.")

1
非常喜欢,非常感谢!我稍微修改了一下以适应我的个人偏好来编写EBNF,但这是一个绝妙的开端;让我省了好几个小时 :) - Cherusker

8
语义BNF模式是为其内部解析器格式而设计的。原始的“bnf”名称是一个双关语,最终使人们感到困惑。
现有的语义模式,例如wisent-grammar-mode和bovine-grammar-mode,用于CEDET使用的语法。原始的bnf-mode类似,不代表真正的BNF风格语法。
您可能更感兴趣的是ebnf2ps,它将ebnf语法(yacc等)转换为语法图表,但我自己没有使用过。

3
谢谢Eric澄清。我决定尝试实现一个非常简单的模式,仅用于语法高亮。我将以下内容放在我的.emacs文件里,看起来似乎可以工作。(define-generic-mode 'bnf-mode '("#") nil '(("^<.*?>" . 'font-lock-variable-name-face) ("<.*?>" . 'font-lock-keyword-face) ("::=" . 'font-lock-warning-face) ("\|" . 'font-lock-warning-face) ) '("\\.bnf\\.pybnf\\'") nil "BNF高亮的主要模式。") - jmmcd

5
为了让答案更易读且易于查找,jmmcd用以下方法回答了自己的问题。您可以在emacs帮助> elisp> 23.2.6通用模式中找到更多信息。
“我将此放入我的.emacs文件中,它似乎有效。”
(define-generic-mode 'bnf-mode 
  '("#") 
  nil 
  '(("^<.*?>" . 'font-lock-variable-name-face) 
    ("<.*?>" . 'font-lock-keyword-face) 
    ("::=" . 'font-lock-warning-face) 
    ("\|" . 'font-lock-warning-face))
  '("\\.bnf\\.pybnf\\'") 
  nil 
  "Major mode for BNF highlighting.")

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接