2009-11-25 30 views
5

Tôi phải chỉnh sửa rất nhiều tệp ngữ pháp ở định dạng .bnf. Có một chế độ cho điều này trong Emacs?Có chế độ BNF cho Emacs không?

Tôi đã xem gói ngữ nghĩa của CEDET, và có vẻ như nó đã sử dụng để có chế độ bnf, nhưng không còn nữa. Đoạn mã này có thể googlable nhưng chế độ ngữ nghĩa-bnf dường như không tồn tại:

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

Trả lời

7

Chế độ bnf ngữ nghĩa là định dạng phân tích cú pháp nội bộ của riêng nó. Tên 'bnf' ban đầu là một trò chơi chữ khiến mọi người bối rối.

Các chế độ ngữ nghĩa hiện có như chế độ ngữ pháp và chế độ ngữ pháp-bò là các ngữ pháp được CEDET sử dụng, và chế độ bnf gốc tương tự và không đại diện cho ngữ pháp kiểu BNF thực.

Bạn có thể quan tâm nhiều hơn đến ebnf2ps, dịch các ngữ pháp ebnf (yacc, v.v.) thành các biểu đồ cú pháp, mặc dù bản thân tôi chưa sử dụng nó.

+1

Cảm ơn bạn đã xóa thông tin đó. Tôi quyết định thử triển khai một chế độ thực sự đơn giản, chỉ để làm nổi bật cú pháp. Tôi đặt cái này vào trong .emacs của tôi và nó có vẻ hoạt động. (định nghĩa-generic-mode 'BNF-mode ' ("#") nil '(("^ <.*?>".' Font-lock-biến-tên-face) \t ("<.*?>". 'Phông chữ -lock-keyword-face) (":: =". 'font-lock-warning-face) ("\ |".' font-lock-warning-face) ) '("\\. bnf \\. pybnf \\ '") nil " Chế độ chính để đánh dấu BNF. ") – jmmcd

3

Để dễ đọc hơn và có thể tìm thấy dưới dạng câu trả lời, jmmcd đã trả lời câu hỏi của riêng mình bằng câu hỏi sau. Bạn có thể tìm thêm trong các emacs Help> elisp> 23.2.6 Generic Modes.


"Tôi đặt nó vào .emac và dường như hoạt động".

(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

Cảm ơn Don. Tôi đã cải thiện mã rất ít, đây là một phiên bản mới.

(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.") 
Các vấn đề liên quan