aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Ingebrigtsen2019-06-19 13:47:22 +0200
committerLars Ingebrigtsen2019-06-19 13:48:49 +0200
commit390b4bc1e25fe691548d7ec982eb2f7027fe26a3 (patch)
tree3355d4c19e87fbe9814339a7f82cb30bd458fadd
parenteef48e124da251605ea05579aac196f2f8e2f534 (diff)
downloademacs-390b4bc1e25fe691548d7ec982eb2f7027fe26a3.tar.gz
emacs-390b4bc1e25fe691548d7ec982eb2f7027fe26a3.zip
Allow specifying the expected number of shift/reduce conflicts
* admin/grammars/grammar.wy: Add %expectedconflicts. * lisp/cedet/semantic/grammar-wy.el (semantic-grammar-wy--keyword-table): Ditto. * lisp/cedet/semantic/grammar.el (semantic-grammar-expected-conflicts): New function. (semantic-grammar-insert-defconst-with-eval): New function. (semantic-grammar-create-package): Output the number of expected shift/reduce conflicts. * lisp/cedet/semantic/wisent/comp.el (wisent-total-conflicts): Don't output the warning if the number of shift/reduce conflicts is expected. (wisent-expected-conflicts): Made obsolete.
-rw-r--r--admin/grammars/grammar.wy7
-rw-r--r--admin/grammars/python.wy1
-rw-r--r--lisp/cedet/semantic/grammar-wy.el9
-rw-r--r--lisp/cedet/semantic/grammar.el20
-rw-r--r--lisp/cedet/semantic/wisent/comp.el36
5 files changed, 57 insertions, 16 deletions
diff --git a/admin/grammars/grammar.wy b/admin/grammars/grammar.wy
index 5b06917d7db..81fd1b0b79c 100644
--- a/admin/grammars/grammar.wy
+++ b/admin/grammars/grammar.wy
@@ -52,6 +52,7 @@
52%keyword LEFT "%left" 52%keyword LEFT "%left"
53%keyword NONASSOC "%nonassoc" 53%keyword NONASSOC "%nonassoc"
54%keyword PACKAGE "%package" 54%keyword PACKAGE "%package"
55%keyword EXPECTEDCONFLICTS "%expectedconflicts"
55%keyword PROVIDE "%provide" 56%keyword PROVIDE "%provide"
56%keyword PREC "%prec" 57%keyword PREC "%prec"
57%keyword PUT "%put" 58%keyword PUT "%put"
@@ -135,6 +136,7 @@ decl:
135 | no_default_prec_decl 136 | no_default_prec_decl
136 | languagemode_decl 137 | languagemode_decl
137 | package_decl 138 | package_decl
139 | expectedconflicts_decl
138 | provide_decl 140 | provide_decl
139 | precedence_decl 141 | precedence_decl
140 | put_decl 142 | put_decl
@@ -167,6 +169,11 @@ package_decl:
167 `(PACKAGE-TAG ',$2 nil) 169 `(PACKAGE-TAG ',$2 nil)
168 ; 170 ;
169 171
172expectedconflicts_decl:
173 EXPECTEDCONFLICTS symbols
174 `(TAG ',(car $2) 'expectedconflicts :rest ',(cdr $2))
175 ;
176
170provide_decl: 177provide_decl:
171 PROVIDE SYMBOL 178 PROVIDE SYMBOL
172 `(TAG ',$2 'provide) 179 `(TAG ',$2 'provide)
diff --git a/admin/grammars/python.wy b/admin/grammars/python.wy
index 082850df59c..0e926ad3636 100644
--- a/admin/grammars/python.wy
+++ b/admin/grammars/python.wy
@@ -88,6 +88,7 @@
88 88
89%package wisent-python-wy 89%package wisent-python-wy
90%provide semantic/wisent/python-wy 90%provide semantic/wisent/python-wy
91%expectedconflicts 4
91 92
92%{ 93%{
93(declare-function wisent-python-reconstitute-function-tag 94(declare-function wisent-python-reconstitute-function-tag
diff --git a/lisp/cedet/semantic/grammar-wy.el b/lisp/cedet/semantic/grammar-wy.el
index cc5942fa323..b5066d3d27b 100644
--- a/lisp/cedet/semantic/grammar-wy.el
+++ b/lisp/cedet/semantic/grammar-wy.el
@@ -41,6 +41,7 @@
41 '(("%default-prec" . DEFAULT-PREC) 41 '(("%default-prec" . DEFAULT-PREC)
42 ("%no-default-prec" . NO-DEFAULT-PREC) 42 ("%no-default-prec" . NO-DEFAULT-PREC)
43 ("%keyword" . KEYWORD) 43 ("%keyword" . KEYWORD)
44 ("%expectedconflicts" . EXPECTEDCONFLICTS)
44 ("%languagemode" . LANGUAGEMODE) 45 ("%languagemode" . LANGUAGEMODE)
45 ("%left" . LEFT) 46 ("%left" . LEFT)
46 ("%nonassoc" . NONASSOC) 47 ("%nonassoc" . NONASSOC)
@@ -110,7 +111,7 @@
110 (eval-when-compile 111 (eval-when-compile
111 (require 'semantic/wisent/comp)) 112 (require 'semantic/wisent/comp))
112 (wisent-compile-grammar 113 (wisent-compile-grammar
113 '((DEFAULT-PREC NO-DEFAULT-PREC KEYWORD LANGUAGEMODE LEFT NONASSOC PACKAGE PROVIDE 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) 114 '((DEFAULT-PREC NO-DEFAULT-PREC KEYWORD LANGUAGEMODE EXPECTEDCONFLICTS LEFT NONASSOC PACKAGE PROVIDE 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)
114 nil 115 nil
115 (grammar 116 (grammar
116 ((prologue)) 117 ((prologue))
@@ -133,6 +134,7 @@
133 ((default_prec_decl)) 134 ((default_prec_decl))
134 ((no_default_prec_decl)) 135 ((no_default_prec_decl))
135 ((languagemode_decl)) 136 ((languagemode_decl))
137 ((expectedconflicts_decl))
136 ((package_decl)) 138 ((package_decl))
137 ((provide_decl)) 139 ((provide_decl))
138 ((precedence_decl)) 140 ((precedence_decl))
@@ -159,6 +161,11 @@
159 `(wisent-raw-tag 161 `(wisent-raw-tag
160 (semantic-tag ',(car $2) 162 (semantic-tag ',(car $2)
161 'languagemode :rest ',(cdr $2))))) 163 'languagemode :rest ',(cdr $2)))))
164 (expectedconflicts_decl
165 ((EXPECTEDCONFLICTS symbols)
166 `(wisent-raw-tag
167 (semantic-tag ',(car $2)
168 'expectedconflicts :rest ',(cdr $2)))))
162 (package_decl 169 (package_decl
163 ((PACKAGE SYMBOL) 170 ((PACKAGE SYMBOL)
164 `(wisent-raw-tag 171 `(wisent-raw-tag
diff --git a/lisp/cedet/semantic/grammar.el b/lisp/cedet/semantic/grammar.el
index 8ffa4c6d83e..3c35583dd3c 100644
--- a/lisp/cedet/semantic/grammar.el
+++ b/lisp/cedet/semantic/grammar.el
@@ -277,6 +277,10 @@ foo.by it is foo-by."
277 (i (string-match (format "\\([.]\\)%s\\'" ext) file))) 277 (i (string-match (format "\\([.]\\)%s\\'" ext) file)))
278 (concat (substring file 0 i) "-" ext)))) 278 (concat (substring file 0 i) "-" ext))))
279 279
280(defun semantic-grammar-expected-conflicts ()
281 "Return the number of expected shift/reduce conflicts in the package."
282 (semantic-grammar-tag-symbols 'expectedconflicts))
283
280(defsubst semantic-grammar-languagemode () 284(defsubst semantic-grammar-languagemode ()
281 "Return the %languagemode value as a list of symbols or nil." 285 "Return the %languagemode value as a list of symbols or nil."
282 (semantic-grammar-tag-symbols 'languagemode)) 286 (semantic-grammar-tag-symbols 'languagemode))
@@ -533,6 +537,14 @@ Also load the specified macro libraries."
533 (goto-char start) 537 (goto-char start)
534 (indent-sexp)))) 538 (indent-sexp))))
535 539
540(defun semantic-grammar-insert-defconst-with-eval (name value docstring)
541 "Insert declaration of constant NAME with VALUE and DOCSTRING."
542 (let ((start (point)))
543 (insert (format "(eval-and-compile (defconst %s\n%s%S))\n\n" name value docstring))
544 (save-excursion
545 (goto-char start)
546 (indent-sexp))))
547
536(defun semantic-grammar-insert-defun (name body docstring) 548(defun semantic-grammar-insert-defun (name body docstring)
537 "Insert declaration of function NAME with BODY and DOCSTRING." 549 "Insert declaration of function NAME with BODY and DOCSTRING."
538 (let ((start (point))) 550 (let ((start (point)))
@@ -890,6 +902,12 @@ Lisp code."
890 902
891 (insert " \n;;; Declarations\n;;\n") 903 (insert " \n;;; Declarations\n;;\n")
892 904
905 (semantic-grammar-insert-defconst-with-eval
906 (concat semantic--grammar-package "--expected-conflicts")
907 (with-current-buffer semantic--grammar-input-buffer
908 (format "%s\n" (car (semantic-grammar-expected-conflicts))))
909 "The number of expected shift/reduce conflicts in this grammar.")
910
893 ;; `eval-defun' is not necessary to reset `defconst' values. 911 ;; `eval-defun' is not necessary to reset `defconst' values.
894 (semantic-grammar-insert-defconst 912 (semantic-grammar-insert-defconst
895 (semantic-grammar-keywordtable) 913 (semantic-grammar-keywordtable)
@@ -987,7 +1005,7 @@ Return non-nil if there were no errors, nil if errors."
987 (vc-handled-backends nil)) 1005 (vc-handled-backends nil))
988 (setq semanticdb-new-database-class 'semanticdb-project-database) 1006 (setq semanticdb-new-database-class 'semanticdb-project-database)
989 (semantic-mode 1) 1007 (semantic-mode 1)
990 (semantic-grammar-create-package))) 1008 (semantic-grammar-create-package t)))
991 (error 1009 (error
992 (message "%s" (error-message-string err)) 1010 (message "%s" (error-message-string err))
993 nil)))) 1011 nil))))
diff --git a/lisp/cedet/semantic/wisent/comp.el b/lisp/cedet/semantic/wisent/comp.el
index 051b898ed78..4e222fa70eb 100644
--- a/lisp/cedet/semantic/wisent/comp.el
+++ b/lisp/cedet/semantic/wisent/comp.el
@@ -2263,26 +2263,34 @@ warning is given if there are either more or fewer conflicts, or if
2263there are any reduce/reduce conflicts." 2263there are any reduce/reduce conflicts."
2264 :group 'wisent 2264 :group 'wisent
2265 :type '(choice (const nil) integer)) 2265 :type '(choice (const nil) integer))
2266(make-obsolete-variable 'wisent-expected-conflicts
2267 "use %expectedconflicts in the .wy file instead"
2268 "27.1")
2266 2269
2267(defun wisent-total-conflicts () 2270(defun wisent-total-conflicts ()
2268 "Report the total number of conflicts." 2271 "Report the total number of conflicts."
2269 (unless (and (zerop rrc-total) 2272 (let* ((src (wisent-source))
2270 (or (zerop src-total) 2273 (symbol (intern (format "wisent-%s--expected-conflicts"
2271 (= src-total (or wisent-expected-conflicts 0)))) 2274 (replace-regexp-in-string "\\.el$" "" src))
2272 (let* ((src (wisent-source)) 2275 obarray)))
2273 (src (if src (concat " in " src) "")) 2276 (when (or (not (zerop rrc-total))
2274 (msg (format "Grammar%s contains" src))) 2277 (and (not (zerop src-total))
2275 (if (> src-total 0) 2278 (not (= src-total (or wisent-expected-conflicts 0)))
2279 (or (not (boundp symbol))
2280 (not (equal (symbol-value symbol) src-total)))))
2281 (let* ((src (if src (concat " in " src) ""))
2282 (msg (format "Grammar%s contains" src)))
2283 (when (and (> src-total 0))
2276 (setq msg (format "%s %d shift/reduce conflict%s" 2284 (setq msg (format "%s %d shift/reduce conflict%s"
2277 msg src-total (if (> src-total 1) 2285 msg src-total (if (> src-total 1)
2278 "s" "")))) 2286 "s" ""))))
2279 (if (and (> src-total 0) (> rrc-total 0)) 2287 (if (and (> src-total 0) (> rrc-total 0))
2280 (setq msg (format "%s and" msg))) 2288 (setq msg (format "%s and" msg)))
2281 (if (> rrc-total 0) 2289 (if (> rrc-total 0)
2282 (setq msg (format "%s %d reduce/reduce conflict%s" 2290 (setq msg (format "%s %d reduce/reduce conflict%s"
2283 msg rrc-total (if (> rrc-total 1) 2291 msg rrc-total (if (> rrc-total 1)
2284 "s" "")))) 2292 "s" ""))))
2285 (message msg)))) 2293 (message msg)))))
2286 2294
2287(defun wisent-print-conflicts () 2295(defun wisent-print-conflicts ()
2288 "Report conflicts." 2296 "Report conflicts."