aboutsummaryrefslogtreecommitdiffstats
path: root/lisp/progmodes/hideif.el
diff options
context:
space:
mode:
authorAndreas Schwab <[email protected]>2002-03-06 15:12:01 +0000
committerAndreas Schwab <[email protected]>2002-03-06 15:12:01 +0000
commit2dc2ec3d4976d285fbc76b942dfa14182643f1b5 (patch)
tree62cf2034a2e3b70cab573a4ee27ab11749d3e272 /lisp/progmodes/hideif.el
parent8b5eabe078efd10203fb0a428b2e99926fc6d0ba (diff)
Augment expression parser to handle conditional expressions.
Diffstat (limited to 'lisp/progmodes/hideif.el')
-rw-r--r--lisp/progmodes/hideif.el32
1 files changed, 25 insertions, 7 deletions
diff --git a/lisp/progmodes/hideif.el b/lisp/progmodes/hideif.el
index e814f296f0..0c88bc46fa 100644
--- a/lisp/progmodes/hideif.el
+++ b/lisp/progmodes/hideif.el
@@ -1,6 +1,6 @@
;;; hideif.el --- hides selected code within ifdef
-;; Copyright (C) 1988,1994,2001 Free Software Foundation, Inc.
+;; Copyright (C) 1988,1994,2001, 2002 Free Software Foundation, Inc.
;; Author: Daniel LaLiberte <[email protected]>
;; Maintainer: FSF
@@ -309,7 +309,7 @@ that form should be displayed.")
;; pattern to match initial identifier, !, &&, ||, (, or ).
;; Added ==, + and -: [email protected] 8/9/94
(defconst hif-token-regexp
- "\\(&&\\|||\\|[!=]=\\|!\\|[()+-]\\|[<>]=?\\|\\w+\\)")
+ "\\(&&\\|||\\|[!=]=\\|!\\|[()+?:-]\\|[<>]=?\\|\\w+\\)")
(defun hif-tokenize (start end)
"Separate string between START and END into a list of tokens."
@@ -342,6 +342,8 @@ that form should be displayed.")
((string-equal token "<=") 'hif-less-equal)
((string-equal token "+") 'hif-plus)
((string-equal token "-") 'hif-minus)
+ ((string-equal token "?") 'hif-conditional)
+ ((string-equal token ":") 'hif-colon)
((string-match "\\`[0-9]*\\'" token)
(string-to-number token))
(t (intern token)))
@@ -368,15 +370,29 @@ that form should be displayed.")
(defun hif-expr ()
"Parse an expression as found in #if.
- expr : term | expr '||' term."
- (let ((result (hif-term)))
+ expr : or-expr | or-expr '?' expr ':' expr."
+ (let ((result (hif-or-expr))
+ middle)
+ (while (eq hif-token 'hif-conditional)
+ (hif-nexttoken)
+ (setq middle (hif-expr))
+ (if (eq hif-token 'hif-colon)
+ (progn
+ (hif-nexttoken)
+ (setq result (list 'hif-conditional result middle (hif-expr))))
+ (error "Error: unexpected token: %s" hif-token)))
+ result))
+
+(defun hif-or-expr ()
+ "Parse n or-expr : and-expr | or-expr '||' and-expr."
+ (let ((result (hif-and-expr)))
(while (eq hif-token 'or)
(hif-nexttoken)
- (setq result (list 'hif-or result (hif-term))))
+ (setq result (list 'hif-or result (hif-and-expr))))
result))
-(defun hif-term ()
- "Parse a term : eq-expr | term '&&' eq-expr."
+(defun hif-and-expr ()
+ "Parse an and-expr : eq-expr | and-expr '&&' eq-expr."
(let ((result (hif-eq-expr)))
(while (eq hif-token 'and)
(hif-nexttoken)
@@ -449,6 +465,8 @@ that form should be displayed.")
((null val) 0)
(t val)))
+(defun hif-conditional (a b c)
+ (if (not (zerop (hif-mathify a))) (hif-mathify b) (hif-mathify c)))
(defun hif-and (a b)
(and (not (zerop (hif-mathify a))) (not (zerop (hif-mathify b)))))
(defun hif-or (a b)