A simple string tokenizer that chops expressions into variables, parens and operators
| 1104 | |
| 1105 | |
| 1106 | class Tokenizer(object): |
| 1107 | """A simple string tokenizer that chops expressions into variables, |
| 1108 | parens and operators""" |
| 1109 | |
| 1110 | def __init__(self, expr): |
| 1111 | self.index = 0 |
| 1112 | self.expr = expr |
| 1113 | self.length = len(expr) |
| 1114 | self.tokens = None |
| 1115 | |
| 1116 | def Current(self, length = 1): |
| 1117 | if not self.HasMore(length): return "" |
| 1118 | return self.expr[self.index:self.index+length] |
| 1119 | |
| 1120 | def HasMore(self, length = 1): |
| 1121 | return self.index < self.length + (length - 1) |
| 1122 | |
| 1123 | def Advance(self, count = 1): |
| 1124 | self.index = self.index + count |
| 1125 | |
| 1126 | def AddToken(self, token): |
| 1127 | self.tokens.append(token) |
| 1128 | |
| 1129 | def SkipSpaces(self): |
| 1130 | while self.HasMore() and self.Current().isspace(): |
| 1131 | self.Advance() |
| 1132 | |
| 1133 | def Tokenize(self): |
| 1134 | self.tokens = [ ] |
| 1135 | while self.HasMore(): |
| 1136 | self.SkipSpaces() |
| 1137 | if not self.HasMore(): |
| 1138 | return None |
| 1139 | if self.Current() == '(': |
| 1140 | self.AddToken('(') |
| 1141 | self.Advance() |
| 1142 | elif self.Current() == ')': |
| 1143 | self.AddToken(')') |
| 1144 | self.Advance() |
| 1145 | elif self.Current() == '$': |
| 1146 | self.AddToken('$') |
| 1147 | self.Advance() |
| 1148 | elif self.Current() == ',': |
| 1149 | self.AddToken(',') |
| 1150 | self.Advance() |
| 1151 | elif IsAlpha(self.Current()): |
| 1152 | buf = "" |
| 1153 | while self.HasMore() and IsAlpha(self.Current()): |
| 1154 | buf += self.Current() |
| 1155 | self.Advance() |
| 1156 | self.AddToken(buf) |
| 1157 | elif self.Current(2) == '&&': |
| 1158 | self.AddToken('&&') |
| 1159 | self.Advance(2) |
| 1160 | elif self.Current(2) == '||': |
| 1161 | self.AddToken('||') |
| 1162 | self.Advance(2) |
| 1163 | elif self.Current(2) == '==': |
no outgoing calls
searching dependent graphs…