diff options
Diffstat (limited to 'Parser/spark.py')
| -rw-r--r-- | Parser/spark.py | 86 |
1 files changed, 48 insertions, 38 deletions
diff --git a/Parser/spark.py b/Parser/spark.py index b064d62..88c1a89 100644 --- a/Parser/spark.py +++ b/Parser/spark.py @@ -22,7 +22,18 @@ __version__ = 'SPARK-0.7 (pre-alpha-5)' import re -import string + +# Compatibility with older pythons. +def output(string='', end='\n'): + sys.stdout.write(string + end) + +try: + sorted +except NameError: + def sorted(seq): + seq2 = seq[:] + seq2.sort() + return seq2 def _namelist(instance): namelist, namedict, classlist = [], {}, [instance.__class__] @@ -30,7 +41,7 @@ def _namelist(instance): for b in c.__bases__: classlist.append(b) for name in c.__dict__.keys(): - if not namedict.has_key(name): + if name not in namedict: namelist.append(name) namedict[name] = 1 return namelist @@ -56,10 +67,10 @@ class GenericScanner: rv.append(self.makeRE(name)) rv.append(self.makeRE('t_default')) - return string.join(rv, '|') + return '|'.join(rv) def error(self, s, pos): - print "Lexical error at position %s" % pos + output("Lexical error at position %s" % pos) raise SystemExit def tokenize(self, s): @@ -72,13 +83,13 @@ class GenericScanner: groups = m.groups() for i in range(len(groups)): - if groups[i] and self.index2func.has_key(i): + if groups[i] and i in self.index2func: self.index2func[i](groups[i]) pos = m.end() def t_default(self, s): r'( . | \n )+' - print "Specification error: unmatched input" + output("Specification error: unmatched input") raise SystemExit # @@ -140,7 +151,7 @@ class GenericParser: for k, v in self.edges.items(): if v is None: state, sym = k - if self.states.has_key(state): + if state in self.states: self.goto(state, sym) changes = 1 rv = self.__dict__.copy() @@ -171,7 +182,7 @@ class GenericParser: def addRule(self, doc, func, _preprocess=1): fn = func - rules = string.split(doc) + rules = doc.split() index = [] for i in range(len(rules)): @@ -187,7 +198,7 @@ class GenericParser: if _preprocess: rule, fn = self.preprocess(rule, func) - if self.rules.has_key(lhs): + if lhs in self.rules: self.rules[lhs].append(rule) else: self.rules[lhs] = [ rule ] @@ -225,7 +236,7 @@ class GenericParser: # grammars. # for sym in rhs: - if not self.rules.has_key(sym): + if sym not in self.rules: break else: tbd.append(rule) @@ -268,7 +279,7 @@ class GenericParser: n = len(rhs) while i < n: sym = rhs[i] - if not self.rules.has_key(sym) or \ + if sym not in self.rules or \ not self.nullable[sym]: candidate = 0 i = i + 1 @@ -285,7 +296,7 @@ class GenericParser: if candidate: lhs = self._NULLABLE+lhs rule = (lhs, rhs) - if self.newrules.has_key(lhs): + if lhs in self.newrules: self.newrules[lhs].append(rule) else: self.newrules[lhs] = [ rule ] @@ -295,7 +306,7 @@ class GenericParser: return None def error(self, token): - print "Syntax error at or near `%s' token" % token + output("Syntax error at or near `%s' token" % token) raise SystemExit def parse(self, tokens): @@ -312,7 +323,7 @@ class GenericParser: self.states = { 0: self.makeState0() } self.makeState(0, self._BOF) - for i in xrange(len(tokens)): + for i in range(len(tokens)): sets.append([]) if sets[i] == []: @@ -341,10 +352,10 @@ class GenericParser: # return self._NULLABLE == sym[0:len(self._NULLABLE)] - def skip(self, (lhs, rhs), pos=0): - n = len(rhs) + def skip(self, hs, pos=0): + n = len(hs[1]) while pos < n: - if not self.isnullable(rhs[pos]): + if not self.isnullable(hs[1][pos]): break pos = pos + 1 return pos @@ -364,7 +375,7 @@ class GenericParser: core.sort() tcore = tuple(core) - if self.cores.has_key(tcore): + if tcore in self.cores: return self.cores[tcore] # # Nope, doesn't exist. Compute it and the associated @@ -388,13 +399,13 @@ class GenericParser: nextSym = rhs[pos] key = (X.stateno, nextSym) - if not rules.has_key(nextSym): - if not edges.has_key(key): + if nextSym not in rules: + if key not in edges: edges[key] = None X.T.append(nextSym) else: edges[key] = None - if not predicted.has_key(nextSym): + if nextSym not in predicted: predicted[nextSym] = 1 for prule in rules[nextSym]: ppos = self.skip(prule) @@ -418,10 +429,9 @@ class GenericParser: # need to know the entire set of predicted nonterminals # to do this without accidentally duplicating states. # - core = predicted.keys() - core.sort() + core = sorted(predicted.keys()) tcore = tuple(core) - if self.cores.has_key(tcore): + if tcore in self.cores: self.edges[(k, None)] = self.cores[tcore] return k @@ -432,7 +442,7 @@ class GenericParser: def goto(self, state, sym): key = (state, sym) - if not self.edges.has_key(key): + if key not in self.edges: # # No transitions from state on sym. # @@ -604,7 +614,7 @@ class GenericParser: rule = self.ambiguity(self.newrules[nt]) else: rule = self.newrules[nt][0] - #print rule + #output(rule) rhs = rule[1] attr = [None] * len(rhs) @@ -623,14 +633,14 @@ class GenericParser: rule = choices[0] if len(choices) > 1: rule = self.ambiguity(choices) - #print rule + #output(rule) rhs = rule[1] attr = [None] * len(rhs) for i in range(len(rhs)-1, -1, -1): sym = rhs[i] - if not self.newrules.has_key(sym): + if sym not in self.newrules: if sym != self._BOF: attr[i] = tokens[k-1] key = (item, k) @@ -660,7 +670,7 @@ class GenericParser: sortlist.append((len(rhs), name)) name2index[name] = i sortlist.sort() - list = map(lambda (a,b): b, sortlist) + list = [b for a, b in sortlist] return rules[name2index[self.resolve(list)]] def resolve(self, list): @@ -825,15 +835,15 @@ class GenericASTMatcher(GenericParser): def _dump(tokens, sets, states): for i in range(len(sets)): - print 'set', i + output('set %d' % i) for item in sets[i]: - print '\t', item + output('\t', item) for (lhs, rhs), pos in states[item[0]].items: - print '\t\t', lhs, '::=', - print string.join(rhs[:pos]), - print '.', - print string.join(rhs[pos:]) + output('\t\t', lhs, '::=', end='') + output(' '.join(rhs[:pos]), end='') + output('.', end='') + output(' '.join(rhs[pos:])) if i < len(tokens): - print - print 'token', str(tokens[i]) - print + output() + output('token %s' % str(tokens[i])) + output() |
