| 1062 | |
| 1063 | |
| 1064 | class Operation(Expression): |
| 1065 | |
| 1066 | def __init__(self, left, op, right): |
| 1067 | self.left = left |
| 1068 | self.op = op |
| 1069 | self.right = right |
| 1070 | |
| 1071 | def Evaluate(self, env, defs): |
| 1072 | if self.op == '||' or self.op == ',': |
| 1073 | return self.left.Evaluate(env, defs) or self.right.Evaluate(env, defs) |
| 1074 | elif self.op == 'if': |
| 1075 | return False |
| 1076 | elif self.op == '!=': |
| 1077 | inter = self.left.GetOutcomes(env, defs) != self.right.GetOutcomes(env, defs) |
| 1078 | return bool(inter) |
| 1079 | elif self.op == '==': |
| 1080 | inter = self.left.GetOutcomes(env, defs) & self.right.GetOutcomes(env, defs) |
| 1081 | return bool(inter) |
| 1082 | else: |
| 1083 | assert self.op == '&&' |
| 1084 | return self.left.Evaluate(env, defs) and self.right.Evaluate(env, defs) |
| 1085 | |
| 1086 | def GetOutcomes(self, env, defs): |
| 1087 | if self.op == '||' or self.op == ',': |
| 1088 | return self.left.GetOutcomes(env, defs) | self.right.GetOutcomes(env, defs) |
| 1089 | elif self.op == 'if': |
| 1090 | if self.right.Evaluate(env, defs): |
| 1091 | return self.left.GetOutcomes(env, defs) |
| 1092 | else: |
| 1093 | return set() |
| 1094 | else: |
| 1095 | assert self.op == '&&' |
| 1096 | return self.left.GetOutcomes(env, defs) & self.right.GetOutcomes(env, defs) |
| 1097 | |
| 1098 | |
| 1099 | def IsAlpha(str): |
no outgoing calls
searching dependent graphs…