+class CLogicalExpression:\r
+ def __init__(self):\r
+ self.index = 0\r
+ self.string = ''\r
+\r
+ def errExit(self, err = ''):\r
+ print "ERROR: Express parsing for:"\r
+ print " %s" % self.string\r
+ print " %s^" % (' ' * self.index)\r
+ if err:\r
+ print "INFO : %s" % err\r
+ raise SystemExit\r
+\r
+ def getNonNumber (self, n1, n2):\r
+ if not n1.isdigit():\r
+ return n1\r
+ if not n2.isdigit():\r
+ return n2\r
+ return None\r
+\r
+ def getCurr(self, lens = 1):\r
+ try:\r
+ if lens == -1:\r
+ return self.string[self.index :]\r
+ else:\r
+ if self.index + lens > len(self.string):\r
+ lens = len(self.string) - self.index\r
+ return self.string[self.index : self.index + lens]\r
+ except Exception:\r
+ return ''\r
+\r
+ def isLast(self):\r
+ return self.index == len(self.string)\r
+\r
+ def moveNext(self, len = 1):\r
+ self.index += len\r
+\r
+ def skipSpace(self):\r
+ while not self.isLast():\r
+ if self.getCurr() in ' \t':\r
+ self.moveNext()\r
+ else:\r
+ return\r
+\r
+ def normNumber (self, val):\r
+ return True if val else False\r
+\r
+ def getNumber(self, var):\r
+ var = var.strip()\r
+ if re.match('^0x[a-fA-F0-9]+$', var):\r
+ value = int(var, 16)\r
+ elif re.match('^[+-]?\d+$', var):\r
+ value = int(var, 10)\r
+ else:\r
+ value = None\r
+ return value\r
+\r
+ def parseValue(self):\r
+ self.skipSpace()\r
+ var = ''\r
+ while not self.isLast():\r
+ char = self.getCurr()\r
+ if re.match('^[\w.]', char):\r
+ var += char\r
+ self.moveNext()\r
+ else:\r
+ break\r
+ val = self.getNumber(var)\r
+ if val is None:\r
+ value = var\r
+ else:\r
+ value = "%d" % val\r
+ return value\r
+\r
+ def parseSingleOp(self):\r
+ self.skipSpace()\r
+ if re.match('^NOT\W', self.getCurr(-1)):\r
+ self.moveNext(3)\r
+ op = self.parseBrace()\r
+ val = self.getNumber (op)\r
+ if val is None:\r
+ self.errExit ("'%s' is not a number" % op)\r
+ return "%d" % (not self.normNumber(int(op)))\r
+ else:\r
+ return self.parseValue()\r
+\r
+ def parseBrace(self):\r
+ self.skipSpace()\r
+ char = self.getCurr()\r
+ if char == '(':\r
+ self.moveNext()\r
+ value = self.parseExpr()\r
+ self.skipSpace()\r
+ if self.getCurr() != ')':\r
+ self.errExit ("Expecting closing brace or operator")\r
+ self.moveNext()\r
+ return value\r
+ else:\r
+ value = self.parseSingleOp()\r
+ return value\r
+\r
+ def parseCompare(self):\r
+ value = self.parseBrace()\r
+ while True:\r
+ self.skipSpace()\r
+ char = self.getCurr()\r
+ if char in ['<', '>']:\r
+ self.moveNext()\r
+ next = self.getCurr()\r
+ if next == '=':\r
+ op = char + next\r
+ self.moveNext()\r
+ else:\r
+ op = char\r
+ result = self.parseBrace()\r
+ test = self.getNonNumber(result, value)\r
+ if test is None:\r
+ value = "%d" % self.normNumber(eval (value + op + result))\r
+ else:\r
+ self.errExit ("'%s' is not a valid number for comparision" % test)\r
+ elif char in ['=', '!']:\r
+ op = self.getCurr(2)\r
+ if op in ['==', '!=']:\r
+ self.moveNext(2)\r
+ result = self.parseBrace()\r
+ test = self.getNonNumber(result, value)\r
+ if test is None:\r
+ value = "%d" % self.normNumber((eval (value + op + result)))\r
+ else:\r
+ value = "%d" % self.normNumber(eval ("'" + value + "'" + op + "'" + result + "'"))\r
+ else:\r
+ break\r
+ else:\r
+ break\r
+ return value\r
+\r
+ def parseAnd(self):\r
+ value = self.parseCompare()\r
+ while True:\r
+ self.skipSpace()\r
+ if re.match('^AND\W', self.getCurr(-1)):\r
+ self.moveNext(3)\r
+ result = self.parseCompare()\r
+ test = self.getNonNumber(result, value)\r
+ if test is None:\r
+ value = "%d" % self.normNumber(int(value) & int(result))\r
+ else:\r
+ self.errExit ("'%s' is not a valid op number for AND" % test)\r
+ else:\r
+ break\r
+ return value\r
+\r
+ def parseOrXor(self):\r
+ value = self.parseAnd()\r
+ op = None\r
+ while True:\r
+ self.skipSpace()\r
+ op = None\r
+ if re.match('^XOR\W', self.getCurr(-1)):\r
+ self.moveNext(3)\r
+ op = '^'\r
+ elif re.match('^OR\W', self.getCurr(-1)):\r
+ self.moveNext(2)\r
+ op = '|'\r
+ else:\r
+ break\r
+ if op:\r
+ result = self.parseAnd()\r
+ test = self.getNonNumber(result, value)\r
+ if test is None:\r
+ value = "%d" % self.normNumber(eval (value + op + result))\r
+ else:\r
+ self.errExit ("'%s' is not a valid op number for XOR/OR" % test)\r
+ return value\r
+\r
+ def parseExpr(self):\r
+ return self.parseOrXor()\r
+\r
+ def getResult(self):\r
+ value = self.parseExpr()\r
+ self.skipSpace()\r
+ if not self.isLast():\r
+ self.errExit ("Unexpected character found '%s'" % self.getCurr())\r
+ test = self.getNumber(value)\r
+ if test is None:\r
+ self.errExit ("Result '%s' is not a number" % value)\r
+ return int(value)\r
+\r
+ def evaluateExpress (self, Expr):\r
+ self.index = 0\r
+ self.string = Expr\r
+ if self.getResult():\r
+ Result = True\r
+ else:\r
+ Result = False\r
+ return Result\r
+\r