* cedet/ede/system.el (ede-upload-html-documentation)

(ede-upload-distribution, ede-edit-web-page)
(ede-web-browse-home): Autoload.

* cedet/ede/proj-elisp.el: Add autoload for
semantic-ede-proj-target-grammar.

* cedet/semantic.el (navigate-menu): Show menu items only if
semantic-mode is enabled.

* cedet/ede.el: Remove comments.

* cedet/cedet.el (cedet-menu-map): Minor doc fix.

* cedet/semantic/grammar.el:
* cedet/semantic/grammar-wy.el:
* cedet/semantic/ede-grammar.el: New files.

* cedet/semantic/db-mode.el (global-semanticdb-minor-mode): Define
using define-minor-mode, so that the usual mode variable exists.
This commit is contained in:
Chong Yidong 2009-09-27 21:35:46 +00:00
parent 715f35a55d
commit a2095e2edb
10 changed files with 2674 additions and 88 deletions

View file

@ -1,3 +1,26 @@
2009-09-27 Chong Yidong <cyd@stupidchicken.com>
* cedet/ede/system.el (ede-upload-html-documentation)
(ede-upload-distribution, ede-edit-web-page)
(ede-web-browse-home): Autoload.
* cedet/ede/proj-elisp.el: Add autoload for
semantic-ede-proj-target-grammar.
* cedet/semantic.el (navigate-menu): Show menu items only if
semantic-mode is enabled.
* cedet/ede.el: Remove comments.
* cedet/cedet.el (cedet-menu-map): Minor doc fix.
* cedet/semantic/grammar.el:
* cedet/semantic/grammar-wy.el:
* cedet/semantic/ede-grammar.el: New files.
* cedet/semantic/db-mode.el (global-semanticdb-minor-mode): Define
using define-minor-mode, so that the usual mode variable exists.
2009-09-27 Chong Yidong <cyd@stupidchicken.com>
* cedet/ede.el (global-ede-mode-map): Move menu to

View file

@ -65,12 +65,12 @@
(define-key map [global-semantic-idle-scheduler-mode] 'undefined)
(define-key map [semantic-menu-separator] '("--"))
(define-key map [semantic-mode]
'(menu-item "Enable parsers (Semantic)" semantic-mode
'(menu-item "Enable Parsers (Semantic)" semantic-mode
:help "Enable language parsers (Semantic)"
:visible (not (bound-and-true-p semantic-mode))))
(define-key map [cedet-menu-separator] 'undefined)
(define-key map [ede-mode]
'(menu-item "Enable Projects (EDE)" global-ede-mode
'(menu-item "Enable Project Support (EDE)" global-ede-mode
:help "Enable the Emacs Development Environment (EDE)"
:visible (not (bound-and-true-p global-ede-mode))))
(define-key map [ede-menu-separator] '("--"))

View file

@ -1981,18 +1981,6 @@ Display the results as a debug list."
;; (def-edebug-spec ede-with-projectfile
;; (form def-body))))
;; (autoload 'ede-web-browse-home "ede-system" t
;; "Web browse this project's home page.")
;; (autoload 'ede-edit-web-page "ede-system" t
;; "Edit the web site for this project.")
;; (autoload 'ede-upload-distribution "ede-system" t
;; "Upload the dist for this project to the upload site.")
;; (autoload 'ede-upload-html-documentation "ede-system" t
;; "Upload auto-generated HTML to the web site.")
(provide 'ede)
;; Include this last because it depends on ede.

View file

@ -29,6 +29,8 @@
(require 'ede/pmake)
(require 'ede/pconf)
(autoload 'semantic-ede-proj-target-grammar "semantic/ede-grammar")
;;; Code:
(defclass ede-proj-target-elisp (ede-proj-target-makefile)
((menu :initform nil)

View file

@ -31,7 +31,8 @@
;;; Code:
;;; Web/FTP site node.
;;
;;;###autoload
(defun ede-web-browse-home ()
"Browse the home page of the current project."
(interactive)
@ -44,7 +45,7 @@
(browse-url home)
))
;;;###autoload
(defun ede-edit-web-page ()
"Edit the web site for this project."
(interactive)
@ -62,7 +63,7 @@
(error "No project file found")))
(find-file endfile)))
;;;###autoload
(defun ede-upload-distribution ()
"Upload the current distribution to the correct location.
Use /user@ftp.site.com: file names for FTP sites.
@ -95,6 +96,7 @@ Download tramp, and use /r:machine: for names on remote sites w/out FTP access."
(message "Done uploading files...")
)
;;;###autoload
(defun ede-upload-html-documentation ()
"Upload the current distributions documentation as HTML.
Use /user@ftp.site.com: file names for FTP sites.

View file

@ -934,42 +934,47 @@ Throw away all the old tags, and recreate the tag database."
;; Top level menu items:
(define-key cedet-menu-map [semantic-force-refresh]
'(menu-item "Reparse Buffer" semantic-force-refresh
:help "Force a full reparse of the current buffer."))
:help "Force a full reparse of the current buffer."
:visible semantic-mode))
(define-key cedet-menu-map [semantic-edit-menu]
(cons "Edit Tags" edit-menu))
`(menu-item "Edit Tags" ,edit-menu
:visible semantic-mode))
(define-key cedet-menu-map [navigate-menu]
(cons "Navigate Tags" navigate-menu))
`(menu-item "Navigate Tags" ,navigate-menu
:visible semantic-mode))
(define-key cedet-menu-map [semantic-options-separator]
'("--"))
(define-key cedet-menu-map [global-semantic-highlight-func-mode]
(menu-bar-make-mm-toggle
global-semantic-highlight-func-mode
"Highlight Current Function"
"Highlight the tag at point"))
'(menu-item "Highlight Current Function" global-semantic-highlight-func-mode
:help "Highlight the tag at point"
:visible semantic-mode
:button (:toggle . global-semantic-highlight-func-mode)))
(define-key cedet-menu-map [global-semantic-decoration-mode]
(menu-bar-make-mm-toggle
global-semantic-decoration-mode
"Decorate Tags"
"Decorate tags based on various attributes"))
'(menu-item "Decorate Tags" global-semantic-decoration-mode
:help "Decorate tags based on tag attributes"
:visible semantic-mode
:button (:toggle . (bound-and-true-p
global-semantic-decoration-mode))))
(define-key cedet-menu-map [global-semantic-idle-completions-mode]
(menu-bar-make-mm-toggle
global-semantic-idle-completions-mode
"Show Tag Completions"
"Show tag completions when idle"))
'(menu-item "Show Tag Completions" global-semantic-idle-completions-mode
:help "Show tag completions when idle"
:visible semantic-mode
:button (:toggle . global-semantic-idle-completions-mode)))
(define-key cedet-menu-map [global-semantic-idle-summary-mode]
(menu-bar-make-mm-toggle
global-semantic-idle-summary-mode
"Show Tag Summaries"
"Show tag summaries when idle"))
'(menu-item "Show Tag Summaries" global-semantic-idle-summary-mode
:help "Show tag summaries when idle"
:visible semantic-mode
:button (:toggle . global-semantic-idle-summary-mode)))
(define-key cedet-menu-map [global-semanticdb-minor-mode]
'(menu-item "Semantic Database" global-semanticdb-minor-mode
:help "Store tag information in a database"
:button (:toggle . (semanticdb-minor-mode-p))))
:visible semantic-mode
:button (:toggle . global-semanticdb-minor-mode)))
(define-key cedet-menu-map [global-semantic-idle-scheduler-mode]
(menu-bar-make-mm-toggle
global-semantic-idle-scheduler-mode
"Reparse When Idle"
"Keep a buffer's parse tree up to date when idle"))
'(menu-item "Reparse When Idle" global-semantic-idle-scheduler-mode
:help "Keep a buffer's parse tree up to date when idle"
:visible semantic-mode
:button (:toggle . global-semantic-idle-scheduler-mode)))
(define-key cedet-menu-map [ede-menu-separator] 'undefined)
(define-key cedet-menu-map [cedet-menu-separator] 'undefined)
(define-key cedet-menu-map [semantic-menu-separator] '("--")))
@ -1064,7 +1069,6 @@ Semantic mode.
(remove-hook 'html-mode-hook 'semantic-default-html-setup)
;; FIXME: handle semanticdb-load-ebrowse-caches
(dolist (mode semantic-submode-list)
(if (and (boundp mode) (eval mode))
(funcall mode -1)))))

View file

@ -37,26 +37,6 @@
(declare-function semantic-lex-spp-set-dynamic-table "semantic/lex-spp")
(defcustom semanticdb-global-mode nil
"*If non-nil enable the use of `semanticdb-minor-mode'."
:group 'semantic
:type 'boolean
:require 'semantic/db
:initialize 'custom-initialize-default
:set (lambda (sym val)
(global-semanticdb-minor-mode (if val 1 -1))
(custom-set-default sym val)))
(defcustom semanticdb-mode-hook nil
"Hook run whenever `global-semanticdb-minor-mode' is run.
Use `semanticdb-minor-mode-p' to determine if the mode has been turned
on or off."
:group 'semanticdb
:type 'hook)
(semantic-varalias-obsolete 'semanticdb-mode-hooks
'semanticdb-mode-hook)
;;; Start/Stop database use
;;
(defvar semanticdb-hooks
@ -80,32 +60,27 @@ on or off."
(symbol-value (car (cdr (car semanticdb-hooks))))))
;;;###autoload
(defun global-semanticdb-minor-mode (&optional arg)
"Toggle the use of `semanticdb-minor-mode'.
If ARG is positive, enable, if it is negative, disable.
If ARG is nil, then toggle."
(interactive "P")
(if (not arg)
(if (semanticdb-minor-mode-p)
(setq arg -1)
(setq arg 1)))
(let ((fn 'add-hook)
(h semanticdb-hooks)
(changed nil))
(if (< arg 0)
(setq changed semanticdb-global-mode
semanticdb-global-mode nil
fn 'remove-hook)
(setq changed (not semanticdb-global-mode)
semanticdb-global-mode t))
;(message "ARG = %d" arg)
(when changed
(while h
(funcall fn (car (cdr (car h))) (car (car h)))
(setq h (cdr h)))
;; Call a hook
(run-hooks 'semanticdb-mode-hook))
))
(define-minor-mode global-semanticdb-minor-mode
"Toggle Semantic DB mode.
With ARG, turn Semantic DB mode on if ARG is positive, off otherwise.
In Semantic DB mode, Semantic parsers store results in a
database, which can be saved for future Emacs sessions."
:global t
:group 'semantic
(if global-semanticdb-minor-mode
;; Enable
(dolist (elt semanticdb-hooks)
(add-hook (cadr elt) (car elt)))
;; Disable
(dolist (elt semanticdb-hooks)
(add-hook (cadr elt) (car elt)))))
(defvaralias 'semanticdb-mode-hook 'global-semanticdb-minor-mode-hook)
(defvaralias 'semanticdb-global-mode 'global-semanticdb-minor-mode)
(semantic-varalias-obsolete 'semanticdb-mode-hooks
'global-semanticdb-minor-mode-hook)
(defun semanticdb-toggle-global-mode ()
"Toggle use of the Semantic Database feature.

View file

@ -0,0 +1,202 @@
;;; semantic/ede-grammar.el --- EDE support for Semantic Grammar Files
;;; Copyright (C) 2003, 2004, 2007, 2008, 2009 Free Software Foundation, Inc.
;; Author: Eric M. Ludlam <zappo@gnu.org>
;; Keywords: project, make
;; This file is part of GNU Emacs.
;; GNU Emacs is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;;
;; Handle .by or .wy files.
(require 'semantic)
(require 'ede/proj)
(require 'ede/pmake)
(require 'ede/pconf)
(require 'ede/proj-elisp)
(require 'semantic/grammar)
;;; Code:
(defclass semantic-ede-proj-target-grammar (ede-proj-target-makefile)
((menu :initform nil)
(keybindings :initform nil)
(phony :initform t)
(sourcetype :initform
(semantic-ede-source-grammar-wisent
semantic-ede-source-grammar-bovine
))
(availablecompilers :initform
(semantic-ede-grammar-compiler-wisent
semantic-ede-grammar-compiler-bovine
))
)
"This target consists of a group of grammar files.
A grammar target consists of grammar files that build Emacs Lisp programs for
parsing different languages.")
(defvar semantic-ede-source-grammar-wisent
(ede-sourcecode "semantic-ede-grammar-source-wisent"
:name "Wisent Grammar"
:sourcepattern "\\.wy$"
)
"Semantic Grammar source code definition for wisent.")
(defclass semantic-ede-grammar-compiler-class (ede-compiler)
nil
"Specialized compiler for semantic grammars.")
(defvar semantic-ede-grammar-compiler-wisent
(semantic-ede-grammar-compiler-class
"ede-emacs-wisent-compiler"
:name "emacs"
:variables '(("EMACS" . "emacs"))
:commands
'(
"@echo \"(add-to-list 'load-path nil)\" > grammar-make-script"
"@for loadpath in . ${LOADPATH}; do \\"
" echo \"(add-to-list 'load-path \\\"$$loadpath\\\")\" >> grammar-make-script; \\"
"done;"
"@echo \"(require 'semantic-load)\" >> grammar-make-script"
"@echo \"(require 'semantic-grammar)\" >> grammar-make-script"
;; "@echo \"(setq debug-on-error t)\" >> grammar-make-script"
"\"$(EMACS)\" -batch --no-site-file -l grammar-make-script -f semantic-grammar-batch-build-packages $^"
)
;; :autoconf '("AM_PATH_LISPDIR")
:sourcetype '(semantic-ede-source-grammar-wisent)
:objectextention "-wy.elc"
)
"Compile Emacs Lisp programs.")
(defvar semantic-ede-source-grammar-bovine
(ede-sourcecode "semantic-ede-grammar-source-bovine"
:name "Bovine Grammar"
:sourcepattern "\\.by$"
)
"Semantic Grammar source code definition for the bovinator.")
(defvar semantic-ede-grammar-compiler-bovine
(semantic-ede-grammar-compiler-class
"ede-emacs-wisent-compiler"
:name "emacs"
:variables '(("EMACS" . "emacs"))
:commands
'(
"@echo \"(add-to-list 'load-path nil)\" > grammar-make-script"
"@for loadpath in . ${LOADPATH}; do \\"
" echo \"(add-to-list 'load-path \\\"$$loadpath\\\")\" >> grammar-make-script; \\"
"done;"
"@echo \"(require 'semantic-load)\" >> grammar-make-script"
"@echo \"(require 'semantic-grammar)\" >> grammar-make-script"
;; "@echo \"(setq debug-on-error t)\" >> grammar-make-script"
"\"$(EMACS)\" -batch --no-site-file -l grammar-make-script -f semantic-grammar-batch-build-packages $^"
)
;; :autoconf '("AM_PATH_LISPDIR")
:sourcetype '(semantic-ede-source-grammar-bovine)
:objectextention "-by.elc"
)
"Compile Emacs Lisp programs.")
;;; Target options.
(defmethod ede-buffer-mine ((this semantic-ede-proj-target-grammar) buffer)
"Return t if object THIS lays claim to the file in BUFFER.
Lays claim to all -by.el, and -wy.el files."
;; We need to be a little more careful than this, but at the moment it
;; is common to have only one target of this class per directory.
(if (string-match "-[bw]y\\.elc?$" (buffer-file-name buffer))
t
(call-next-method) ; The usual thing.
))
(defmethod project-compile-target ((obj semantic-ede-proj-target-grammar))
"Compile all sources in a Lisp target OBJ."
(let* ((cb (current-buffer))
(proj (ede-target-parent obj))
(default-directory (oref proj directory)))
(mapc (lambda (src)
(save-excursion
(set-buffer (find-file-noselect src))
(save-excursion
(semantic-grammar-create-package))
(save-buffer)
(let ((cf (concat (semantic-grammar-package) ".el")))
(if (or (not (file-exists-p cf))
(file-newer-than-file-p src cf))
(byte-compile-file cf)))))
(oref obj source)))
(message "All Semantic Grammar sources are up to date in %s" (object-name obj)))
;;; Makefile generation functions
;;
(defmethod ede-proj-makefile-sourcevar ((this semantic-ede-proj-target-grammar))
"Return the variable name for THIS's sources."
(cond ((ede-proj-automake-p)
(error "No Automake support for Semantic Grammars"))
(t (concat (ede-pmake-varname this) "_SEMANTIC_GRAMMAR"))))
(defmethod ede-proj-makefile-insert-variables :AFTER ((this semantic-ede-proj-target-grammar))
"Insert variables needed by target THIS."
(ede-proj-makefile-insert-loadpath-items
(ede-proj-elisp-packages-to-loadpath
(list "eieio" "semantic" "inversion" "ede")))
;; eieio for object system needed in ede
;; semantic because it is
;; Inversion for versioning system.
;; ede for project regeneration
(ede-pmake-insert-variable-shared
(concat (ede-pmake-varname this) "_SEMANTIC_GRAMMAR_EL")
(insert
(mapconcat (lambda (src)
(save-excursion
(set-buffer (find-file-noselect src))
(concat (semantic-grammar-package) ".el")))
(oref this source)
" ")))
)
(defmethod ede-proj-makefile-insert-rules ((this semantic-ede-proj-target-grammar))
"Insert rules needed by THIS target."
;; Add in some dependencies.
;; (mapc (lambda (src)
;; (let ((nm (file-name-sans-extension src)))
;; (insert nm "-wy.el: " src "\n"
;; nm "-wy.elc: " nm "-wy.el\n\n")
;; ))
;; (oref this source))
;; Call the normal insertion of rules.
(call-next-method)
)
(defmethod ede-proj-makefile-insert-dist-dependencies ((this semantic-ede-proj-target-grammar))
"Insert dist dependencies, or intermediate targets.
This makes sure that all grammar lisp files are created before the dist
runs, so they are always up to date.
Argument THIS is the target that should insert stuff."
(call-next-method)
(insert " $(" (ede-pmake-varname this) "_SEMANTIC_GRAMMAR_EL)")
)
;; (autoload 'ede-proj-target-elisp "ede/proj-elisp"
;; "Target class for Emacs/Semantic grammar files." nil nil)
(ede-proj-register-target "semantic grammar"
semantic-ede-proj-target-grammar)
(provide 'semantic/ede-grammar)
;;; semantic/ede-grammar.el ends here

View file

@ -0,0 +1,478 @@
;;; semantic/grammar-wy.el --- Generated parser support file
;; Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
;; Author: David Ponce <david@dponce.com>
;; Keywords: syntax
;; This file is part of GNU Emacs.
;; GNU Emacs is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;;
;; This file is generated from the grammar file semantic-grammar.wy in
;; the upstream CEDET repository.
;;; Code:
(require 'semantic/lex)
(defvar semantic-grammar-lex-c-char-re)
;; Current parsed nonterminal name.
(defvar semantic-grammar-wy--nterm nil)
;; Index of rule in a nonterminal clause.
(defvar semantic-grammar-wy--rindx nil)
;;; Declarations
;;
(defconst semantic-grammar-wy--keyword-table
(semantic-lex-make-keyword-table
'(("%default-prec" . DEFAULT-PREC)
("%no-default-prec" . NO-DEFAULT-PREC)
("%keyword" . KEYWORD)
("%languagemode" . LANGUAGEMODE)
("%left" . LEFT)
("%nonassoc" . NONASSOC)
("%package" . PACKAGE)
("%prec" . PREC)
("%put" . PUT)
("%quotemode" . QUOTEMODE)
("%right" . RIGHT)
("%scopestart" . SCOPESTART)
("%start" . START)
("%token" . TOKEN)
("%type" . TYPE)
("%use-macros" . USE-MACROS))
'nil)
"Table of language keywords.")
(defconst semantic-grammar-wy--token-table
(semantic-lex-make-type-table
'(("punctuation"
(GT . ">")
(LT . "<")
(OR . "|")
(SEMI . ";")
(COLON . ":"))
("close-paren"
(RBRACE . "}")
(RPAREN . ")"))
("open-paren"
(LBRACE . "{")
(LPAREN . "("))
("block"
(BRACE_BLOCK . "(LBRACE RBRACE)")
(PAREN_BLOCK . "(LPAREN RPAREN)"))
("code"
(EPILOGUE . "%%...EOF")
(PROLOGUE . "%{...%}"))
("sexp"
(SEXP))
("qlist"
(PREFIXED_LIST))
("char"
(CHARACTER))
("symbol"
(PERCENT_PERCENT . "\\`%%\\'")
(SYMBOL))
("string"
(STRING)))
'(("punctuation" :declared t)
("block" :declared t)
("sexp" matchdatatype sexp)
("sexp" syntax "\\=")
("sexp" :declared t)
("qlist" matchdatatype sexp)
("qlist" syntax "\\s'\\s-*(")
("qlist" :declared t)
("char" syntax semantic-grammar-lex-c-char-re)
("char" :declared t)
("symbol" syntax ":?\\(\\sw\\|\\s_\\)+")
("symbol" :declared t)
("string" :declared t)
("keyword" :declared t)))
"Table of lexical tokens.")
(defconst semantic-grammar-wy--parse-table
(progn
(eval-when-compile
(require 'semantic/wisent/comp))
(wisent-compile-grammar
'((DEFAULT-PREC NO-DEFAULT-PREC KEYWORD LANGUAGEMODE LEFT NONASSOC PACKAGE PREC PUT QUOTEMODE RIGHT SCOPESTART START TOKEN TYPE USE-MACROS STRING SYMBOL PERCENT_PERCENT CHARACTER PREFIXED_LIST SEXP PROLOGUE EPILOGUE PAREN_BLOCK BRACE_BLOCK LPAREN RPAREN LBRACE RBRACE COLON SEMI OR LT GT)
nil
(grammar
((prologue))
((epilogue))
((declaration))
((nonterminal))
((PERCENT_PERCENT)))
(prologue
((PROLOGUE)
(wisent-raw-tag
(semantic-tag-new-code "prologue" nil))))
(epilogue
((EPILOGUE)
(wisent-raw-tag
(semantic-tag-new-code "epilogue" nil))))
(declaration
((decl)
(eval $1)))
(decl
((default_prec_decl))
((no_default_prec_decl))
((languagemode_decl))
((package_decl))
((precedence_decl))
((put_decl))
((quotemode_decl))
((scopestart_decl))
((start_decl))
((keyword_decl))
((token_decl))
((type_decl))
((use_macros_decl)))
(default_prec_decl
((DEFAULT-PREC)
`(wisent-raw-tag
(semantic-tag "default-prec" 'assoc :value
'("t")))))
(no_default_prec_decl
((NO-DEFAULT-PREC)
`(wisent-raw-tag
(semantic-tag "default-prec" 'assoc :value
'("nil")))))
(languagemode_decl
((LANGUAGEMODE symbols)
`(wisent-raw-tag
(semantic-tag ',(car $2)
'languagemode :rest ',(cdr $2)))))
(package_decl
((PACKAGE SYMBOL)
`(wisent-raw-tag
(semantic-tag-new-package ',$2 nil))))
(precedence_decl
((associativity token_type_opt items)
`(wisent-raw-tag
(semantic-tag ',$1 'assoc :type ',$2 :value ',$3))))
(associativity
((LEFT)
(progn "left"))
((RIGHT)
(progn "right"))
((NONASSOC)
(progn "nonassoc")))
(put_decl
((PUT put_name put_value)
`(wisent-raw-tag
(semantic-tag ',$2 'put :value ',(list $3))))
((PUT put_name put_value_list)
`(wisent-raw-tag
(semantic-tag ',$2 'put :value ',$3)))
((PUT put_name_list put_value)
`(wisent-raw-tag
(semantic-tag ',(car $2)
'put :rest ',(cdr $2)
:value ',(list $3))))
((PUT put_name_list put_value_list)
`(wisent-raw-tag
(semantic-tag ',(car $2)
'put :rest ',(cdr $2)
:value ',$3))))
(put_name_list
((BRACE_BLOCK)
(mapcar 'semantic-tag-name
(semantic-parse-region
(car $region1)
(cdr $region1)
'put_names 1))))
(put_names
((LBRACE)
nil)
((RBRACE)
nil)
((put_name)
(wisent-raw-tag
(semantic-tag $1 'put-name))))
(put_name
((SYMBOL))
((token_type)))
(put_value_list
((BRACE_BLOCK)
(mapcar 'semantic-tag-code-detail
(semantic-parse-region
(car $region1)
(cdr $region1)
'put_values 1))))
(put_values
((LBRACE)
nil)
((RBRACE)
nil)
((put_value)
(wisent-raw-tag
(semantic-tag-new-code "put-value" $1))))
(put_value
((SYMBOL any_value)
(cons $1 $2)))
(scopestart_decl
((SCOPESTART SYMBOL)
`(wisent-raw-tag
(semantic-tag ',$2 'scopestart))))
(quotemode_decl
((QUOTEMODE SYMBOL)
`(wisent-raw-tag
(semantic-tag ',$2 'quotemode))))
(start_decl
((START symbols)
`(wisent-raw-tag
(semantic-tag ',(car $2)
'start :rest ',(cdr $2)))))
(keyword_decl
((KEYWORD SYMBOL string_value)
`(wisent-raw-tag
(semantic-tag ',$2 'keyword :value ',$3))))
(token_decl
((TOKEN token_type_opt SYMBOL string_value)
`(wisent-raw-tag
(semantic-tag ',$3 ',(if $2 'token 'keyword)
:type ',$2 :value ',$4)))
((TOKEN token_type_opt symbols)
`(wisent-raw-tag
(semantic-tag ',(car $3)
'token :type ',$2 :rest ',(cdr $3)))))
(token_type_opt
(nil)
((token_type)))
(token_type
((LT SYMBOL GT)
(progn $2)))
(type_decl
((TYPE token_type plist_opt)
`(wisent-raw-tag
(semantic-tag ',$2 'type :value ',$3))))
(plist_opt
(nil)
((plist)))
(plist
((plist put_value)
(append
(list $2)
$1))
((put_value)
(list $1)))
(use_name_list
((BRACE_BLOCK)
(mapcar 'semantic-tag-name
(semantic-parse-region
(car $region1)
(cdr $region1)
'use_names 1))))
(use_names
((LBRACE)
nil)
((RBRACE)
nil)
((SYMBOL)
(wisent-raw-tag
(semantic-tag $1 'use-name))))
(use_macros_decl
((USE-MACROS SYMBOL use_name_list)
`(wisent-raw-tag
(semantic-tag "macro" 'macro :type ',$2 :value ',$3))))
(string_value
((STRING)
(read $1)))
(any_value
((SYMBOL))
((STRING))
((PAREN_BLOCK))
((PREFIXED_LIST))
((SEXP)))
(symbols
((lifo_symbols)
(nreverse $1)))
(lifo_symbols
((lifo_symbols SYMBOL)
(cons $2 $1))
((SYMBOL)
(list $1)))
(nonterminal
((SYMBOL
(setq semantic-grammar-wy--nterm $1 semantic-grammar-wy--rindx 0)
COLON rules SEMI)
(wisent-raw-tag
(semantic-tag $1 'nonterminal :children $4))))
(rules
((lifo_rules)
(apply 'nconc
(nreverse $1))))
(lifo_rules
((lifo_rules OR rule)
(cons $3 $1))
((rule)
(list $1)))
(rule
((rhs)
(let*
((nterm semantic-grammar-wy--nterm)
(rindx semantic-grammar-wy--rindx)
(rhs $1)
comps prec action elt)
(setq semantic-grammar-wy--rindx
(1+ semantic-grammar-wy--rindx))
(while rhs
(setq elt
(car rhs)
rhs
(cdr rhs))
(cond
((vectorp elt)
(if prec
(error "duplicate %%prec in `%s:%d' rule" nterm rindx))
(setq prec
(aref elt 0)))
((consp elt)
(if
(or action comps)
(setq comps
(cons elt comps)
semantic-grammar-wy--rindx
(1+ semantic-grammar-wy--rindx))
(setq action
(car elt))))
(t
(setq comps
(cons elt comps)))))
(wisent-cook-tag
(wisent-raw-tag
(semantic-tag
(format "%s:%d" nterm rindx)
'rule :type
(if comps "group" "empty")
:value comps :prec prec :expr action))))))
(rhs
(nil)
((rhs item)
(cons $2 $1))
((rhs action)
(cons
(list $2)
$1))
((rhs PREC item)
(cons
(vector $3)
$1)))
(action
((PAREN_BLOCK))
((PREFIXED_LIST))
((BRACE_BLOCK)
(format "(progn\n%s)"
(let
((s $1))
(if
(string-match "^{[ \n ]*" s)
(setq s
(substring s
(match-end 0))))
(if
(string-match "[ \n ]*}$" s)
(setq s
(substring s 0
(match-beginning 0))))
s))))
(items
((lifo_items)
(nreverse $1)))
(lifo_items
((lifo_items item)
(cons $2 $1))
((item)
(list $1)))
(item
((SYMBOL))
((CHARACTER))))
'(grammar prologue epilogue declaration nonterminal rule put_names put_values use_names)))
"Parser table.")
(defun semantic-grammar-wy--install-parser ()
"Setup the Semantic Parser."
(semantic-install-function-overrides
'((parse-stream . wisent-parse-stream)))
(setq semantic-parser-name "LALR"
semantic--parse-table semantic-grammar-wy--parse-table
semantic-debug-parser-source "semantic-grammar.wy"
semantic-flex-keywords-obarray semantic-grammar-wy--keyword-table
semantic-lex-types-obarray semantic-grammar-wy--token-table)
;; Collect unmatched syntax lexical tokens
(semantic-make-local-hook 'wisent-discarding-token-functions)
(add-hook 'wisent-discarding-token-functions
'wisent-collect-unmatched-syntax nil t))
;;; Analyzers
(define-lex-sexp-type-analyzer semantic-grammar-wy--<sexp>-sexp-analyzer
"sexp analyzer for <sexp> tokens."
"\\="
'SEXP)
(define-lex-sexp-type-analyzer semantic-grammar-wy--<qlist>-sexp-analyzer
"sexp analyzer for <qlist> tokens."
"\\s'\\s-*("
'PREFIXED_LIST)
(define-lex-keyword-type-analyzer semantic-grammar-wy--<keyword>-keyword-analyzer
"keyword analyzer for <keyword> tokens."
"\\(\\sw\\|\\s_\\)+")
(define-lex-block-type-analyzer semantic-grammar-wy--<block>-block-analyzer
"block analyzer for <block> tokens."
"\\s(\\|\\s)"
'((("(" LPAREN PAREN_BLOCK)
("{" LBRACE BRACE_BLOCK))
(")" RPAREN)
("}" RBRACE))
)
(define-lex-regex-type-analyzer semantic-grammar-wy--<char>-regexp-analyzer
"regexp analyzer for <char> tokens."
semantic-grammar-lex-c-char-re
nil
'CHARACTER)
(define-lex-sexp-type-analyzer semantic-grammar-wy--<string>-sexp-analyzer
"sexp analyzer for <string> tokens."
"\\s\""
'STRING)
(define-lex-regex-type-analyzer semantic-grammar-wy--<symbol>-regexp-analyzer
"regexp analyzer for <symbol> tokens."
":?\\(\\sw\\|\\s_\\)+"
'((PERCENT_PERCENT . "\\`%%\\'"))
'SYMBOL)
(define-lex-string-type-analyzer semantic-grammar-wy--<punctuation>-string-analyzer
"string analyzer for <punctuation> tokens."
"\\(\\s.\\|\\s$\\|\\s'\\)+"
'((GT . ">")
(LT . "<")
(OR . "|")
(SEMI . ";")
(COLON . ":"))
'punctuation)
(provide 'semantic/grammar-wy)
;;; semantic/grammar-wy.el ends here

File diff suppressed because it is too large Load diff