2009-11-25 3 views
5

Мне нужно редактировать множество грамматических файлов в формате .bnf. Есть ли режим для Emacs?Есть ли режим BNF для Emacs?

Я посмотрел на семантический пакет CEDET, и, похоже, он использовал режим bnf, но не более того. Этот фрагмент кода является googlable, но знаково-BNF-режим, кажется, не существует:

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

ответ

7

БНФ режим Семантический был для своего собственного внутреннего формата синтаксического анализатора. Оригинальное название «bnf» было каламбуром, которое в конечном итоге запутывало людей.

Существующие семантические режимы, такие как wisent-grammar-mode и bovine-grammar-mode, предназначены для грамматик, используемых CEDET, а исходный bnf-режим был схожим и не представлял собой настоящую грамматику стиля BNF.

Возможно, вас больше интересует ebnf2ps, который переводит ebnf grammars (yacc и т. Д.) В синтаксические диаграммы, хотя я не использовал его сам.

+1

Thanks Eric для устранения этого. Я решил попробовать реализовать действительно простой режим, просто для подсветки синтаксиса. Я помещал это в мои .emacs и, похоже, работал. (определить-родовой-режим 'BNF-режим ' ("#") ноль "(("^ <.*?>". Шрифт блокировки переменного имя-лица) \t ("<.*?>". Шрифт -lock-keyword-face) (":: =". 'font-lock-warning-face) ("\ |".' font-lock-warning-face) ) '("\\ .bnf \\. pybnf \\ '") nil « Основной режим подсветки BNF ».) – jmmcd

3

Чтобы быть более читаемым и найти в качестве ответа, jmmcd ответил на свой вопрос следующим. Вы можете найти больше в emacs Help> elisp> 23.2.6 Generic Modes.


«Я положил это в моем .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.") 
8

Thanks 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.") 
Смежные вопросы