2009-11-25 20 views
5

Tengo que editar muchos archivos de gramática en formato .bnf. ¿Hay un modo para esto en Emacs?¿Hay un modo BNF para Emacs?

He mirado el paquete semántico de CEDET, y parece que UTILIZABA un modo bnf, pero no más. Este fragmento es googlable, pero no parece-BNF modo semántica de existir:

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

Respuesta

7

El modo BnF Semántica fue por su propio formato analizador interno. El nombre original 'bnf' fue un juego de palabras que terminó confundiendo a la gente.

Los modos semánticos existentes, como wisent-grammar-mode y bovine-grammar-mode, son para las gramáticas utilizadas por CEDET, y el original bnf-mode era similar y no representaba una verdadera gramática de estilo BNF.

Probablemente esté más interesado en ebnf2ps, que traduce ebnf gramáticas (yacc, etc.) en diagramas de sintaxis, aunque yo no lo he usado.

+1

Gracias Eric por aclarar eso. Decidí intentar implementar un modo realmente simple, solo para resaltar la sintaxis. Puse esto en mis .emacs y parece funcionar. (define-modo genérico ' BnF-mode' ("#") nula '(("^ <.*?>".' Font-lock-nombre-variable-cara) \t ("<.*?>". 'Fuente -lock-keyword-face) (":: =". 'font-lock-warning-face) ("\ |".' font-lock-warning-face) ) '("\\. bnf \\. pybnf \\ '") nil " Modo principal para el resaltado BNF "). – jmmcd

3

Para ser más fácil de leer y encontrar como respuesta, jmmcd respondió su propia pregunta con lo siguiente. Puede encontrar más en la Ayuda de emacs> elisp> 23.2.6 Modos genéricos.


"Me poner esto en mi .emacs y parece que funciona."

(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

Gracias Don. Mejoré el código muy ligeramente, aquí hay una nueva versión.

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