;;; semantic/grammar.el --- Major mode framework for Semantic grammars
-;; Copyright (C) 2002-2005, 2007-2012 Free Software Foundation, Inc.
+;; Copyright (C) 2002-2005, 2007-2015 Free Software Foundation, Inc.
;; Author: David Ponce <david@dponce.com>
;; Maintainer: David Ponce <david@dponce.com>
(require 'semantic/wisent)
(require 'semantic/ctxt)
(require 'semantic/format)
+;; FIXME this is a generated file, but we need to load this file to
+;; generate it!
(require 'semantic/grammar-wy)
(require 'semantic/idle)
+(require 'help-fns)
(declare-function semantic-momentary-highlight-tag "semantic/decorate")
(declare-function semantic-analyze-context "semantic/analyze")
(require 'semantic/find)
(require 'semantic/db))
+(declare-function semantic-grammar-wy--install-parser "semantic/grammar-wy")
+
\f
;;;;
;;;; Set up lexer
\(provide '" libr ")
+;; Local Variables:
+;; version-control: never
+;; no-update-autoloads: t
+;; End:
+
;;; " file " ends here
")
"Generated footer template.
(noninteractive)
noninteractive))
-(defun semantic-grammar-create-package (&optional force)
+(defun semantic-grammar-create-package (&optional force uptodate)
"Create package Lisp code from grammar in current buffer.
-Does nothing if the Lisp code seems up to date.
+If the Lisp code seems up to date, do nothing (if UPTODATE
+is non-nil, return nil in such cases).
If optional argument FORCE is non-nil, unconditionally re-generate the
Lisp code."
(interactive "P")
+ (unless (semantic-active-p)
+ (error "You have to activate semantic-mode to create a package."))
(setq force (or force current-prefix-arg))
(semantic-fetch-tags)
(let* (
(file-newer-than-file-p
(buffer-file-name semantic--grammar-output-buffer)
(buffer-file-name semantic--grammar-input-buffer)))
- (message "Package `%s' is up to date." semantic--grammar-package)
+ (progn
+ (message "Package `%s' is up to date." semantic--grammar-package)
+ ;; It would be better if this were always the case, IMO,
+ ;; but the (unspecified) return value of this function is
+ ;; assumed to be non-nil in some places, it seems.
+ (if uptodate (setq output nil)))
;; Create the package
(set-buffer semantic--grammar-output-buffer)
;; Use Unix EOLs, so that the file is portable to all platforms.
(setq buffer-file-coding-system 'raw-text-unix)
(erase-buffer)
- (unless (eq major-mode 'emacs-lisp-mode)
+ (unless (derived-mode-p 'emacs-lisp-mode)
(emacs-lisp-mode))
;;;; Header + Prologue
;;;; Define major mode
;;;;
-(defvar semantic-grammar-syntax-table
+(define-obsolete-variable-alias 'semantic-grammar-syntax-table
+ 'semantic-grammar-mode-syntax-table "24.1")
+(defvar semantic-grammar-mode-syntax-table
(let ((table (make-syntax-table (standard-syntax-table))))
(modify-syntax-entry ?\: "." table) ;; COLON
(modify-syntax-entry ?\> "." table) ;; GT
(defvar semantic-grammar-mode-keywords-2
(append semantic-grammar-mode-keywords-1
- lisp-font-lock-keywords-1)
+ (if (boundp 'lisp-font-lock-keywords-1)
+ lisp-font-lock-keywords-1
+ lisp-el-font-lock-keywords-1))
"Font Lock keywords used to highlight Semantic grammar buffers.")
(defvar semantic-grammar-mode-keywords-3
(append semantic-grammar-mode-keywords-1
- lisp-font-lock-keywords-2)
+ (if (boundp 'lisp-font-lock-keywords-2)
+ lisp-font-lock-keywords-2
+ lisp-el-font-lock-keywords-2))
"Font Lock keywords used to highlight Semantic grammar buffers.")
(defvar semantic-grammar-mode-keywords
semantic-grammar-mode-keywords-1
"Font Lock keywords used to highlight Semantic grammar buffers.")
-(defvar semantic-grammar-map
+(define-obsolete-variable-alias 'semantic-grammar-map
+ 'semantic-grammar-mode-map "24.1")
+(defvar semantic-grammar-mode-map
(let ((km (make-sparse-keymap)))
(define-key km "|" 'semantic-grammar-electric-punctuation)
(semantic-tag-start outer)
(semantic-tag-end outer)))))
-(defun semantic-grammar-mode ()
+(define-derived-mode semantic-grammar-mode
+ fundamental-mode "Semantic Grammar Framework"
"Initialize a buffer for editing Semantic grammars.
-\\{semantic-grammar-map}"
- (interactive)
- (kill-all-local-variables)
- (setq major-mode 'semantic-grammar-mode
- mode-name "Semantic Grammar Framework")
+\\{semantic-grammar-mode-map}"
(set (make-local-variable 'parse-sexp-ignore-comments) t)
(set (make-local-variable 'comment-start) ";;")
;; Look within the line for a ; following an even number of backslashes
;; after either a non-backslash or the line beginning.
(set (make-local-variable 'comment-start-skip)
"\\(\\(^\\|[^\\\\\n]\\)\\(\\\\\\\\\\)*\\);+ *")
- (set-syntax-table semantic-grammar-syntax-table)
- (use-local-map semantic-grammar-map)
(set (make-local-variable 'indent-line-function)
'semantic-grammar-indent)
(set (make-local-variable 'fill-paragraph-function)
(add-hook 'before-change-functions
'semantic--grammar-clear-macros-regexp-2 nil t)
;; Handle safe re-parse of grammar rules.
- (semantic-make-local-hook 'semantic-edits-new-change-hooks)
- (add-hook 'semantic-edits-new-change-hooks
+ (semantic-make-local-hook 'semantic-edits-new-change-functions)
+ (add-hook 'semantic-edits-new-change-functions
'semantic-grammar-edits-new-change-hook-fcn
- nil t)
- (semantic-run-mode-hooks 'semantic-grammar-mode-hook))
+ nil t))
\f
;;;;
;;;; Useful commands
;;;;
(defvar semantic-grammar-skip-quoted-syntax-table
- (let ((st (copy-syntax-table semantic-grammar-syntax-table)))
+ (let ((st (copy-syntax-table semantic-grammar-mode-syntax-table)))
(modify-syntax-entry ?\' "$" st)
st)
"Syntax table to skip a whole quoted expression in grammar code.
(interactive)
(if (semantic-grammar-in-lisp-p)
;; We are in lisp code. Do lisp completion.
- (lisp-complete-symbol)
+ (let ((completion-at-point-functions
+ (append '(lisp-completion-at-point)
+ completion-at-point-functions)))
+ (completion-at-point))
;; We are not in lisp code. Do rule completion.
(let* ((nonterms (semantic-find-tags-by-class 'nonterminal (current-buffer)))
(sym (car (semantic-ctxt-current-symbol)))
)
"Association of syntax elements, and the corresponding help.")
+(declare-function eldoc-function-argstring "eldoc")
+(declare-function eldoc-docstring-format-sym-doc "eldoc")
+(declare-function eldoc-last-data-store "eldoc")
+(declare-function eldoc-get-fnsym-args-string "eldoc")
+(declare-function eldoc-get-var-docstring "eldoc")
+
(defun semantic-grammar-eldoc-get-macro-docstring (macro expander)
"Return a one-line docstring for the given grammar MACRO.
EXPANDER is the name of the function that expands MACRO."
(provide 'semantic/grammar)
+\f
+;; Local variables:
+;; generated-autoload-load-name: "semantic/grammar"
+;; End:
+
;;; semantic/grammar.el ends here