Есть ли режим BNF для Emacs?

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

Я посмотрел на семантический пакет CEDET, и кажется, что он ИСПОЛЬЗУЕТСЯ, чтобы иметь bnf-режим, но не больше. Этот фрагмент можно использовать в googlable, но похоже, что 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))

person jmmcd    schedule 25.11.2009    source источник


Ответы (4)


Спасибо, Дон. Я немного улучшил код, вот и новая версия.

(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.")
person jmmcd    schedule 26.11.2009
comment
Обожаю, большое спасибо! Немного подправил его, чтобы он соответствовал моим личным предпочтениям в написании EBNF, но это отличное начало; сэкономил мне часы :) - person Cherusker; 19.01.2019

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

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

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

person Eric    schedule 25.11.2009
comment
Спасибо Эрику за разъяснение. Я решил попробовать реализовать действительно простой режим, просто для подсветки синтаксиса. Я поместил это в свой .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 .) - person jmmcd; 26.11.2009

Чтобы сделать ответ более читабельным и доступным, jmmcd ответил на свой вопрос следующим образом. Дополнительную информацию можно найти в справке emacs> 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.")
person Don    schedule 26.11.2009

Я только что создал основной режим GNU Emacs для редактирования грамматик BNF.

В настоящее время предоставляет базовый синтаксис и блокировку шрифтов для файлов BNF. EBNF и ABNF в моих планах на ближайшее время.

введите здесь описание изображения

person serghei    schedule 15.03.2019