BaseTools/Source/Python/Common/Expression.py | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-)
From: Yunhua Feng <yunhuax.feng@intel.com>
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 <liming.gao@intel.com>
Cc: Yonghong Zhu <yonghong.zhu@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Yunhua Feng <yunhuax.feng@intel.com>
---
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
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
Reviewed-by: Yonghong Zhu <yonghong.zhu@intel.com> Best Regards, Zhu Yonghong -----Original Message----- From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of Yonghong Zhu Sent: Monday, July 03, 2017 4:31 PM To: edk2-devel@lists.01.org Cc: Feng, YunhuaX <yunhuax.feng@intel.com>; Gao, Liming <liming.gao@intel.com> Subject: [edk2] [PATCH] BaseTools: Add PCDs conditional operator function From: Yunhua Feng <yunhuax.feng@intel.com> 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 <liming.gao@intel.com> Cc: Yonghong Zhu <yonghong.zhu@intel.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Yunhua Feng <yunhuax.feng@intel.com> --- 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 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel
© 2016 - 2024 Red Hat, Inc.