{"record":{"id":"0726e967018da080","repo":"stanfordnlp/CoreNLP","slug":"illegal-number-of-nodes-given-to-createsubtree","errorCode":null,"errorMessage":"Illegal number of nodes given to createSubtree (\" + nodeSelections.size() + \")","messagePattern":"Illegal number of nodes given to createSubtree \\(\" \\+ nodeSelections\\.size\\(\\) \\+ \"\\)","errorType":"exception","errorClass":"ParseException","httpStatus":null,"severity":"error","filePath":"src/edu/stanford/nlp/trees/tregex/tsurgeon/TsurgeonParser.java","lineNumber":268,"sourceCode":"              tree = TreeRoot(false);\n              loc = Location();\njjtree.closeNodeScope(jjtn000, true);\n      jjtc000 = false;\n{if (\"\" != null) return new InsertNode(tree, loc);}\n            } else {\n              switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {\n              case CREATE_SUBTREE:{\n                operator = jj_consume_token(CREATE_SUBTREE);\n                tree = TreeRoot(false);\n                nodeSelections = NodeSelectionList(new ArrayList<TsurgeonPattern>());\njjtree.closeNodeScope(jjtn000, true);\n      jjtc000 = false;\nif (nodeSelections.size() == 1) {\n        {if (\"\" != null) return new CreateSubtreeNode(nodeSelections.get(0), tree);}\n      } else if (nodeSelections.size() == 2) {\n        {if (\"\" != null) return new CreateSubtreeNode(nodeSelections.get(0), nodeSelections.get(1), tree);}\n      } else {\n        {if (true) throw new ParseException(\"Illegal number of nodes given to createSubtree (\" + nodeSelections.size() + \")\");}\n      }\n                break;\n                }\n              case ADJOIN:{\n                operator = jj_consume_token(ADJOIN);\n                tree = TreeRoot(true);\n                child1 = NodeSelection();\njjtree.closeNodeScope(jjtn000, true);\n      jjtc000 = false;\n{if (\"\" != null) return new AdjoinNode(tree, child1);}\n                break;\n                }\n              case ADJOIN_TO_HEAD:{\n                operator = jj_consume_token(ADJOIN_TO_HEAD);\n                tree = TreeRoot(true);\n                child1 = NodeSelection();\njjtree.closeNodeScope(jjtn000, true);\n      jjtc000 = false;","sourceCodeStart":250,"sourceCodeEnd":286,"githubUrl":"https://github.com/stanfordnlp/CoreNLP/blob/1b7edd19c4d0d7b1f13a2591425b9b60a0b1af7a/src/edu/stanford/nlp/trees/tregex/tsurgeon/TsurgeonParser.java#L250-L286","documentation":"The generated TsurgeonParser's Operation rule for the createSubtree operator only accepts exactly one or two node selections. Any other count throws ParseException(\"Illegal number of nodes given to createSubtree (...)\"). createSubtree defines a new subtree whose structure is determined by the one or two named nodes.","triggerScenarios":"Writing a createSubtree operation in a tsurgeon script with zero, or three or more node arguments, e.g. \"createSubtree n1 n2 n3\" or \"createSubtree\" with no named nodes matched by the tregex.","commonSituations":"Misunderstanding createSubtree's signature (it takes 1 or 2 nodes: child/label and optional parent); typos duplicating node names; scripts auto-generated from templates with variable argument counts.","solutions":["Reduce or supply arguments so createSubtree has exactly one or two named-node arguments","Check the tregex pattern defines the node names used by createSubtree (all arguments must be named captures)","Validate the operation string with Tsurgeon.parseOperation before running on trees","Catch ParseException/TsurgeonParseException when loading user-supplied scripts and report the argument count"],"exampleFix":"// before\ncreateSubtree n1 n2 n3\n// after\ncreateSubtree n1 n2","handlingStrategy":"validation","validationCode":"String[] args = opString.trim().split(\"\\\\s+\");\nif (args[0].equals(\"createSubtree\") && (args.length < 2 || args.length > 3)) {\n  throw new IllegalArgumentException(\"createSubtree takes exactly 1 or 2 node arguments: \" + opString);\n}","typeGuard":null,"tryCatchPattern":"try { Tsurgeon.parseOperation(opString); } catch (ParseException | TsurgeonParseException e) { reportBadScriptLine(opString, e); }","preventionTips":["Pass exactly one or two named nodes to createSubtree","Ensure the tregex defines every node name the operation references","Lint tsurgeon scripts argument counts at load time"],"tags":["tsurgeon","parse-error","argument-count","invalid-argument"],"backgroundTag":"invalid-argument-value","analyzedSha":"1b7edd19c4d0d7b1f13a2591425b9b60a0b1af7a","analyzedAt":"2026-09-10T02:24:07.274Z","contentChangedAt":"2026-09-10T02:24:07.274Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}