4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# This file is used to check PCD logical expression
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# This program and the accompanying materials are licensed and made available
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# under the terms and conditions of the BSD License which accompanies this
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# http://opensource.org/licenses/bsd-license.php
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync'''
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncExpressionValidate
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync'''
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync##
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Import Modules
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncimport re
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom Logger import StringTable as ST
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## IsValidBareCString
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Check if String is comprised by whitespace(0x20), !(0x21), 0x23 - 0x7E
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# or '\n', '\t', '\f', '\r', '\b', '\0', '\\'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param String: string to be checked
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef IsValidBareCString(String):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EscapeList = ['n', 't', 'f', 'r', 'b', '0', '\\', '"']
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PreChar = ''
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LastChar = ''
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for Char in String:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LastChar = Char
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if PreChar == '\\':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Char not in EscapeList:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return False
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Char == '\\':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PreChar = ''
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IntChar = ord(Char)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if IntChar != 0x20 and IntChar != 0x09 and IntChar != 0x21 \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and (IntChar < 0x23 or IntChar > 0x7e):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return False
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PreChar = Char
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Last char cannot be \ if PreChar is not \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if LastChar == '\\' and PreChar == LastChar:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return False
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return True
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef _ValidateToken(Token):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Token = Token.strip()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Index = Token.find("\"")
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Index != -1:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return IsValidBareCString(Token[Index+1:-1])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return True
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## _ExprError
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param Exception: Exception
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncclass _ExprError(Exception):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def __init__(self, Error = ''):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Exception.__init__(self)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.Error = Error
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## _ExprBase
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncclass _ExprBase:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HEX_PATTERN = '[\t\s]*0[xX][a-fA-F0-9]+'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INT_PATTERN = '[\t\s]*[0-9]+'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MACRO_PATTERN = '[\t\s]*\$\(([A-Z][_A-Z0-9]*)\)'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PCD_PATTERN = \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync '[\t\s]*[_a-zA-Z][a-zA-Z0-9_]*[\t\s]*\.[\t\s]*[_a-zA-Z][a-zA-Z0-9_]*'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync QUOTED_PATTERN = '[\t\s]*L?"[^"]*"'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOL_PATTERN = '[\t\s]*(true|True|TRUE|false|False|FALSE)'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def __init__(self, Token):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.Token = Token
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.Index = 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.Len = len(Token)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## SkipWhitespace
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def SkipWhitespace(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for Char in self.Token[self.Index:]:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Char not in ' \t':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.Index += 1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## IsCurrentOp
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param OpList: option list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def IsCurrentOp(self, OpList):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.SkipWhitespace()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LetterOp = ["EQ", "NE", "GE", "LE", "GT", "LT", "NOT", "and", "AND",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "or", "OR", "XOR"]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpMap = {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync '|' : '|',
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync '&' : '&',
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync '!' : '=',
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync '>' : '=',
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync '<' : '='
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for Operator in OpList:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not self.Token[self.Index:].startswith(Operator):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.Index += len(Operator)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Char = self.Token[self.Index : self.Index + 1]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Operator in LetterOp and (Char == '_' or Char.isalnum())) \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync or (Operator in OpMap and OpMap[Operator] == Char):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.Index -= len(Operator)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return True
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return False
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## _LogicalExpressionParser
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param _ExprBase: _ExprBase object
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncclass _LogicalExpressionParser(_ExprBase):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # STRINGITEM can only be logical field according to spec
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STRINGITEM = -1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Evaluate to True or False
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LOGICAL = 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync REALLOGICAL = 2
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Just arithmetic expression
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ARITH = 1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def __init__(self, Token):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync _ExprBase.__init__(self, Token)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.Parens = 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def _CheckToken(self, MatchList):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for Match in MatchList:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Match and Match.start() == 0:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not _ValidateToken(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.Token[self.Index:self.Index+Match.end()]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return False
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.Index += Match.end()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if self.Token[self.Index - 1] == '"':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return True
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if self.Token[self.Index:self.Index+1] == '_' or \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.Token[self.Index:self.Index+1].isalnum():
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.Index -= Match.end()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return False
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Token = self.Token[self.Index - Match.end():self.Index]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Token.strip() in ["EQ", "NE", "GE", "LE", "GT", "LT",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "NOT", "and", "AND", "or", "OR", "XOR"]:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.Index -= Match.end()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return False
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return True
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return False
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def IsAtomicNumVal(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Hex number
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Match1 = re.compile(self.HEX_PATTERN).match(self.Token[self.Index:])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Number
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Match2 = re.compile(self.INT_PATTERN).match(self.Token[self.Index:])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Macro
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Match3 = re.compile(self.MACRO_PATTERN).match(self.Token[self.Index:])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # PcdName
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Match4 = re.compile(self.PCD_PATTERN).match(self.Token[self.Index:])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return self._CheckToken([Match1, Match2, Match3, Match4])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def IsAtomicItem(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Macro
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Match1 = re.compile(self.MACRO_PATTERN).match(self.Token[self.Index:])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # PcdName
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Match2 = re.compile(self.PCD_PATTERN).match(self.Token[self.Index:])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Quoted string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Match3 = re.compile(self.QUOTED_PATTERN).\
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync match(self.Token[self.Index:].replace('\\\\', '//').\
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync replace('\\\"', '\\\''))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return self._CheckToken([Match1, Match2, Match3])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## A || B
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def LogicalExpression(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ret = self.SpecNot()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while self.IsCurrentOp(['||', 'OR', 'or', '&&', 'AND', 'and', 'XOR']):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if self.Token[self.Index-1] == '|' and self.Parens <= 0:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync raise _ExprError(ST.ERR_EXPR_OR)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Ret == self.ARITH:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync raise _ExprError(ST.ERR_EXPR_LOGICAL % self.Token)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ret = self.SpecNot()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Ret == self.ARITH:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync raise _ExprError(ST.ERR_EXPR_LOGICAL % self.Token)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ret = self.REALLOGICAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Ret
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def SpecNot(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if self.IsCurrentOp(["NOT", "!"]):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return self.SpecNot()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return self.Rel()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## A < B, A > B, A <= B, A >= b
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def Rel(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ret = self.Expr()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if self.IsCurrentOp(["<=", ">=", ">", "<", "GT", "LT", "GE", "LE",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "==", "EQ", "!=", "NE"]):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Ret == self.STRINGITEM or Ret == self.REALLOGICAL:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync raise _ExprError(ST.ERR_EXPR_LOGICAL % self.Token)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ret = self.Expr()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Ret == self.STRINGITEM or Ret == self.REALLOGICAL:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync raise _ExprError(ST.ERR_EXPR_LOGICAL % self.Token)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ret = self.REALLOGICAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Ret
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## A + B, A - B
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def Expr(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ret = self.Factor()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while self.IsCurrentOp(["+", "-", "&", "|", "^"]):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if self.Token[self.Index-1] == '|' and self.Parens <= 0:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync raise _ExprError(ST.ERR_EXPR_OR)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Ret == self.STRINGITEM or Ret == self.REALLOGICAL:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync raise _ExprError(ST.ERR_EXPR_LOGICAL % self.Token)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ret = self.Factor()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Ret == self.STRINGITEM or Ret == self.REALLOGICAL:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync raise _ExprError(ST.ERR_EXPR_LOGICAL % self.Token)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ret = self.ARITH
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Ret
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## Factor
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def Factor(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if self.IsCurrentOp(["("]):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.Parens += 1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ret = self.LogicalExpression()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not self.IsCurrentOp([")"]):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync raise _ExprError(ST.ERR_EXPR_RIGHT_PAREN % \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (self.Token, self.Token[self.Index:]))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.Parens -= 1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Ret
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if self.IsAtomicItem():
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if self.Token[self.Index - 1] == '"':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return self.STRINGITEM
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return self.LOGICAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync elif self.IsAtomicNumVal():
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return self.ARITH
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync raise _ExprError(ST.ERR_EXPR_FACTOR % \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (self.Token, self.Token[self.Index:]))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## IsValidLogicalExpression
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def IsValidLogicalExpression(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if self.Len == 0:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return False, ST.ERR_EXPR_EMPTY
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync try:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if self.LogicalExpression() == self.ARITH:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return False, ST.ERR_EXPR_LOGICAL % self.Token
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync except _ExprError, XExcept:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return False, XExcept.Error
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.SkipWhitespace()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if self.Index != self.Len:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return False, (ST.ERR_EXPR_BOOLEAN % \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (self.Token[self.Index:], self.Token))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return True, ''
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## _ValidRangeExpressionParser
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncclass _ValidRangeExpressionParser(_ExprBase):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INT_RANGE_PATTERN = '[\t\s]*[0-9]+[\t\s]*-[\t\s]*[0-9]+'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HEX_RANGE_PATTERN = \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync '[\t\s]*0[xX][a-fA-F0-9]+[\t\s]*-[\t\s]*0[xX][a-fA-F0-9]+'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def __init__(self, Token):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync _ExprBase.__init__(self, Token)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## IsValidRangeExpression
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def IsValidRangeExpression(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if self.Len == 0:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return False
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync try:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.RangeExpression()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync except _ExprError:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return False
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.SkipWhitespace()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if self.Index != self.Len:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return False
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return True
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## RangeExpression
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def RangeExpression(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.Unary()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while self.IsCurrentOp(['OR', 'AND', 'XOR']):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.Unary()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## Unary
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def Unary(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if self.IsCurrentOp(["NOT", "-"]):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return self.Unary()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return self.ValidRange()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## ValidRange
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def ValidRange(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if self.IsCurrentOp(["("]):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.RangeExpression()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not self.IsCurrentOp([")"]):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync raise _ExprError('')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if self.IsCurrentOp(["LT", "GT", "LE", "GE", "EQ"]):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IntMatch = \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync re.compile(self.INT_PATTERN).match(self.Token[self.Index:])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HexMatch = \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync re.compile(self.HEX_PATTERN).match(self.Token[self.Index:])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if HexMatch and HexMatch.start() == 0:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.Index += HexMatch.end()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync elif IntMatch and IntMatch.start() == 0:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.Index += IntMatch.end()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync raise _ExprError('')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IntRangeMatch = re.compile(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.INT_RANGE_PATTERN).match(self.Token[self.Index:]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HexRangeMatch = re.compile(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.HEX_RANGE_PATTERN).match(self.Token[self.Index:]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if HexRangeMatch and HexRangeMatch.start() == 0:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.Index += HexRangeMatch.end()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync elif IntRangeMatch and IntRangeMatch.start() == 0:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.Index += IntRangeMatch.end()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync raise _ExprError('')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if self.Token[self.Index:self.Index+1] == '_' or \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.Token[self.Index:self.Index+1].isalnum():
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync raise _ExprError('')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## _StringTestParser
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncclass _StringTestParser(_ExprBase):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def __init__(self, Token):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync _ExprBase.__init__(self, Token)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## IsValidStringTest
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def IsValidStringTest(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if self.Len == 0:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return False, ST.ERR_EXPR_EMPTY
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync try:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.StringTest()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync except _ExprError, XExcept:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return False, XExcept.Error
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return True, ''
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## StringItem
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def StringItem(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Match1 = re.compile(self.QUOTED_PATTERN)\
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync .match(self.Token[self.Index:].replace('\\\\', '//')\
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync .replace('\\\"', '\\\''))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Match2 = re.compile(self.MACRO_PATTERN).match(self.Token[self.Index:])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Match3 = re.compile(self.PCD_PATTERN).match(self.Token[self.Index:])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MatchList = [Match1, Match2, Match3]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for Match in MatchList:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Match and Match.start() == 0:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not _ValidateToken(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.Token[self.Index:self.Index+Match.end()]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync raise _ExprError(ST.ERR_EXPR_STRING_ITEM % \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (self.Token, self.Token[self.Index:]))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.Index += Match.end()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Token = self.Token[self.Index - Match.end():self.Index]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Token.strip() in ["EQ", "NE"]:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync raise _ExprError(ST.ERR_EXPR_STRING_ITEM % \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (self.Token, self.Token[self.Index:]))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync raise _ExprError(ST.ERR_EXPR_STRING_ITEM % \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (self.Token, self.Token[self.Index:]))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## StringTest
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def StringTest(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.StringItem()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not self.IsCurrentOp(["==", "EQ", "!=", "NE"]):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync raise _ExprError(ST.ERR_EXPR_EQUALITY % \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (self.Token, self.Token[self.Index:]))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.StringItem()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if self.Index != self.Len:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync raise _ExprError(ST.ERR_EXPR_BOOLEAN % \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (self.Token[self.Index:], self.Token))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync##
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Check syntax of logical expression
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param Token: expression token
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef IsValidLogicalExpr(Token, Flag=False):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Not do the check right now, keep the implementation for future enhancement.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not Flag:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return True, ""
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return _LogicalExpressionParser(Token).IsValidLogicalExpression()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync##
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Check syntax of string test
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param Token: string test token
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef IsValidStringTest(Token, Flag=False):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Not do the check right now, keep the implementation for future enhancement.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not Flag:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return True, ""
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return _StringTestParser(Token).IsValidStringTest()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync##
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Check syntax of range expression
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param Token: range expression token
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef IsValidRangeExpr(Token):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return _ValidRangeExpressionParser(Token).IsValidRangeExpression()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync##
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Check whether the feature flag expression is valid or not
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param Token: feature flag expression
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef IsValidFeatureFlagExp(Token, Flag=False):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Not do the check right now, keep the implementation for future enhancement.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not Flag:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return True, "", Token
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Token in ['TRUE', 'FALSE', 'true', 'false', 'True', 'False',
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync '0x1', '0x01', '0x0', '0x00']:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return True, ""
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Valid, Cause = IsValidStringTest(Token, Flag)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not Valid:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Valid, Cause = IsValidLogicalExpr(Token, Flag)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not Valid:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return False, Cause
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return True, ""
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncif __name__ == '__main__':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync print _LogicalExpressionParser('a ^ b > a + b').IsValidLogicalExpression()