BaseTools: Add PCDs conditional operator function

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>
Reviewed-by: Yonghong Zhu <yonghong.zhu@intel.com>
This commit is contained in:
Yunhua Feng 2017-05-31 13:33:49 +08:00 committed by Yonghong Zhu
parent e9651c1272
commit bc0d723392
1 changed files with 17 additions and 5 deletions

View File

@ -129,7 +129,7 @@ class ValueExpression(object):
'IN' : 'in' 'IN' : 'in'
} }
NonLetterOpLst = ['+', '-', '*', '/', '%', '&', '|', '^', '~', '<<', '>>', '!', '=', '>', '<'] NonLetterOpLst = ['+', '-', '*', '/', '%', '&', '|', '^', '~', '<<', '>>', '!', '=', '>', '<', '?', ':']
PcdPattern = re.compile(r'[_a-zA-Z][0-9A-Za-z_]*\.[_a-zA-Z][0-9A-Za-z_]*$') 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]+$') HexPattern = re.compile(r'0[xX][0-9a-fA-F]+$')
@ -276,7 +276,7 @@ class ValueExpression(object):
self._Idx = 0 self._Idx = 0
self._Token = '' self._Token = ''
Val = self._OrExpr() Val = self._ConExpr()
RealVal = Val RealVal = Val
if type(Val) == type(''): if type(Val) == type(''):
if Val == 'L""': if Val == 'L""':
@ -312,12 +312,24 @@ class ValueExpression(object):
Val = EvalFunc() Val = EvalFunc()
while self._IsOperator(OpLst): while self._IsOperator(OpLst):
Op = self._Token Op = self._Token
if Op == '?':
Val2 = EvalFunc()
if self._IsOperator(':'):
Val3 = EvalFunc()
if Val:
Val = Val2
else:
Val = Val3
continue
try: try:
Val = self.Eval(Op, Val, EvalFunc()) Val = self.Eval(Op, Val, EvalFunc())
except WrnExpression, Warn: except WrnExpression, Warn:
self._WarnExcept = Warn self._WarnExcept = Warn
Val = Warn.result Val = Warn.result
return Val return Val
# A [? B]*
def _ConExpr(self):
return self._ExprFuncTemplate(self._OrExpr, ['?', ':'])
# A [|| B]* # A [|| B]*
def _OrExpr(self): def _OrExpr(self):
@ -392,7 +404,7 @@ class ValueExpression(object):
def _IdenExpr(self): def _IdenExpr(self):
Tk = self._GetToken() Tk = self._GetToken()
if Tk == '(': if Tk == '(':
Val = self._OrExpr() Val = self._ConExpr()
try: try:
# _GetToken may also raise BadExpression # _GetToken may also raise BadExpression
if self._GetToken() != ')': if self._GetToken() != ')':
@ -474,7 +486,7 @@ class ValueExpression(object):
def __GetIdToken(self, IsAlphaOp = False): def __GetIdToken(self, IsAlphaOp = False):
IdToken = '' IdToken = ''
for Ch in self._Expr[self._Idx:]: for Ch in self._Expr[self._Idx:]:
if not self.__IsIdChar(Ch): if not self.__IsIdChar(Ch) or ('?' in self._Expr and Ch == ':'):
break break
self._Idx += 1 self._Idx += 1
IdToken += Ch IdToken += Ch
@ -593,7 +605,7 @@ class ValueExpression(object):
# Parse operator # Parse operator
def _GetOperator(self): def _GetOperator(self):
self.__SkipWS() self.__SkipWS()
LegalOpLst = ['&&', '||', '!=', '==', '>=', '<='] + self.NonLetterOpLst LegalOpLst = ['&&', '||', '!=', '==', '>=', '<='] + self.NonLetterOpLst + ['?',':']
self._Token = '' self._Token = ''
Expr = self._Expr[self._Idx:] Expr = self._Expr[self._Idx:]