summaryrefslogtreecommitdiffstats
path: root/Parser/spark.py
diff options
context:
space:
mode:
Diffstat (limited to 'Parser/spark.py')
-rw-r--r--Parser/spark.py86
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()