📄 treebuilder24.java
字号:
this.addSpecialsAndClearOriginal(extraArg, starargs);
extraArg.specialsBefore = starargs.getSpecialsBefore();
extraArg.specialsAfter = starargs.getSpecialsAfter();
} else if(node instanceof keywordType){
//keyword
keywordsl.add(node);
} else if(isArg(node)){
//default
argsl.add(node);
} else if(node instanceof comprehensionType){
//list comp (2 nodes: comp type and the elt -- what does elt mean by the way?)
argsl.add( new ListComp((exprType)iter.next(), new comprehensionType[]{(comprehensionType)node}));
} else if(node instanceof decoratorsType){
func = (exprType) stack.popNode();//the func is the last thing in the stack
decoratorsType d = (decoratorsType) node;
d.func = func;
d.args = (exprType[]) argsl.toArray(new exprType[0]);
d.keywords = (keywordType[]) keywordsl.toArray(new keywordType[0]);
d.starargs = starargs;
d.kwargs = kwargs;
return d;
} else {
argsl.add(node);
}
}
throw new RuntimeException("Something wrong happened while making the decorators...");
}
private stmtType makeAugAssign(int op) throws Exception {
exprType value = (exprType) stack.popNode();
exprType target = (exprType) stack.popNode();
ctx.setAugStore(target);
return new AugAssign(target, op, value);
}
BinOp makeBinOp(int op) {
exprType right = (exprType) stack.popNode();
exprType left = (exprType) stack.popNode();
return new BinOp(left, op, right);
}
boolean isArg(SimpleNode n){
if (n instanceof ExtraArg)
return true;
if (n instanceof DefaultArg)
return true;
if (n instanceof keywordType)
return true;
return false;
}
NameTok[] getVargAndKwarg(java.util.List<SimpleNode> args) throws Exception {
NameTok varg = null;
NameTok kwarg = null;
for (Iterator<SimpleNode> iter = args.iterator(); iter.hasNext();) {
SimpleNode node = iter.next();
if(node.getId() == JJTEXTRAKEYWORDLIST){
ExtraArg a = (ExtraArg)node;
kwarg = a.tok;
addSpecialsAndClearOriginal(a, kwarg);
}else if(node.getId() == JJTEXTRAARGLIST){
ExtraArg a = (ExtraArg)node;
varg = a.tok;
addSpecialsAndClearOriginal(a, varg);
}
}
return new NameTok[]{varg, kwarg};
}
private argumentsType makeArguments(DefaultArg[] def, NameTok varg, NameTok kwarg) throws Exception {
exprType fpargs[] = new exprType[def.length];
exprType defaults[] = new exprType[def.length];
int startofdefaults = 0;
boolean defaultsSet = false;
for(int i = 0 ; i< def.length; i++){
DefaultArg node = def[i];
exprType parameter = node.parameter;
fpargs[i] = parameter;
if(node.specialsBefore != null && node.specialsBefore.size() > 0){
parameter.getSpecialsBefore().addAll(node.specialsBefore);
}
if(node.specialsAfter != null && node.specialsAfter.size() > 0){
parameter.getSpecialsAfter().addAll(node.specialsAfter);
}
ctx.setParam(fpargs[i]);
defaults[i] = node.value;
if (node.value != null && defaultsSet == false){
defaultsSet = true;
startofdefaults = i;
}
}
// System.out.println("start "+ startofdefaults + " " + l);
exprType[] newdefs = new exprType[def.length - startofdefaults];
System.arraycopy(defaults, startofdefaults, newdefs, 0, newdefs.length);
return new argumentsType(fpargs, varg, kwarg, newdefs);
}
private argumentsType makeArguments(int l) throws Exception {
NameTok kwarg = null;
NameTok stararg = null;
if (l > 0 && stack.peekNode().getId() == JJTEXTRAKEYWORDLIST) {
ExtraArg node = (ExtraArg) stack.popNode();
kwarg = node.tok;
l--;
addSpecialsAndClearOriginal(node, kwarg);
}
if (l > 0 && stack.peekNode().getId() == JJTEXTRAARGLIST) {
ExtraArg node = (ExtraArg) stack.popNode();
stararg = node.tok;
l--;
addSpecialsAndClearOriginal(node, stararg);
}
ArrayList<SimpleNode> list = new ArrayList<SimpleNode>();
for (int i = l-1; i >= 0; i--) {
list.add((DefaultArg) stack.popNode());
}
Collections.reverse(list);//we get them in reverse order in the stack
return makeArguments((DefaultArg[]) list.toArray(new DefaultArg[0]), stararg, kwarg);
}
}
class Decorators extends SimpleNode {
public decoratorsType[] exp;
private int id;
Decorators(decoratorsType[] exp, int id) {
this.exp = exp;
this.id = id;
}
public int getId() {
return id;
}
}
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 int id;
NameTok tok;
ExtraArg(NameTok tok, int id) {
this.tok = tok;
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[" + PythonGrammar24TreeConstants.jjtNodeName[id] + ", " +
image + "]";
}
}
class CtxVisitor extends Visitor {
private int ctx;
public CtxVisitor() { }
public void setParam(SimpleNode node) throws Exception {
this.ctx = expr_contextType.Param;
visit(node);
}
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 + -