2009-11-25 4 views
5

Devo modificare molti file di grammatica in formato .bnf. Esiste una modalità per questo in Emacs?Esiste una modalità BNF per Emacs?

Ho esaminato il pacchetto semantico di CEDET e sembra che abbia utilizzato una modalità bnf, ma non più. Questo frammento è rilevabile con Google, ma semantico-BNF-mode non sembra esistere:

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

risposta

7

La modalità BNF Semantic era per il proprio formato parser interno. Il nome originale "bnf" era un gioco di parole che finiva per confondere le persone.

Le modalità semantiche esistenti come la modalità grammatica bisessuale e la modalità grammatica bovina sono per le grammatiche utilizzate da CEDET e la modalità bnf originale era simile e non rappresentava una vera grammatica di stile BNF.

Probabilmente siete più interessati a ebnf2ps, che converte le grammatiche di ebnf (yacc, ecc.) In grafici di sintassi, sebbene non l'abbia usato io stesso.

+1

Grazie Eric per averlo chiarito. Ho deciso di provare a implementare una modalità davvero semplice, solo per l'evidenziazione della sintassi. Lo metto nel mio .emacs e sembra funzionare. (define-generic-mode nil '(("^ <.*?>".' Font-lock-nome-variabile-face) \t ("<.*?>". 'Font 'BNF-mode '("#") -lock-keyword-face) (":: =". "font-lock-warning-face) (" \ | ". 'font-lock-warning-face) ) ' (" \\. bnf \\. pybnf \\ '") nil " Modalità principale per l'evidenziazione BNF. ") – jmmcd

3

Per essere più leggibile e trovabile come risposta, jmmcd ha risposto alla sua stessa domanda con il seguente. Puoi trovare ulteriori informazioni in emacs Help> elisp> 23.2.6 Generic Modes.


"Ho messo questo nel mio .emacs e sembra funzionare."

(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

Grazie Don. Ho migliorato leggermente il codice, ecco una nuova versione.

(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.")