[Pydev-cvs] org.python.pydev.parser/src/org/python/pydev/parser/jython/ast Dict.java,NONE,1.1 Ellips
Brought to you by:
fabioz
Update of /cvsroot/pydev/org.python.pydev.parser/src/org/python/pydev/parser/jython/ast In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12282/src/org/python/pydev/parser/jython/ast Added Files: Dict.java Ellipsis.java FunctionDef.java VisitorIF.java spark.py Print.java expr_contextType.java NameTok.java modType.java List.java ListComp.java Attribute.java decoratorsType.java Exec.java NameTokType.java Raise.java Slice.java Global.java Interactive.java operatorType.java str_repType.java package.html Continue.java Tuple.java AugAssign.java Call.java Module.java Index.java asdl.py listcompType.java Import.java Num.java stmtType.java Assign.java Lambda.java comprehensionType.java Name.java While.java Break.java argumentsType.java Suite.java suiteType.java sliceType.java Repr.java BinOp.java StrJoin.java asdl_java.py For.java aliasType.java Compare.java exprType.java Yield.java .cvsignore str_typeType.java Str.java Assert.java Return.java keywordType.java Comprehension.java Subscript.java BoolOp.java ImportFrom.java commentType.java Expression.java TryExcept.java unaryopType.java Python.asdl Expr.java UnaryOp.java boolopType.java VisitorBase.java cmpopType.java name_contextType.java ClassDef.java Pass.java TryFinally.java Delete.java ExtSlice.java excepthandlerType.java If.java GeneratorExp.java Log Message: --- NEW FILE: asdl.py --- """An implementation of the Zephyr Abstract Syntax Definition Language. See http://asdl.sourceforge.net/ and http://www.cs.princeton.edu/~danwang/Papers/dsl97/dsl97-abstract.html. Only supports top level module decl, not view. I'm guessing that view is intended to support the browser and I'm not interested in the browser. """ #__metaclass__ = type import os import traceback import spark class Token: # spark seems to dispatch in the parser based on a token's # type attribute def __init__(self, type, lineno): self.type = type self.lineno = lineno def __str__(self): return self.type def __repr__(self): return str(self) class Id(Token): def __init__(self, value, lineno): self.type = 'Id' self.value = value self.lineno = lineno def __str__(self): return self.value class ASDLSyntaxError: def __init__(self, lineno, token=None, msg=None): self.lineno = lineno self.token = token self.msg = msg def __str__(self): if self.msg is None: return "Error at '%s', line %d" % (self.token, self.lineno) else: return "%s, line %d" % (self.msg, self.lineno) class ASDLScanner(spark.GenericScanner, object): def tokenize(self, input): self.rv = [] self.lineno = 1 super(ASDLScanner, self).tokenize(input) return self.rv def t_id(self, s): r"[\w\.]+" # XXX doesn't distinguish upper vs. lower, which is # significant for ASDL. self.rv.append(Id(s, self.lineno)) def t_xxx(self, s): # not sure what this production means r"<=" self.rv.append(Token(s, self.lineno)) def t_punctuation(self, s): r"[\{\}\*\=\|\(\)\,\?\:]" self.rv.append(Token(s, self.lineno)) def t_comment(self, s): r"\-\-[^\n]*" pass def t_newline(self, s): r"\n" self.lineno += 1 def t_whitespace(self, s): r"[ \t]+" pass def t_default(self, s): r" . +" raise ValueError, "unmatched input: %s" % `s` class ASDLParser(spark.GenericParser, object): def __init__(self): super(ASDLParser, self).__init__("module") def typestring(self, tok): return tok.type def error(self, tok): raise ASDLSyntaxError(tok.lineno, tok) def p_module_0(self, (module, name, _0, _1)): " module ::= Id Id { } " if module.value != "module": raise ASDLSyntaxError(module.lineno, msg="expected 'module', found %s" % module) return Module(name, None) def p_module(self, (module, name, _0, definitions, _1)): " module ::= Id Id { definitions } " if module.value != "module": raise ASDLSyntaxError(module.lineno, msg="expected 'module', found %s" % module) return Module(name, definitions) def p_definition_0(self, (definition,)): " definitions ::= definition " return definition def p_definition_1(self, (definitions, definition)): " definitions ::= definition definitions " return definitions + definition def p_definition(self, (id, _, type)): " definition ::= Id = type " return [Type(id, type)] def p_type_0(self, (product,)): " type ::= product " return product def p_type_1(self, (sum,)): " type ::= sum " return Sum(sum) def p_type_2(self, (sum, id, _0, attributes, _1)): " type ::= sum Id ( fields ) " if id.value != "attributes": raise ASDLSyntaxError(id.lineno, msg="expected attributes, found %s" % id) return Sum(sum, attributes) def p_product(self, (_0, fields, _1)): " product ::= ( fields ) " # XXX can't I just construct things in the right order? fields.reverse() return Product(fields) def p_sum_0(self, (constructor,)): " sum ::= constructor """ return [constructor] def p_sum_1(self, (constructor, _, sum)): " sum ::= constructor | sum " return [constructor] + sum def p_sum_2(self, (constructor, _, sum)): " sum ::= constructor | sum " return [constructor] + sum def p_constructor_0(self, (id,)): " constructor ::= Id " return Constructor(id) def p_constructor_1(self, (id, _0, fields, _1)): " constructor ::= Id ( fields ) " # XXX can't I just construct things in the right order? fields.reverse() return Constructor(id, fields) def p_fields_0(self, (field,)): " fields ::= field " return [field] def p_fields_1(self, (field, _, fields)): " fields ::= field , fields " return fields + [field] def p_field_0(self, (type,)): " field ::= Id " return Field(type) def p_field_1(self, (type, name)): " field ::= Id Id " return Field(type, name) def p_field_2(self, (type, _, name)): " field ::= Id * Id " return Field(type, name, seq=1) def p_field_3(self, (type, _, name)): " field ::= Id ? Id " return Field(type, name, opt=1) def p_field_4(self, (type, _)): " field ::= Id * " return Field(type, seq=1) def p_field_5(self, (type, _)): " field ::= Id ? " return Field(type, opt=1) builtin_types = ("identifier", "string", "int", "bool", "object") # below is a collection of classes to capture the AST of an AST :-) # not sure if any of the methods are useful yet, but I'm adding them # piecemeal as they seem helpful class AST: pass # a marker class class Module(AST): def __init__(self, name, dfns): self.name = name self.dfns = dfns self.types = {} # maps type name to value (from dfns) for type in dfns: self.types[type.name.value] = type.value def __repr__(self): return "Module(%s, %s)" % (self.name, self.dfns) class Type(AST): def __init__(self, name, value): self.name = name self.value = value def __repr__(self): return "Type(%s, %s)" % (self.name, self.value) class Constructor(AST): def __init__(self, name, fields=None): self.name = name self.fields = fields or [] def __repr__(self): return "Constructor(%s, %s)" % (self.name, self.fields) class Field(AST): def __init__(self, type, name=None, seq=0, opt=0): self.type = type self.name = name self.seq = seq self.opt = opt def __repr__(self): if self.seq: extra = ", seq=1" elif self.opt: extra = ", opt=1" else: extra = "" if self.name is None: return "Field(%s%s)" % (self.type, extra) else: return "Field(%s, %s,%s)" % (self.type, self.name, extra) class Sum(AST): def __init__(self, types, attributes=None): self.types = types self.attributes = attributes or [] def __repr__(self): if self.attributes is None: return "Sum(%s)" % self.types else: return "Sum(%s, %s)" % (self.types, self.attributes) class Product(AST): def __init__(self, fields): self.fields = fields def __repr__(self): return "Product(%s)" % self.fields class VisitorBase(object): def __init__(self, skip=0): self.cache = {} self.skip = skip def visit(self, object, *args): meth = self._dispatch(object) if meth is None: return try: meth(object, *args) except Exception, err: print "Error visiting", repr(object) print err traceback.print_exc() # XXX hack if hasattr(self, 'file'): self.file.flush() os._exit(1) def _dispatch(self, object): assert isinstance(object, AST), repr(object) klass = object.__class__ meth = self.cache.get(klass) if meth is None: methname = "visit" + klass.__name__ if self.skip: meth = getattr(self, methname, None) else: meth = getattr(self, methname) self.cache[klass] = meth return meth class Check(VisitorBase): def __init__(self): super(Check, self).__init__(skip=1) self.cons = {} self.errors = 0 self.types = {} def visitModule(self, mod): for dfn in mod.dfns: self.visit(dfn) def visitType(self, type): self.visit(type.value, str(type.name)) def visitSum(self, sum, name): for t in sum.types: self.visit(t, name) def visitConstructor(self, cons, name): key = str(cons.name) conflict = self.cons.get(key) if conflict is None: self.cons[key] = name else: print "Redefinition of constructor %s" % key print "Defined in %s and %s" % (conflict, name) self.errors += 1 for f in cons.fields: self.visit(f, key) def visitField(self, field, name): key = str(field.type) l = self.types.setdefault(key, []) l.append(name) def visitProduct(self, prod, name): for f in prod.fields: self.visit(f, name) def check(mod): v = Check() v.visit(mod) for t in v.types: if not mod.types.has_key(t) and not t in builtin_types: v.errors += 1 uses = ", ".join(v.types[t]) print "Undefined type %s, used in %s" % (t, uses) return not v.errors def parse(file): scanner = ASDLScanner() parser = ASDLParser() buf = open(file).read() tokens = scanner.tokenize(buf) try: return parser.parse(tokens) except ASDLSyntaxError, err: print err lines = buf.split("\n") print lines[err.lineno - 1] # lines starts at 0, files at 1 if __name__ == "__main__": import glob import sys if len(sys.argv) > 1: files = sys.argv[1:] else: testdir = "tests" files = glob.glob(testdir + "/*.asdl") for file in files: print file mod = parse(file) print "module", mod.name print len(mod.dfns), "definitions" if not check(mod): print "Check failed" else: for dfn in mod.dfns: print dfn.type --- NEW FILE: .cvsignore --- *.pyc --- NEW FILE: NameTokType.java --- // Autogenerated AST node package org.python.pydev.parser.jython.ast; import org.python.pydev.parser.jython.SimpleNode; public abstract class NameTokType extends SimpleNode { } --- NEW FILE: AugAssign.java --- // Autogenerated AST node package org.python.pydev.parser.jython.ast; import org.python.pydev.parser.jython.SimpleNode; import java.io.DataOutputStream; import java.io.IOException; public class AugAssign extends stmtType implements operatorType { public exprType target; public int op; public exprType value; public AugAssign(exprType target, int op, exprType value) { this.target = target; this.op = op; this.value = value; } public AugAssign(exprType target, int op, exprType value, SimpleNode parent) { this(target, op, value); this.beginLine = parent.beginLine; this.beginColumn = parent.beginColumn; } public String toString() { StringBuffer sb = new StringBuffer("AugAssign["); sb.append("target="); sb.append(dumpThis(this.target)); sb.append(", "); sb.append("op="); sb.append(dumpThis(this.op, operatorType.operatorTypeNames)); sb.append(", "); sb.append("value="); sb.append(dumpThis(this.value)); sb.append("]"); return sb.toString(); } public void pickle(DataOutputStream ostream) throws IOException { pickleThis(13, ostream); pickleThis(this.target, ostream); pickleThis(this.op, ostream); pickleThis(this.value, ostream); } public Object accept(VisitorIF visitor) throws Exception { return visitor.visitAugAssign(this); } public void traverse(VisitorIF visitor) throws Exception { if (target != null) target.accept(visitor); if (value != null) value.accept(visitor); } } --- NEW FILE: Dict.java --- // Autogenerated AST node package org.python.pydev.parser.jython.ast; import org.python.pydev.parser.jython.SimpleNode; import java.io.DataOutputStream; import java.io.IOException; public class Dict extends exprType { public exprType[] keys; public exprType[] values; public Dict(exprType[] keys, exprType[] values) { this.keys = keys; this.values = values; } public Dict(exprType[] keys, exprType[] values, SimpleNode parent) { this(keys, values); this.beginLine = parent.beginLine; this.beginColumn = parent.beginColumn; } public String toString() { StringBuffer sb = new StringBuffer("Dict["); sb.append("keys="); sb.append(dumpThis(this.keys)); sb.append(", "); sb.append("values="); sb.append(dumpThis(this.values)); sb.append("]"); return sb.toString(); } public void pickle(DataOutputStream ostream) throws IOException { pickleThis(34, ostream); pickleThis(this.keys, ostream); pickleThis(this.values, ostream); } public Object accept(VisitorIF visitor) throws Exception { return visitor.visitDict(this); } public void traverse(VisitorIF visitor) throws Exception { if (keys != null) { for (int i = 0; i < keys.length; i++) { if (keys[i] != null) keys[i].accept(visitor); } } if (values != null) { for (int i = 0; i < values.length; i++) { if (values[i] != null) values[i].accept(visitor); } } } } --- NEW FILE: argumentsType.java --- // Autogenerated AST node package org.python.pydev.parser.jython.ast; import org.python.pydev.parser.jython.SimpleNode; import java.io.DataOutputStream; import java.io.IOException; public class argumentsType extends SimpleNode { public exprType[] args; public NameTokType vararg; public NameTokType kwarg; public exprType[] defaults; public argumentsType(exprType[] args, NameTokType vararg, NameTokType kwarg, exprType[] defaults) { this.args = args; this.vararg = vararg; this.kwarg = kwarg; this.defaults = defaults; } public argumentsType(exprType[] args, NameTokType vararg, NameTokType kwarg, exprType[] defaults, SimpleNode parent) { this(args, vararg, kwarg, defaults); this.beginLine = parent.beginLine; this.beginColumn = parent.beginColumn; } public String toString() { StringBuffer sb = new StringBuffer("arguments["); sb.append("args="); sb.append(dumpThis(this.args)); sb.append(", "); sb.append("vararg="); sb.append(dumpThis(this.vararg)); sb.append(", "); sb.append("kwarg="); sb.append(dumpThis(this.kwarg)); sb.append(", "); sb.append("defaults="); sb.append(dumpThis(this.defaults)); sb.append("]"); return sb.toString(); } public void pickle(DataOutputStream ostream) throws IOException { pickleThis(54, ostream); pickleThis(this.args, ostream); pickleThis(this.vararg, ostream); pickleThis(this.kwarg, ostream); pickleThis(this.defaults, ostream); } public Object accept(VisitorIF visitor) throws Exception { traverse(visitor); return null; } public void traverse(VisitorIF visitor) throws Exception { if (args != null) { for (int i = 0; i < args.length; i++) { if (args[i] != null) args[i].accept(visitor); } } if (vararg != null) vararg.accept(visitor); if (kwarg != null) kwarg.accept(visitor); if (defaults != null) { for (int i = 0; i < defaults.length; i++) { if (defaults[i] != null) defaults[i].accept(visitor); } } } } --- NEW FILE: spark.py --- # Copyright (c) 1998-2002 John Aycock # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. __version__ = 'SPARK-0.7 (pre-alpha-5)' import re import sys import string def _namelist(instance): namelist, namedict, classlist = [], {}, [instance.__class__] for c in classlist: for b in c.__bases__: classlist.append(b) for name in c.__dict__.keys(): if not namedict.has_key(name): namelist.append(name) namedict[name] = 1 return namelist class GenericScanner: def __init__(self, flags=0): pattern = self.reflect() self.re = re.compile(pattern, re.VERBOSE|flags) self.index2func = {} for name, number in self.re.groupindex.items(): self.index2func[number-1] = getattr(self, 't_' + name) def makeRE(self, name): doc = getattr(self, name).__doc__ rv = '(?P<%s>%s)' % (name[2:], doc) return rv def reflect(self): rv = [] for name in _namelist(self): if name[:2] == 't_' and name != 't_default': rv.append(self.makeRE(name)) rv.append(self.makeRE('t_default')) return string.join(rv, '|') def error(self, s, pos): print "Lexical error at position %s" % pos raise SystemExit def tokenize(self, s): pos = 0 n = len(s) while pos < n: m = self.re.match(s, pos) if m is None: self.error(s, pos) groups = m.groups() for i in range(len(groups)): if groups[i] and self.index2func.has_key(i): self.index2func[i](groups[i]) pos = m.end() def t_default(self, s): r'( . | \n )+' print "Specification error: unmatched input" raise SystemExit # # Extracted from GenericParser and made global so that [un]picking works. # class _State: def __init__(self, stateno, items): self.T, self.complete, self.items = [], [], items self.stateno = stateno class GenericParser: # # An Earley parser, as per J. Earley, "An Efficient Context-Free # Parsing Algorithm", CACM 13(2), pp. 94-102. Also J. C. Earley, # "An Efficient Context-Free Parsing Algorithm", Ph.D. thesis, # Carnegie-Mellon University, August 1968. New formulation of # the parser according to J. Aycock, "Practical Earley Parsing # and the SPARK Toolkit", Ph.D. thesis, University of Victoria, # 2001, and J. Aycock and R. N. Horspool, "Practical Earley # Parsing", unpublished paper, 2001. # def __init__(self, start): self.rules = {} self.rule2func = {} self.rule2name = {} self.collectRules() self.augment(start) self.ruleschanged = 1 _NULLABLE = '\e_' _START = 'START' _BOF = '|-' # # When pickling, take the time to generate the full state machine; # some information is then extraneous, too. Unfortunately we # can't save the rule2func map. # def __getstate__(self): if self.ruleschanged: # # XXX - duplicated from parse() # self.computeNull() self.newrules = {} self.new2old = {} self.makeNewRules() self.ruleschanged = 0 self.edges, self.cores = {}, {} self.states = { 0: self.makeState0() } self.makeState(0, self._BOF) # # XXX - should find a better way to do this.. # changes = 1 while changes: changes = 0 for k, v in self.edges.items(): if v is None: state, sym = k if self.states.has_key(state): self.goto(state, sym) changes = 1 rv = self.__dict__.copy() for s in self.states.values(): del s.items del rv['rule2func'] del rv['nullable'] del rv['cores'] return rv def __setstate__(self, D): self.rules = {} self.rule2func = {} self.rule2name = {} self.collectRules() start = D['rules'][self._START][0][1][1] # Blech. self.augment(start) D['rule2func'] = self.rule2func D['makeSet'] = self.makeSet_fast self.__dict__ = D # # A hook for GenericASTBuilder and GenericASTMatcher. Mess # thee not with this; nor shall thee toucheth the _preprocess # argument to addRule. # def preprocess(self, rule, func): return rule, func def addRule(self, doc, func, _preprocess=1): fn = func rules = string.split(doc) index = [] for i in range(len(rules)): if rules[i] == '::=': index.append(i-1) index.append(len(rules)) for i in range(len(index)-1): lhs = rules[index[i]] rhs = rules[index[i]+2:index[i+1]] rule = (lhs, tuple(rhs)) if _preprocess: rule, fn = self.preprocess(rule, func) if self.rules.has_key(lhs): self.rules[lhs].append(rule) else: self.rules[lhs] = [ rule ] self.rule2func[rule] = fn self.rule2name[rule] = func.__name__[2:] self.ruleschanged = 1 def collectRules(self): for name in _namelist(self): if name[:2] == 'p_': func = getattr(self, name) doc = func.__doc__ self.addRule(doc, func) def augment(self, start): rule = '%s ::= %s %s' % (self._START, self._BOF, start) self.addRule(rule, lambda args: args[1], 0) def computeNull(self): self.nullable = {} tbd = [] for rulelist in self.rules.values(): lhs = rulelist[0][0] self.nullable[lhs] = 0 for rule in rulelist: rhs = rule[1] if len(rhs) == 0: self.nullable[lhs] = 1 continue # # We only need to consider rules which # consist entirely of nonterminal symbols. # This should be a savings on typical # grammars. # for sym in rhs: if not self.rules.has_key(sym): break else: tbd.append(rule) changes = 1 while changes: changes = 0 for lhs, rhs in tbd: if self.nullable[lhs]: continue for sym in rhs: if not self.nullable[sym]: break else: self.nullable[lhs] = 1 changes = 1 def makeState0(self): s0 = _State(0, []) for rule in self.newrules[self._START]: s0.items.append((rule, 0)) return s0 def finalState(self, tokens): # # Yuck. # if len(self.newrules[self._START]) == 2 and len(tokens) == 0: return 1 start = self.rules[self._START][0][1][1] return self.goto(1, start) def makeNewRules(self): worklist = [] for rulelist in self.rules.values(): for rule in rulelist: worklist.append((rule, 0, 1, rule)) for rule, i, candidate, oldrule in worklist: lhs, rhs = rule n = len(rhs) while i < n: sym = rhs[i] if not self.rules.has_key(sym) or \ not self.nullable[sym]: candidate = 0 i = i + 1 continue newrhs = list(rhs) newrhs[i] = self._NULLABLE+sym newrule = (lhs, tuple(newrhs)) worklist.append((newrule, i+1, candidate, oldrule)) candidate = 0 i = i + 1 else: if candidate: lhs = self._NULLABLE+lhs rule = (lhs, rhs) if self.newrules.has_key(lhs): self.newrules[lhs].append(rule) else: self.newrules[lhs] = [ rule ] self.new2old[rule] = oldrule def typestring(self, token): return None def error(self, token): print "Syntax error at or near `%s' token" % token raise SystemExit def parse(self, tokens): sets = [ [(1,0), (2,0)] ] self.links = {} if self.ruleschanged: self.computeNull() self.newrules = {} self.new2old = {} self.makeNewRules() self.ruleschanged = 0 self.edges, self.cores = {}, {} self.states = { 0: self.makeState0() } self.makeState(0, self._BOF) for i in xrange(len(tokens)): sets.append([]) if sets[i] == []: break self.makeSet(tokens[i], sets, i) else: sets.append([]) self.makeSet(None, sets, len(tokens)) #_dump(tokens, sets, self.states) finalitem = (self.finalState(tokens), 0) if finalitem not in sets[-2]: if len(tokens) > 0: self.error(tokens[i-1]) else: self.error(None) return self.buildTree(self._START, finalitem, tokens, len(sets)-2) def isnullable(self, sym): # # For symbols in G_e only. If we weren't supporting 1.5, # could just use sym.startswith(). # return self._NULLABLE == sym[0:len(self._NULLABLE)] def skip(self, (lhs, rhs), pos=0): n = len(rhs) while pos < n: if not self.isnullable(rhs[pos]): break pos = pos + 1 return pos def makeState(self, state, sym): assert sym is not None # # Compute \epsilon-kernel state's core and see if # it exists already. # kitems = [] for rule, pos in self.states[state].items: lhs, rhs = rule if rhs[pos:pos+1] == (sym,): kitems.append((rule, self.skip(rule, pos+1))) core = kitems core.sort() tcore = tuple(core) if self.cores.has_key(tcore): return self.cores[tcore] # # Nope, doesn't exist. Compute it and the associated # \epsilon-nonkernel state together; we'll need it right away. # k = self.cores[tcore] = len(self.states) K, NK = _State(k, kitems), _State(k+1, []) self.states[k] = K predicted = {} edges = self.edges rules = self.newrules for X in K, NK: worklist = X.items for item in worklist: rule, pos = item lhs, rhs = rule if pos == len(rhs): X.complete.append(rule) continue nextSym = rhs[pos] key = (X.stateno, nextSym) if not rules.has_key(nextSym): if not edges.has_key(key): edges[key] = None X.T.append(nextSym) else: edges[key] = None if not predicted.has_key(nextSym): predicted[nextSym] = 1 for prule in rules[nextSym]: ppos = self.skip(prule) new = (prule, ppos) NK.items.append(new) # # Problem: we know K needs generating, but we # don't yet know about NK. Can't commit anything # regarding NK to self.edges until we're sure. Should # we delay committing on both K and NK to avoid this # hacky code? This creates other problems.. # if X is K: edges = {} if NK.items == []: return k # # Check for \epsilon-nonkernel's core. Unfortunately we # need to know the entire set of predicted nonterminals # to do this without accidentally duplicating states. # core = predicted.keys() core.sort() tcore = tuple(core) if self.cores.has_key(tcore): self.edges[(k, None)] = self.cores[tcore] return k nk = self.cores[tcore] = self.edges[(k, None)] = NK.stateno self.edges.update(edges) self.states[nk] = NK return k def goto(self, state, sym): key = (state, sym) if not self.edges.has_key(key): # # No transitions from state on sym. # return None rv = self.edges[key] if rv is None: # # Target state isn't generated yet. Remedy this. # rv = self.makeState(state, sym) self.edges[key] = rv return rv def gotoT(self, state, t): return [self.goto(state, t)] def gotoST(self, state, st): rv = [] for t in self.states[state].T: if st == t: rv.append(self.goto(state, t)) return rv def add(self, set, item, i=None, predecessor=None, causal=None): if predecessor is None: if item not in set: set.append(item) else: key = (item, i) if item not in set: self.links[key] = [] set.append(item) self.links[key].append((predecessor, causal)) def makeSet(self, token, sets, i): cur, next = sets[i], sets[i+1] ttype = token is not None and self.typestring(token) or None if ttype is not None: fn, arg = self.gotoT, ttype else: fn, arg = self.gotoST, token for item in cur: ptr = (item, i) state, parent = item add = fn(state, arg) for k in add: if k is not None: self.add(next, (k, parent), i+1, ptr) nk = self.goto(k, None) if nk is not None: self.add(next, (nk, i+1)) if parent == i: continue for rule in self.states[state].complete: lhs, rhs = rule for pitem in sets[parent]: pstate, pparent = pitem k = self.goto(pstate, lhs) if k is not None: why = (item, i, rule) pptr = (pitem, parent) self.add(cur, (k, pparent), i, pptr, why) nk = self.goto(k, None) if nk is not None: self.add(cur, (nk, i)) def makeSet_fast(self, token, sets, i): # # Call *only* when the entire state machine has been built! # It relies on self.edges being filled in completely, and # then duplicates and inlines code to boost speed at the # cost of extreme ugliness. # cur, next = sets[i], sets[i+1] ttype = token is not None and self.typestring(token) or None for item in cur: ptr = (item, i) state, parent = item if ttype is not None: k = self.edges.get((state, ttype), None) if k is not None: #self.add(next, (k, parent), i+1, ptr) #INLINED --v new = (k, parent) key = (new, i+1) if new not in next: self.links[key] = [] next.append(new) self.links[key].append((ptr, None)) #INLINED --^ #nk = self.goto(k, None) nk = self.edges.get((k, None), None) if nk is not None: #self.add(next, (nk, i+1)) #INLINED --v new = (nk, i+1) if new not in next: next.append(new) #INLINED --^ else: add = self.gotoST(state, token) for k in add: if k is not None: self.add(next, (k, parent), i+1, ptr) #nk = self.goto(k, None) nk = self.edges.get((k, None), None) if nk is not None: self.add(next, (nk, i+1)) if parent == i: continue for rule in self.states[state].complete: lhs, rhs = rule for pitem in sets[parent]: pstate, pparent = pitem #k = self.goto(pstate, lhs) k = self.edges.get((pstate, lhs), None) if k is not None: why = (item, i, rule) pptr = (pitem, parent) #self.add(cur, (k, pparent), # i, pptr, why) #INLINED --v new = (k, pparent) key = (new, i) if new not in cur: self.links[key] = [] cur.append(new) self.links[key].append((pptr, why)) #INLINED --^ #nk = self.goto(k, None) nk = self.edges.get((k, None), None) if nk is not None: #self.add(cur, (nk, i)) #INLINED --v new = (nk, i) if new not in cur: cur.append(new) #INLINED --^ def predecessor(self, key, causal): for p, c in self.links[key]: if c == causal: return p assert 0 def causal(self, key): links = self.links[key] if len(links) == 1: return links[0][1] choices = [] rule2cause = {} for p, c in links: rule = c[2] choices.append(rule) rule2cause[rule] = c return rule2cause[self.ambiguity(choices)] def deriveEpsilon(self, nt): if len(self.newrules[nt]) > 1: rule = self.ambiguity(self.newrules[nt]) else: rule = self.newrules[nt][0] #print rule rhs = rule[1] attr = [None] * len(rhs) for i in range(len(rhs)-1, -1, -1): attr[i] = self.deriveEpsilon(rhs[i]) return self.rule2func[self.new2old[rule]](attr) def buildTree(self, nt, item, tokens, k): state, parent = item choices = [] for rule in self.states[state].complete: if rule[0] == nt: choices.append(rule) rule = choices[0] if len(choices) > 1: rule = self.ambiguity(choices) #print 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 != self._BOF: attr[i] = tokens[k-1] key = (item, k) item, k = self.predecessor(key, None) #elif self.isnullable(sym): elif self._NULLABLE == sym[0:len(self._NULLABLE)]: attr[i] = self.deriveEpsilon(sym) else: key = (item, k) why = self.causal(key) attr[i] = self.buildTree(sym, why[0], tokens, why[1]) item, k = self.predecessor(key, why) return self.rule2func[self.new2old[rule]](attr) def ambiguity(self, rules): # # XXX - problem here and in collectRules() if the same rule # appears in >1 method. Also undefined results if rules # causing the ambiguity appear in the same method. # sortlist = [] name2index = {} for i in range(len(rules)): lhs, rhs = rule = rules[i] name = self.rule2name[self.new2old[rule]] sortlist.append((len(rhs), name)) name2index[name] = i sortlist.sort() list = map(lambda (a,b): b, sortlist) return rules[name2index[self.resolve(list)]] def resolve(self, list): # # Resolve ambiguity in favor of the shortest RHS. # Since we walk the tree from the top down, this # should effectively resolve in favor of a "shift". # return list[0] # # GenericASTBuilder automagically constructs a concrete/abstract syntax tree # for a given input. The extra argument is a class (not an instance!) # which supports the "__setslice__" and "__len__" methods. # # XXX - silently overrides any user code in methods. # class GenericASTBuilder(GenericParser): def __init__(self, AST, start): GenericParser.__init__(self, start) self.AST = AST def preprocess(self, rule, func): rebind = lambda lhs, self=self: \ lambda args, lhs=lhs, self=self: \ self.buildASTNode(args, lhs) lhs, rhs = rule return rule, rebind(lhs) def buildASTNode(self, args, lhs): children = [] for arg in args: if isinstance(arg, self.AST): children.append(arg) else: children.append(self.terminal(arg)) return self.nonterminal(lhs, children) def terminal(self, token): return token def nonterminal(self, type, args): rv = self.AST(type) rv[:len(args)] = args return rv # # GenericASTTraversal is a Visitor pattern according to Design Patterns. For # each node it attempts to invoke the method n_<node type>, falling # back onto the default() method if the n_* can't be found. The preorder # traversal also looks for an exit hook named n_<node type>_exit (no default # routine is called if it's not found). To prematurely halt traversal # of a subtree, call the prune() method -- this only makes sense for a # preorder traversal. Node type is determined via the typestring() method. # class GenericASTTraversalPruningException: pass class GenericASTTraversal: def __init__(self, ast): self.ast = ast def typestring(self, node): return node.type def prune(self): raise GenericASTTraversalPruningException def preorder(self, node=None): if node is None: node = self.ast try: name = 'n_' + self.typestring(node) if hasattr(self, name): func = getattr(self, name) func(node) else: self.default(node) except GenericASTTraversalPruningException: return for kid in node: self.preorder(kid) name = name + '_exit' if hasattr(self, name): func = getattr(self, name) func(node) def postorder(self, node=None): if node is None: node = self.ast for kid in node: self.postorder(kid) name = 'n_' + self.typestring(node) if hasattr(self, name): func = getattr(self, name) func(node) else: self.default(node) def default(self, node): pass # # GenericASTMatcher. AST nodes must have "__getitem__" and "__cmp__" # implemented. # # XXX - makes assumptions about how GenericParser walks the parse tree. # class GenericASTMatcher(GenericParser): def __init__(self, start, ast): GenericParser.__init__(self, start) self.ast = ast def preprocess(self, rule, func): rebind = lambda func, self=self: \ lambda args, func=func, self=self: \ self.foundMatch(args, func) lhs, rhs = rule rhslist = list(rhs) rhslist.reverse() return (lhs, tuple(rhslist)), rebind(func) def foundMatch(self, args, func): func(args[-1]) return args[-1] def match_r(self, node): self.input.insert(0, node) children = 0 for child in node: if children == 0: self.input.insert(0, '(') children = children + 1 self.match_r(child) if children > 0: self.input.insert(0, ')') def match(self, ast=None): if ast is None: ast = self.ast self.input = [] self.match_r(ast) self.parse(self.input) def resolve(self, list): # # Resolve ambiguity in favor of the longest RHS. # return list[-1] def _dump(tokens, sets, states): for i in range(len(sets)): print 'set', i for item in sets[i]: print '\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:]) if i < len(tokens): print print 'token', str(tokens[i]) print --- NEW FILE: Expression.java --- // Autogenerated AST node package org.python.pydev.parser.jython.ast; import org.python.pydev.parser.jython.SimpleNode; import java.io.DataOutputStream; import java.io.IOException; public class Expression extends modType { public exprType body; public Expression(exprType body) { this.body = body; } public Expression(exprType body, SimpleNode parent) { this(body); this.beginLine = parent.beginLine; this.beginColumn = parent.beginColumn; } public String toString() { StringBuffer sb = new StringBuffer("Expression["); sb.append("body="); sb.append(dumpThis(this.body)); sb.append("]"); return sb.toString(); } public void pickle(DataOutputStream ostream) throws IOException { pickleThis(3, ostream); pickleThis(this.body, ostream); } public Object accept(VisitorIF visitor) throws Exception { return visitor.visitExpression(this); } public void traverse(VisitorIF visitor) throws Exception { if (body != null) body.accept(visitor); } } --- NEW FILE: ListComp.java --- // Autogenerated AST node package org.python.pydev.parser.jython.ast; import org.python.pydev.parser.jython.SimpleNode; import java.io.DataOutputStream; import java.io.IOException; public class ListComp extends exprType { public exprType elt; public comprehensionType[] generators; public ListComp(exprType elt, comprehensionType[] generators) { this.elt = elt; this.generators = generators; } public ListComp(exprType elt, comprehensionType[] generators, SimpleNode parent) { this(elt, generators); this.beginLine = parent.beginLine; this.beginColumn = parent.beginColumn; } public String toString() { StringBuffer sb = new StringBuffer("ListComp["); sb.append("elt="); sb.append(dumpThis(this.elt)); sb.append(", "); sb.append("generators="); sb.append(dumpThis(this.generators)); sb.append("]"); return sb.toString(); } public void pickle(DataOutputStream ostream) throws IOException { pickleThis(35, ostream); pickleThis(this.elt, ostream); pickleThis(this.generators, ostream); } public Object accept(VisitorIF visitor) throws Exception { return visitor.visitListComp(this); } public void traverse(VisitorIF visitor) throws Exception { if (elt != null) elt.accept(visitor); if (generators != null) { for (int i = 0; i < generators.length; i++) { if (generators[i] != null) generators[i].accept(visitor); } } } } --- NEW FILE: Exec.java --- // Autogenerated AST node package org.python.pydev.parser.jython.ast; import org.python.pydev.parser.jython.SimpleNode; import java.io.DataOutputStream; import java.io.IOException; public class Exec extends stmtType { public exprType body; public exprType globals; public exprType locals; public Exec(exprType body, exprType globals, exprType locals) { this.body = body; this.globals = globals; this.locals = locals; } public Exec(exprType body, exprType globals, exprType locals, SimpleNode parent) { this(body, globals, locals); this.beginLine = parent.beginLine; this.beginColumn = parent.beginColumn; } public String toString() { StringBuffer sb = new StringBuffer("Exec["); sb.append("body="); sb.append(dumpThis(this.body)); sb.append(", "); sb.append("globals="); sb.append(dumpThis(this.globals)); sb.append(", "); sb.append("locals="); sb.append(dumpThis(this.locals)); sb.append("]"); return sb.toString(); } public void pickle(DataOutputStream ostream) throws IOException { pickleThis(24, ostream); pickleThis(this.body, ostream); pickleThis(this.globals, ostream); pickleThis(this.locals, ostream); } public Object accept(VisitorIF visitor) throws Exception { return visitor.visitExec(this); } public void traverse(VisitorIF visitor) throws Exception { if (body != null) body.accept(visitor); if (globals != null) globals.accept(visitor); if (locals != null) locals.accept(visitor); } } --- NEW FILE: str_typeType.java --- // Autogenerated AST node package org.python.pydev.parser.jython.ast; public interface str_typeType { public static final int TripleSingle = 1; public static final int TripleDouble = 2; public static final int SingleSingle = 3; public static final int SingleDouble = 4; public static final String[] str_typeTypeNames = new String[] { "<undef>", "TripleSingle", "TripleDouble", "SingleSingle", "SingleDouble", }; } --- NEW FILE: Break.java --- // Autogenerated AST node package org.python.pydev.parser.jython.ast; import org.python.pydev.parser.jython.SimpleNode; import java.io.DataOutputStream; import java.io.IOException; public class Break extends stmtType { public Break() { } public Break(SimpleNode parent) { this(); this.beginLine = parent.beginLine; this.beginColumn = parent.beginColumn; } public String toString() { StringBuffer sb = new StringBuffer("Break["); sb.append("]"); return sb.toString(); } public void pickle(DataOutputStream ostream) throws IOException { pickleThis(28, ostream); } public Object accept(VisitorIF visitor) throws Exception { return visitor.visitBreak(this); } public void traverse(VisitorIF visitor) throws Exception { } } --- NEW FILE: suiteType.java --- // Autogenerated AST node package org.python.pydev.parser.jython.ast; import org.python.pydev.parser.jython.SimpleNode; import java.io.DataOutputStream; import java.io.IOException; public class suiteType extends SimpleNode { public stmtType[] body; public suiteType(stmtType[] body) { this.body = body; } public suiteType(stmtType[] body, SimpleNode parent) { this(body); this.beginLine = parent.beginLine; this.beginColumn = parent.beginColumn; } public String toString() { StringBuffer sb = new StringBuffer("suite["); sb.append("body="); sb.append(dumpThis(this.body)); sb.append("]"); return sb.toString(); } public void pickle(DataOutputStream ostream) throws IOException { pickleThis(6, ostream); pickleThis(this.body, ostream); } public Object accept(VisitorIF visitor) throws Exception { traverse(visitor); return null; } public void traverse(VisitorIF visitor) throws Exception { if (body != null) { for (int i = 0; i < body.length; i++) { if (body[i] != null) body[i].accept(visitor); } } } } --- NEW FILE: Assert.java --- // Autogenerated AST node package org.python.pydev.parser.jython.ast; import org.python.pydev.parser.jython.SimpleNode; import java.io.DataOutputStream; import java.io.IOException; public class Assert extends stmtType { public exprType test; public exprType msg; public Assert(exprType test, exprType msg) { this.test = test; this.msg = msg; } public Assert(exprType test, exprType msg, SimpleNode parent) { this(test, msg); this.beginLine = parent.beginLine; this.beginColumn = parent.beginColumn; } public String toString() { StringBuffer sb = new StringBuffer("Assert["); sb.append("test="); sb.append(dumpThis(this.test)); sb.append(", "); sb.append("msg="); sb.append(dumpThis(this.msg)); sb.append("]"); return sb.toString(); } public void pickle(DataOutputStream ostream) throws IOException { pickleThis(21, ostream); pickleThis(this.test, ostream); pickleThis(this.msg, ostream); } public Object accept(VisitorIF visitor) throws Exception { return visitor.visitAssert(this); } public void traverse(VisitorIF visitor) throws Exception { if (test != null) test.accept(visitor); if (msg != null) msg.accept(visitor); } } --- NEW FILE: name_contextType.java --- // Autogenerated AST node package org.python.pydev.parser.jython.ast; public interface name_contextType { public static final int ClassName = 1; public static final int FunctionName = 2; public static final int KeywordName = 3; public static final int ImportName = 4; public static final int VarArg = 5; public static final int KwArg = 6; public static final int ImportModule = 7; public static final int Attrib = 8; public static final String[] name_contextTypeNames = new String[] { "<undef>", "ClassName", "FunctionName", "KeywordName", "ImportName", "VarArg", "KwArg", "ImportModule", "Attrib", }; } --- NEW FILE: stmtType.java --- // Autogenerated AST node package org.python.pydev.parser.jython.ast; import org.python.pydev.parser.jython.SimpleNode; public abstract class stmtType extends SimpleNode { } --- NEW FILE: Pass.java --- // Autogenerated AST node package org.python.pydev.parser.jython.ast; import org.python.pydev.parser.jython.SimpleNode; import java.io.DataOutputStream; import java.io.IOException; public class Pass extends stmtType { public Pass() { } public Pass(SimpleNode parent) { this(); this.beginLine = parent.beginLine; this.beginColumn = parent.beginColumn; } public String toString() { StringBuffer sb = new StringBuffer("Pass["); sb.append("]"); return sb.toString(); } public void pickle(DataOutputStream ostream) throws IOException { pickleThis(27, ostream); } public Object accept(VisitorIF visitor) throws Exception { return visitor.visitPass(this); } public void traverse(VisitorIF visitor) throws Exception { } } --- NEW FILE: Compare.java --- // Autogenerated AST node package org.python.pydev.parser.jython.ast; import org.python.pydev.parser.jython.SimpleNode; import java.io.DataOutputStream; import java.io.IOException; public class Compare extends exprType implements cmpopType { public exprType left; public int[] ops; public exprType[] comparators; public Compare(exprType left, int[] ops, exprType[] comparators) { this.left = left; this.ops = ops; this.comparators = comparators; } public Compare(exprType left, int[] ops, exprType[] comparators, SimpleNode parent) { this(left, ops, comparators); this.beginLine = parent.beginLine; this.beginColumn = parent.beginColumn; } public String toString() { StringBuffer sb = new StringBuffer("Compare["); sb.append("left="); sb.append(dumpThis(this.left)); sb.append(", "); sb.append("ops="); sb.append(dumpThis(this.ops, cmpopType.cmpopTypeNames)); sb.append(", "); sb.append("comparators="); sb.append(dumpThis(this.comparators)); sb.append("]"); return sb.toString(); } public void pickle(DataOutputStream ostream) throws IOException { pickleThis(37, ostream); pickleThis(this.left, ostream); pickleThis(this.ops, ostream); pickleThis(this.comparators, ostream); } public Object accept(VisitorIF visitor) throws Exception { return visitor.visitCompare(this); } public void traverse(VisitorIF visitor) throws Exception { if (left != null) left.accept(visitor); if (comparators != null) { for (int i = 0; i < comparators.length; i++) { if (comparators[i] != null) comparators[i].accept(visitor); } } } } --- NEW FILE: Ellipsis.java --- // Autogenerated AST node package org.python.pydev.parser.jython.ast; import org.python.pydev.parser.jython.SimpleNode; import java.io.DataOutputStream; import java.io.IOException; public class Ellipsis extends sliceType { public Ellipsis() { } public Ellipsis(SimpleNode parent) { this(); this.beginLine = parent.beginLine; this.beginColumn = parent.beginColumn; } public String toString() { StringBuffer sb = new StringBuffer("Ellipsis["); sb.append("]"); return sb.toString(); } public void pickle(DataOutputStream ostream) throws IOException { pickleThis(48, ostream); } public Object accept(VisitorIF visitor) throws Exception { return visitor.visitEllipsis(this); } public void traverse(VisitorIF visitor) throws Exception { } } --- NEW FILE: Continue.java --- // Autogenerated AST node package org.python.pydev.parser.jython.ast; import org.python.pydev.parser.jython.SimpleNode; import java.io.DataOutputStream; import java.io.IOException; public class Continue extends stmtType { public Continue() { } public Continue(SimpleNode parent) { this(); this.beginLine = parent.beginLine; this.beginColumn = parent.beginColumn; } public String toString() { StringBuffer sb = new StringBuffer("Continue["); sb.append("]"); return sb.toString(); } public void pickle(DataOutputStream ostream) throws IOException { pickleThis(29, ostream); } public Object accept(VisitorIF visitor) throws Exception { return visitor.visitContinue(this); } public void traverse(VisitorIF visitor) throws Exception { } } --- NEW FILE: ClassDef.java --- // Autogenerated AST node package org.python.pydev.parser.jython.ast; import org.python.pydev.parser.jython.SimpleNode; import java.io.DataOutputStream; import java.io.IOException; public class ClassDef extends stmtType { public NameTokType name; public exprType[] bases; public stmtType[] body; public ClassDef(NameTokType name, exprType[] bases, stmtType[] body) { this.name = name; this.bases = bases; this.body = body; } public ClassDef(NameTokType name, exprType[] bases, stmtType[] body, SimpleNode parent) { this(name, bases, body); this.beginLine = parent.beginLine; this.beginColumn = parent.beginColumn; } public String toString() { StringBuffer sb = new StringBuffer("ClassDef["); sb.append("name="); sb.append(dumpThis(this.name)); sb.append(", "); sb.append("bases="); sb.append(dumpThis(this.bases)); sb.append(", "); sb.append("body="); sb.append(dumpThis(this.body)); sb.append("]"); return sb.toString(); } public void pickle(DataOutputStream ostream) throws IOException { pickleThis(8, ostream); pickleThis(this.name, ostream); pickleThis(this.bases, ostream); pickleThis(this.body, ostream); } public Object accept(VisitorIF visitor) throws Exception { return visitor.visitClassDef(this); } public void traverse(VisitorIF visitor) throws Exception { if (name != null) name.accept(visitor); if (bases != null) { for (int i = 0; i < bases.length; i++) { if (bases[i] != null) bases[i].accept(visitor); } } if (body != null) { for (int i = 0; i < body.length; i++) { if (body[i] != null) body[i].accept(visitor); } } } } --- NEW FILE: VisitorIF.java --- // Autogenerated AST node package org.python.pydev.parser.jython.ast; public interface VisitorIF { public Object visitModule(Module node) throws Exception; public Object visitInteractive(Interactive node) throws Exception; public Object visitExpression(Expression node) throws Exception; public Object visitSuite(Suite node) throws Exception; public Object visitNameTok(NameTok node) throws Exception; public Object visitFunctionDef(FunctionDef node) throws Exception; public Object visitClassDef(ClassDef node) throws Exception; public Object visitReturn(Return node) throws Exception; public Object visitYield(Yield node) throws Exception; public Object visitDelete(Delete node) throws Exception; public Object visitAssign(Assign node) throws Exception; public Object visitAugAssign(AugAssign node) throws Exception; public Object visitPrint(Print node) throws Exception; public Object visitFor(For node) throws Exception; public Object visitWhile(While node) throws Exception; public Object visitIf(If node) throws Exception; public Object visitRaise(Raise node) throws Exception; public Object visitTryExcept(TryExcept node) throws Exception; public Object visitTryFinally(TryFinally node) throws Exception; public Object visitAssert(Assert node) throws Exception; public Object visitImport(Import node) throws Exception; public Object visitImportFrom(ImportFrom node) throws Exception; public Object visitExec(Exec node) throws Exception; public Object visitGlobal(Global node) throws Exception; public Object visitExpr(Expr node) throws Exception; public Object visitPass(Pass node) throws Exception; public Object visitBreak(Break node) throws Exception; public Object visitContinue(Continue node) throws Exception; public Object visitBoolOp(BoolOp node) throws Exception; public Object visitBinOp(BinOp node) throws Exception; public Object visitUnaryOp(UnaryOp node) throws Exception; public Object visitLambda(Lambda node) throws Exception; public Object visitDict(Dict node) throws Exception; public Object visitListComp(ListComp node) throws Exception; public Object visitGeneratorExp(GeneratorExp node) throws Exception; public Object visitCompare(Compare node) throws Exception; public Object visitCall(Call node) throws Exception; public Object visitRepr(Repr node) throws Exception; public Object visitNum(Num node) throws Exception; public Object visitStr(Str node) throws Exception; public Object visitStrJoin(StrJoin node) throws Exception; public Object visitAttribute(Attribute node) throws Exception; public Object visitSubscript(Subscript node) throws Exception; public Object visitName(Name node) throws Exception; public Object visitList(List node) throws Exception; public Object visitTuple(Tuple node) throws Exception; public Object visitEllipsis(Ellipsis node) throws Exception; public Object visitSlice(Slice node) throws Exception; public Object visitExtSlice(ExtSlice node) throws Exception; public Object visitIndex(Index node) throws Exception; public Object visitComprehension(Comprehension node) throws Exception; } --- NEW FILE: operatorType.java --- // Autogenerated AST node package org.python.pydev.parser.jython.ast; public interface operatorType { public static final int Add = 1; public static final int Sub = 2; public static final int Mult = 3; public static final int Div = 4; public static final int Mod = 5; public static final int Pow = 6; public static final int LShift = 7; public static final int RShift = 8; public static final int BitOr = 9; public static final int BitXor = 10; public static final int BitAnd = 11; public static final int FloorDiv = 12; public static final String[] operatorTypeNames = new String[] { "<undef>", "Add", "Sub", "Mult", "Div", "Mod", "Pow", "LShift", "RShift", "BitOr", "BitXor", "BitAnd", "FloorDiv", }; } --- NEW FILE: ExtSlice.java --- // Autogenerated AST node package org.python.pydev.parser.jython.ast; import org.python.pydev.parser.jython.SimpleNode; import java.io.DataOutputStream; import java.io.IOException; public class ExtSlice extends sliceType { public sliceType[] dims; public ExtSlice(sliceType[] dims) { this.dims = dims; } public ExtSlice(sliceType[] dims, SimpleNode parent) { this(dims); this.beginLine = parent.beginLine; this.beginColumn = parent.beginColumn; } public String toString() { StringBuffer sb = new StringBuffer("ExtSlice["); sb.append("dims="); sb.append(dumpThis(this.dims)); sb.append("]"); return sb.toString(); } public void pickle(DataOutputStream ostream) throws IOException { pickleThis(50, ostream); pickleThis(this.dims, ostream); } public Object accept(VisitorIF visitor) throws Exception { return visitor.visitExtSlice(this); } public void traverse(VisitorIF visitor) throws Exception { if (dims != null) { for (int i = 0; i < dims.length; i++) { if (dims[i] != null) dims[i].accept(visitor); } } } } --- NEW FILE: FunctionDef.java --- // Autogenerated AST node package org.python.pydev.parser.jython.ast; import org.python.pydev.parser.j... [truncated message content] |