{"record":{"id":"3d709a44f83deee8","repo":"stanfordnlp/CoreNLP","slug":"illegal-number-of-nodes-given-to-createsubtree-3d709a","errorCode":null,"errorMessage":"Illegal number of nodes given to createSubtree (","messagePattern":"Illegal number of nodes given to createSubtree \\(","errorType":"exception","errorClass":"ParseException","httpStatus":null,"severity":"error","filePath":"src/edu/stanford/nlp/trees/tregex/tsurgeon/TsurgeonParser.jjt","lineNumber":177,"sourceCode":"  operator = <REPLACE> child1 = NodeSelection() treeList = TreeList(false)\n    { return new ReplaceNode(child1,treeList); }\n| operator = <MOVE> child1 = NodeSelection() loc = Location()\n    { return new MoveNode(child1, loc, false); }\n| operator = <MOVE_PRUNE> child1 = NodeSelection() loc = Location()\n    { return new MoveNode(child1, loc, true); }\n| LOOKAHEAD(3)\n  operator = <INSERT> child1 = NodeSelection() loc = Location()\n    { return new InsertNode(child1, loc); }\n| LOOKAHEAD(3)\n  operator = <INSERT> tree = TreeRoot(false) loc = Location()\n    { return new InsertNode(tree, loc); }\n| operator = <CREATE_SUBTREE> tree = TreeRoot(false) nodeSelections = NodeSelectionList(new ArrayList<TsurgeonPattern>())\n    { if (nodeSelections.size() == 1) {\n        return new CreateSubtreeNode(nodeSelections.get(0), tree);\n      } else if (nodeSelections.size() == 2) {\n        return new CreateSubtreeNode(nodeSelections.get(0), nodeSelections.get(1), tree);\n      } else {\n        throw new ParseException(\"Illegal number of nodes given to createSubtree (\" + nodeSelections.size() + \")\");\n      }\n    }\n| operator = <ADJOIN> tree = TreeRoot(true) child1 = NodeSelection()\n    { return new AdjoinNode(tree, child1); }\n| operator = <ADJOIN_TO_HEAD> tree = TreeRoot(true) child1 = NodeSelection()\n    { return new AdjoinToHeadNode(tree, child1); }\n| operator = <ADJOIN_TO_FOOT> tree = TreeRoot(true) child1 = NodeSelection()\n    { return new AdjoinToFootNode(tree, child1); }\n| operator = <COINDEX> nodeSelections = NodeSelectionList(new ArrayList<TsurgeonPattern>())\n    { return new CoindexNodes(nodeSelections.toArray(new TsurgeonPattern[] {})); }\n}\n\nTreeLocation Location() :\n{\n  Token rel;\n  TsurgeonPattern child;\n}\n{","sourceCodeStart":159,"sourceCodeEnd":195,"githubUrl":"https://github.com/stanfordnlp/CoreNLP/blob/1b7edd19c4d0d7b1f13a2591425b9b60a0b1af7a/src/edu/stanford/nlp/trees/tregex/tsurgeon/TsurgeonParser.jjt#L159-L195","documentation":"Same error as the generated parser at TsurgeonParser.jj:303, but this is the source grammar location (TsurgeonParser.jjt:177): createSubtree only supports one or two node selections. The parser builds a CreateSubtreeNode from the collected selections and throws a ParseException for any other count.","triggerScenarios":"A Tsurgeon operation \"createSubtree <label> <nodes>\" where the NodeSelectionList resolves to 0, 3, or more selections when the operation block executes.","commonSituations":"Editing .jjt grammar or tsurgeon scripts and changing the selection count; writing operations generically from a template that emits a variable-length node list.","solutions":["Restrict createSubtree usage to 1 or 2 node selections in the tsurgeon script.","If you need to group more than two nodes, chain multiple createSubtree/adjoin operations.","Update downstream generators to assert list size ∈ {1,2} before emitting the operation."],"exampleFix":"// before\ncreateSubtree VP n1 n2 n3\n// after\ncreateSubtree VP n1 n2","handlingStrategy":"validation","validationCode":"boolean opArityOk(String op) {\n  String[] p = op.trim().split(\"\\\\s+\");\n  return !p[0].equals(\"createSubtree\") || (p.length == 3 || p.length == 4);\n}","typeGuard":null,"tryCatchPattern":"try { return Tsurgeon.parseOperation(script); } catch (ParseException e) { log.error(\"Bad createSubtree arity: \" + script); return null; }","preventionTips":["Keep createSubtree to <= 2 selections; chain operations for larger groupings","Validate generated tsurgeon operations in tests","Pin the CoreNLP version so grammar behavior is stable"],"tags":["parser","tsurgeon","arity"],"backgroundTag":"missing-required-argument","analyzedSha":"1b7edd19c4d0d7b1f13a2591425b9b60a0b1af7a","analyzedAt":"2026-09-10T02:24:07.274Z","contentChangedAt":"2026-09-10T02:24:07.274Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}