Mercurial > emacs
changeset 43747:91939e9a62ec
Augment expression parser to handle conditional expressions.
author | Andreas Schwab <schwab@suse.de> |
---|---|
date | Wed, 06 Mar 2002 15:11:20 +0000 |
parents | e9ccd91206bd |
children | c37076b8a3cd |
files | lisp/progmodes/hideif.el |
diffstat | 1 files changed, 25 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/progmodes/hideif.el Wed Mar 06 14:03:32 2002 +0000 +++ b/lisp/progmodes/hideif.el Wed Mar 06 15:11:20 2002 +0000 @@ -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 <liberte@holonexus.org> ;; Maintainer: FSF @@ -309,7 +309,7 @@ ;; pattern to match initial identifier, !, &&, ||, (, or ). ;; Added ==, + and -: garyo@avs.com 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 @@ ((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 @@ (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 @@ ((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)