📄 treebuilder.java
字号:
exprType[] args = new exprType[nargs]; for (int i = 0; i < nargs; i++) { args[i] = makeExpr(tmparr[i]); } keywordType[] keywords = new keywordType[l - nargs]; for (int i = nargs; i < l; i++) { if (!(tmparr[i] instanceof keywordType)) throw new ParseException( "non-keyword argument following keyword", tmparr[i]); keywords[i - nargs] = (keywordType) tmparr[i]; } exprType func = makeExpr(); return new Call(func, args, keywords, starargs, kwargs); case JJTEXTRAKEYWORDVALUELIST: return new ExtraArgValue(makeExpr(), JJTEXTRAKEYWORDVALUELIST); case JJTEXTRAARGVALUELIST: return new ExtraArgValue(makeExpr(), JJTEXTRAARGVALUELIST); case JJTKEYWORD: value = makeExpr(); name = makeIdentifier(); return new keywordType(name, value); case JJTTUPLE: return new Tuple(makeExprs(), Tuple.Load); case JJTLIST: if (stack.nodeArity() > 0 && peekNode() instanceof listcompType) { listcompType[] generators = new listcompType[arity-1]; for (int i = arity-2; i >= 0; i--) { generators[i] = (listcompType) popNode(); } return new ListComp(makeExpr(), generators); } return new List(makeExprs(), List.Load); case JJTDICTIONARY: l = arity / 2; exprType[] keys = new exprType[l]; exprType[] vals = new exprType[l]; for (int i = l - 1; i >= 0; i--) { vals[i] = makeExpr(); keys[i] = makeExpr(); } return new Dict(keys, vals); case JJTSTR_1OP: return new Repr(makeExpr()); case JJTSTRJOIN: String str2 = ((Str) popNode()).s; String str1 = ((Str) popNode()).s; return new Str(str1 + str2); case JJTLAMBDEF: test = makeExpr(); arguments = makeArguments(arity - 1); return new Lambda(arguments, test); case JJTELLIPSES: return new Ellipsis(); case JJTSLICE: SimpleNode[] arr = new SimpleNode[arity]; for (int i = arity-1; i >= 0; i--) { arr[i] = popNode(); } exprType[] values = new exprType[3]; int k = 0; for (int j = 0; j < arity; j++) { if (arr[j].getId() == JJTCOLON) k++; else values[k] = makeExpr(arr[j]); } if (k == 0) { return new Index(values[0]); } else { return new Slice(values[0], values[1], values[2]); } case JJTSUBSCRIPTLIST: sliceType[] dims = new sliceType[arity]; for (int i = arity - 1; i >= 0; i--) { dims[i] = (sliceType) popNode(); } return new ExtSlice(dims); case JJTAUG_PLUS: return makeAugAssign(AugAssign.Add); case JJTAUG_MINUS: return makeAugAssign(AugAssign.Sub); case JJTAUG_MULTIPLY: return makeAugAssign(AugAssign.Mult); case JJTAUG_DIVIDE: return makeAugAssign(AugAssign.Div); case JJTAUG_MODULO: return makeAugAssign(AugAssign.Mod); case JJTAUG_AND: return makeAugAssign(AugAssign.BitAnd); case JJTAUG_OR: return makeAugAssign(AugAssign.BitOr); case JJTAUG_XOR: return makeAugAssign(AugAssign.BitXor); case JJTAUG_LSHIFT: return makeAugAssign(AugAssign.LShift); case JJTAUG_RSHIFT: return makeAugAssign(AugAssign.RShift); case JJTAUG_POWER: return makeAugAssign(AugAssign.Pow); case JJTAUG_FLOORDIVIDE: return makeAugAssign(AugAssign.FloorDiv); case JJTLIST_FOR: exprType[] ifs = new exprType[arity-2]; for (int i = arity-3; i >= 0; i--) { ifs[i] = makeExpr(); } iter = makeExpr(); target = makeExpr(); ctx.setStore(target); return new listcompType(target, iter, ifs); case JJTIMPORTFROM: aliasType[] aliases = makeAliases(arity - 1); String module = makeIdentifier(); return new ImportFrom(module, aliases); case JJTIMPORT: return new Import(makeAliases()); case JJTDOTTED_NAME: StringBuffer sb = new StringBuffer(); for (int i = 0; i < arity; i++) { if (i > 0) sb.insert(0, '.'); sb.insert(0, makeIdentifier()); } return new Name(sb.toString(), Name.Load); case JJTDOTTED_AS_NAME: String asname = null; if (arity > 1) asname = makeIdentifier(); return new aliasType(makeIdentifier(), asname); case JJTIMPORT_AS_NAME: asname = null; if (arity > 1) asname = makeIdentifier(); return new aliasType(makeIdentifier(), asname); case JJTCOMMA: case JJTCOLON: return n; default: return null; } } private stmtType makeAugAssign(int op) throws Exception { exprType value = makeExpr(); exprType target = makeExpr(); ctx.setAugStore(target); return new AugAssign(target, op, value); } private void dumpStack() { int n = stack.nodeArity(); System.out.println("nodeArity:" + n); if (n > 0) { System.out.println("peek:" + stack.peekNode()); } } SimpleNode peekNode() { return (SimpleNode) stack.peekNode(); } SimpleNode popNode() { return (SimpleNode) stack.popNode(); } BinOp makeBinOp(int op) { exprType right = makeExpr(); exprType left = makeExpr(); return new BinOp(left, op, right); } argumentsType makeArguments(int l) throws Exception { String kwarg = null; String stararg = null; if (l > 0 && peekNode().getId() == JJTEXTRAKEYWORDLIST) { kwarg = ((ExtraArg) popNode()).name; l--; } if (l > 0 && peekNode().getId() == JJTEXTRAARGLIST) { stararg = ((ExtraArg) popNode()).name; l--; } int startofdefaults = l; exprType fpargs[] = new exprType[l]; exprType defaults[] = new exprType[l]; for (int i = l-1; i >= 0; i--) { DefaultArg node = (DefaultArg) popNode(); fpargs[i] = node.parameter; ctx.setStore(fpargs[i]); defaults[i] = node.value; if (node.value != null) startofdefaults = i; }//System.out.println("start "+ startofdefaults + " " + l); exprType[] newdefs = new exprType[l-startofdefaults]; System.arraycopy(defaults, startofdefaults, newdefs, 0, newdefs.length); return new argumentsType(fpargs, stararg, kwarg, newdefs); }}class DefaultArg extends SimpleNode { public exprType parameter; public exprType value; DefaultArg(exprType parameter, exprType value) { this.parameter = parameter; this.value = value; }}class ExtraArg extends SimpleNode { public String name; public int id; ExtraArg(String name, int id) { this.name = name; this.id = id; } public int getId() { return id; }}class ExtraArgValue extends SimpleNode { public exprType value; public int id; ExtraArgValue(exprType value, int id) { this.value = value; this.id = id; } public int getId() { return id; }}class IdentityNode extends SimpleNode { public int id; public Object image; IdentityNode(int id) { this.id = id; } public int getId() { return id; } public void setImage(Object image) { this.image = image; } public Object getImage() { return image; } public String toString() { return "IdNode[" + PythonGrammarTreeConstants.jjtNodeName[id] + ", " + image + "]"; }}class CtxVisitor extends Visitor { private int ctx; public CtxVisitor() { } public void setStore(SimpleNode node) throws Exception { this.ctx = expr_contextType.Store; visit(node); } public void setStore(SimpleNode[] nodes) throws Exception { for (int i = 0; i < nodes.length; i++) setStore(nodes[i]); } public void setDelete(SimpleNode node) throws Exception { this.ctx = expr_contextType.Del; visit(node); } public void setDelete(SimpleNode[] nodes) throws Exception { for (int i = 0; i < nodes.length; i++) setDelete(nodes[i]); } public void setAugStore(SimpleNode node) throws Exception { this.ctx = expr_contextType.AugStore; visit(node); } public Object visitName(Name node) throws Exception { node.ctx = ctx; return null; } public Object visitAttribute(Attribute node) throws Exception { node.ctx = ctx; return null; } public Object visitSubscript(Subscript node) throws Exception { node.ctx = ctx; return null; } public Object visitList(List node) throws Exception { if (ctx == expr_contextType.AugStore) { throw new ParseException( "augmented assign to list not possible", node); } node.ctx = ctx; traverse(node); return null; } public Object visitTuple(Tuple node) throws Exception { if (ctx == expr_contextType.AugStore) { throw new ParseException( "augmented assign to tuple not possible", node); } node.ctx = ctx; traverse(node); return null; } public Object visitCall(Call node) throws Exception { throw new ParseException("can't assign to function call", node); } public Object visitListComp(Call node) throws Exception { throw new ParseException("can't assign to list comprehension call", node); } public Object unhandled_node(SimpleNode node) throws Exception { throw new ParseException("can't assign to operator", node); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -