# HG changeset patch # User Andreas Schwab # Date 1015427480 0 # Node ID 91939e9a62ec17f0c3630573735481b8bf18bad0 # Parent e9ccd91206bdda314e9bbbdbbcd9e843a2d8a6ae Augment expression parser to handle conditional expressions. diff -r e9ccd91206bd -r 91939e9a62ec lisp/progmodes/hideif.el --- 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 ;; 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)