diff options
Diffstat (limited to 'BaseTools/Source/Python/UPT/Library/ExpressionValidate.py')
-rw-r--r-- | BaseTools/Source/Python/UPT/Library/ExpressionValidate.py | 118 |
1 files changed, 59 insertions, 59 deletions
diff --git a/BaseTools/Source/Python/UPT/Library/ExpressionValidate.py b/BaseTools/Source/Python/UPT/Library/ExpressionValidate.py index afa5b2407e..2e0253ab51 100644 --- a/BaseTools/Source/Python/UPT/Library/ExpressionValidate.py +++ b/BaseTools/Source/Python/UPT/Library/ExpressionValidate.py @@ -1,11 +1,11 @@ ## @file
# This file is used to check PCD logical expression
#
-# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>
+# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
#
-# This program and the accompanying materials are licensed and made available
-# under the terms and conditions of the BSD License which accompanies this
-# distribution. The full text of the license may be found at
+# This program and the accompanying materials are licensed and made available
+# under the terms and conditions of the BSD License which accompanies this
+# distribution. The full text of the license may be found at
# http://opensource.org/licenses/bsd-license.php
#
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
@@ -47,7 +47,7 @@ def IsValidBareCString(String): and (IntChar < 0x23 or IntChar > 0x7e):
return False
PreChar = Char
-
+
# Last char cannot be \ if PreChar is not \
if LastChar == '\\' and PreChar == LastChar:
return False
@@ -83,7 +83,7 @@ class _ExprBase: self.Token = Token
self.Index = 0
self.Len = len(Token)
-
+
## SkipWhitespace
#
def SkipWhitespace(self):
@@ -91,14 +91,14 @@ class _ExprBase: if Char not in ' \t':
break
self.Index += 1
-
+
## IsCurrentOp
#
- # @param OpList: option list
- #
+ # @param OpList: option list
+ #
def IsCurrentOp(self, OpList):
self.SkipWhitespace()
- LetterOp = ["EQ", "NE", "GE", "LE", "GT", "LT", "NOT", "and", "AND",
+ LetterOp = ["EQ", "NE", "GE", "LE", "GT", "LT", "NOT", "and", "AND",
"or", "OR", "XOR"]
OpMap = {
'|' : '|',
@@ -107,11 +107,11 @@ class _ExprBase: '>' : '=',
'<' : '='
}
-
+
for Operator in OpList:
if not self.Token[self.Index:].startswith(Operator):
continue
-
+
self.Index += len(Operator)
Char = self.Token[self.Index : self.Index + 1]
@@ -119,36 +119,36 @@ class _ExprBase: or (Operator in OpMap and OpMap[Operator] == Char):
self.Index -= len(Operator)
break
-
+
return True
-
+
return False
## _LogicalExpressionParser
#
# @param _ExprBase: _ExprBase object
-#
+#
class _LogicalExpressionParser(_ExprBase):
#
# STRINGITEM can only be logical field according to spec
#
STRINGITEM = -1
-
+
#
# Evaluate to True or False
#
LOGICAL = 0
REALLOGICAL = 2
-
+
#
# Just arithmetic expression
#
ARITH = 1
-
+
def __init__(self, Token):
_ExprBase.__init__(self, Token)
self.Parens = 0
-
+
def _CheckToken(self, MatchList):
for Match in MatchList:
if Match and Match.start() == 0:
@@ -156,7 +156,7 @@ class _LogicalExpressionParser(_ExprBase): self.Token[self.Index:self.Index+Match.end()]
):
return False
-
+
self.Index += Match.end()
if self.Token[self.Index - 1] == '"':
return True
@@ -164,61 +164,61 @@ class _LogicalExpressionParser(_ExprBase): self.Token[self.Index:self.Index+1].isalnum():
self.Index -= Match.end()
return False
-
+
Token = self.Token[self.Index - Match.end():self.Index]
if Token.strip() in ["EQ", "NE", "GE", "LE", "GT", "LT",
"NOT", "and", "AND", "or", "OR", "XOR"]:
self.Index -= Match.end()
return False
-
+
return True
-
+
return False
-
+
def IsAtomicNumVal(self):
#
# Hex number
#
Match1 = re.compile(self.HEX_PATTERN).match(self.Token[self.Index:])
-
+
#
# Number
#
Match2 = re.compile(self.INT_PATTERN).match(self.Token[self.Index:])
-
+
#
# Macro
#
Match3 = re.compile(self.MACRO_PATTERN).match(self.Token[self.Index:])
-
+
#
# PcdName
#
Match4 = re.compile(self.PCD_PATTERN).match(self.Token[self.Index:])
-
+
return self._CheckToken([Match1, Match2, Match3, Match4])
-
+
def IsAtomicItem(self):
#
# Macro
#
Match1 = re.compile(self.MACRO_PATTERN).match(self.Token[self.Index:])
-
+
#
# PcdName
#
Match2 = re.compile(self.PCD_PATTERN).match(self.Token[self.Index:])
-
+
#
# Quoted string
#
Match3 = re.compile(self.QUOTED_PATTERN).\
match(self.Token[self.Index:].replace('\\\\', '//').\
replace('\\\"', '\\\''))
-
+
return self._CheckToken([Match1, Match2, Match3])
-
+
## A || B
#
def LogicalExpression(self):
@@ -233,12 +233,12 @@ class _LogicalExpressionParser(_ExprBase): raise _ExprError(ST.ERR_EXPR_LOGICAL % self.Token)
Ret = self.REALLOGICAL
return Ret
-
+
def SpecNot(self):
if self.IsCurrentOp(["NOT", "!", "not"]):
return self.SpecNot()
return self.Rel()
-
+
## A < B, A > B, A <= B, A >= B
#
def Rel(self):
@@ -252,7 +252,7 @@ class _LogicalExpressionParser(_ExprBase): raise _ExprError(ST.ERR_EXPR_LOGICAL % self.Token)
Ret = self.REALLOGICAL
return Ret
-
+
## A + B, A - B
#
def Expr(self):
@@ -269,7 +269,7 @@ class _LogicalExpressionParser(_ExprBase): return Ret
## Factor
- #
+ #
def Factor(self):
if self.IsCurrentOp(["("]):
self.Parens += 1
@@ -279,7 +279,7 @@ class _LogicalExpressionParser(_ExprBase): (self.Token, self.Token[self.Index:]))
self.Parens -= 1
return Ret
-
+
if self.IsAtomicItem():
if self.Token[self.Index - 1] == '"':
return self.STRINGITEM
@@ -289,7 +289,7 @@ class _LogicalExpressionParser(_ExprBase): else:
raise _ExprError(ST.ERR_EXPR_FACTOR % \
(self.Token[self.Index:], self.Token))
-
+
## IsValidLogicalExpression
#
def IsValidLogicalExpression(self):
@@ -319,7 +319,7 @@ class _ValidRangeExpressionParser(_ExprBase): self.INT = 2
self.IsParenHappen = False
self.IsLogicalOpHappen = False
-
+
## IsValidRangeExpression
#
def IsValidRangeExpression(self):
@@ -330,12 +330,12 @@ class _ValidRangeExpressionParser(_ExprBase): return False, ST.ERR_EXPR_RANGE % self.Token
except _ExprError as XExcept:
return False, XExcept.Error
-
+
self.SkipWhitespace()
if self.Index != self.Len:
return False, (ST.ERR_EXPR_RANGE % self.Token)
return True, ''
-
+
## RangeExpression
#
def RangeExpression(self):
@@ -346,22 +346,22 @@ class _ValidRangeExpressionParser(_ExprBase): raise _ExprError(ST.ERR_PAREN_NOT_USED % self.Token)
self.IsParenHappen = False
Ret = self.Unary()
-
+
if self.IsCurrentOp(['XOR']):
Ret = self.Unary()
-
+
return Ret
-
+
## Unary
#
def Unary(self):
if self.IsCurrentOp(["NOT"]):
return self.Unary()
-
+
return self.ValidRange()
-
+
## ValidRange
- #
+ #
def ValidRange(self):
Ret = -1
if self.IsCurrentOp(["("]):
@@ -375,10 +375,10 @@ class _ValidRangeExpressionParser(_ExprBase): raise _ExprError(ST.ERR_EXPR_RIGHT_PAREN % self.Token)
self.Parens -= 1
return Ret
-
+
if self.IsLogicalOpHappen:
raise _ExprError(ST.ERR_PAREN_NOT_USED % self.Token)
-
+
if self.IsCurrentOp(["LT", "GT", "LE", "GE", "EQ", "XOR"]):
IntMatch = \
re.compile(self.INT_PATTERN).match(self.Token[self.Index:])
@@ -417,7 +417,7 @@ class _ValidListExpressionParser(_ExprBase): def __init__(self, Token):
_ExprBase.__init__(self, Token)
self.NUM = 1
-
+
def IsValidListExpression(self):
if self.Len == 0:
return False, ST.ERR_EXPR_LIST_EMPTY
@@ -432,7 +432,7 @@ class _ValidListExpressionParser(_ExprBase): return False, (ST.ERR_EXPR_LIST % self.Token)
return True, ''
-
+
def ListExpression(self):
Ret = -1
self.SkipWhitespace()
@@ -444,7 +444,7 @@ class _ValidListExpressionParser(_ExprBase): raise _ExprError(ST.ERR_EXPR_LIST % self.Token)
return Ret
-
+
## _StringTestParser
#
class _StringTestParser(_ExprBase):
@@ -452,7 +452,7 @@ class _StringTestParser(_ExprBase): _ExprBase.__init__(self, Token)
## IsValidStringTest
- #
+ #
def IsValidStringTest(self):
if self.Len == 0:
return False, ST.ERR_EXPR_EMPTY
@@ -463,7 +463,7 @@ class _StringTestParser(_ExprBase): return True, ''
## StringItem
- #
+ #
def StringItem(self):
Match1 = re.compile(self.QUOTED_PATTERN)\
.match(self.Token[self.Index:].replace('\\\\', '//')\
@@ -489,7 +489,7 @@ class _StringTestParser(_ExprBase): (self.Token, self.Token[self.Index:]))
## StringTest
- #
+ #
def StringTest(self):
self.StringItem()
if not self.IsCurrentOp(["==", "EQ", "!=", "NE"]):
@@ -538,7 +538,7 @@ def IsValidRangeExpr(Token): ##
# Check syntax of value list expression token
#
-# @param Token: value list expression token
+# @param Token: value list expression token
#
def IsValidListExpr(Token):
return _ValidListExpressionParser(Token).IsValidListExpression()
@@ -562,7 +562,7 @@ def IsValidFeatureFlagExp(Token, Flag=False): if not Valid:
Valid, Cause = IsValidLogicalExpr(Token, Flag)
if not Valid:
- return False, Cause
+ return False, Cause
return True, ""
if __name__ == '__main__':
@@ -570,4 +570,4 @@ if __name__ == '__main__': print(_LogicalExpressionParser('gCrownBayTokenSpaceGuid.PcdPciDevice1BridgeAddressLE0').IsValidLogicalExpression())
-
+
|