From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 213962095A6D4 for ; Mon, 3 Jul 2017 01:29:42 -0700 (PDT) Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmsmga103.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 03 Jul 2017 01:31:18 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.40,302,1496127600"; d="scan'208";a="121692471" Received: from shwdeopenpsi168.ccr.corp.intel.com ([10.239.158.121]) by fmsmga005.fm.intel.com with ESMTP; 03 Jul 2017 01:31:17 -0700 From: Yonghong Zhu To: edk2-devel@lists.01.org Cc: Yunhua Feng , Liming Gao Date: Mon, 3 Jul 2017 16:31:17 +0800 Message-Id: <1499070677-24084-1-git-send-email-yonghong.zhu@intel.com> X-Mailer: git-send-email 2.6.1.windows.1 Subject: [PATCH] BaseTools: Add PCDs conditional operator function X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 03 Jul 2017 08:29:42 -0000 From: Yunhua Feng Parse PCDS value like A >B ? C :D if A > B is True, the result is C, else the result is D Cc: Liming Gao Cc: Yonghong Zhu Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Yunhua Feng --- BaseTools/Source/Python/Common/Expression.py | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/BaseTools/Source/Python/Common/Expression.py b/BaseTools/Source/Python/Common/Expression.py index 6d002f5676..ba83e02f75 100644 --- a/BaseTools/Source/Python/Common/Expression.py +++ b/BaseTools/Source/Python/Common/Expression.py @@ -129,7 +129,7 @@ class ValueExpression(object): 'IN' : 'in' } - NonLetterOpLst = ['+', '-', '*', '/', '%', '&', '|', '^', '~', '<<', '>>', '!', '=', '>', '<'] + NonLetterOpLst = ['+', '-', '*', '/', '%', '&', '|', '^', '~', '<<', '>>', '!', '=', '>', '<', '?', ':'] PcdPattern = re.compile(r'[_a-zA-Z][0-9A-Za-z_]*\.[_a-zA-Z][0-9A-Za-z_]*$') HexPattern = re.compile(r'0[xX][0-9a-fA-F]+$') @@ -276,7 +276,7 @@ class ValueExpression(object): self._Idx = 0 self._Token = '' - Val = self._OrExpr() + Val = self._ConExpr() RealVal = Val if type(Val) == type(''): if Val == 'L""': @@ -312,12 +312,24 @@ class ValueExpression(object): Val = EvalFunc() while self._IsOperator(OpLst): Op = self._Token + if Op == '?': + Val2 = EvalFunc() + if self._IsOperator(':'): + Val3 = EvalFunc() + if Val: + Val = Val2 + else: + Val = Val3 + continue try: Val = self.Eval(Op, Val, EvalFunc()) except WrnExpression, Warn: self._WarnExcept = Warn Val = Warn.result return Val + # A [? B]* + def _ConExpr(self): + return self._ExprFuncTemplate(self._OrExpr, ['?', ':']) # A [|| B]* def _OrExpr(self): @@ -392,7 +404,7 @@ class ValueExpression(object): def _IdenExpr(self): Tk = self._GetToken() if Tk == '(': - Val = self._OrExpr() + Val = self._ConExpr() try: # _GetToken may also raise BadExpression if self._GetToken() != ')': @@ -474,7 +486,7 @@ class ValueExpression(object): def __GetIdToken(self, IsAlphaOp = False): IdToken = '' for Ch in self._Expr[self._Idx:]: - if not self.__IsIdChar(Ch): + if not self.__IsIdChar(Ch) or ('?' in self._Expr and Ch == ':'): break self._Idx += 1 IdToken += Ch @@ -593,7 +605,7 @@ class ValueExpression(object): # Parse operator def _GetOperator(self): self.__SkipWS() - LegalOpLst = ['&&', '||', '!=', '==', '>=', '<='] + self.NonLetterOpLst + LegalOpLst = ['&&', '||', '!=', '==', '>=', '<='] + self.NonLetterOpLst + ['?',':'] self._Token = '' Expr = self._Expr[self._Idx:] -- 2.12.2.windows.2 GitPatchExtractor 1.0