{"record":{"id":"8622cdf18d4e60c8","repo":"stanfordnlp/CoreNLP","slug":"invalid-node-pattern-class-for-variable","errorCode":null,"errorMessage":"Invalid node pattern class:  for variable ","messagePattern":"Invalid node pattern class:  for variable ","errorType":"exception","errorClass":"java.lang.Error","httpStatus":null,"severity":"error","filePath":"src/edu/stanford/nlp/ling/tokensregex/Env.java","lineNumber":335,"sourceCode":"  }\n\n  public void bind(String name, SequencePattern pattern) {\n    bind(name, pattern.getPatternExpr());\n  }\n\n  public void unbind(String name) {\n    bind(name, null);\n  }\n\n  public NodePattern getNodePattern(String name) {\n    Object obj = variables.get(name);\n    if (obj != null) {\n      if (obj instanceof SequencePattern) {\n        SequencePattern seqPattern = (SequencePattern) obj;\n        if (seqPattern.getPatternExpr() instanceof SequencePattern.NodePatternExpr) {\n          return ((SequencePattern.NodePatternExpr) seqPattern.getPatternExpr()).nodePattern;\n        } else {\n          throw new Error(\"Invalid node pattern class: \" + seqPattern.getPatternExpr().getClass() + \" for variable \" + name);\n        }\n      } else if (obj instanceof SequencePattern.NodePatternExpr) {\n        SequencePattern.NodePatternExpr pe = (SequencePattern.NodePatternExpr) obj;\n        return pe.nodePattern;\n      } else if (obj instanceof NodePattern) {\n        return (NodePattern) obj;\n      } else if (obj instanceof String) {\n        try {\n          SequencePattern.NodePatternExpr pe = (SequencePattern.NodePatternExpr) parser.parseNode(this, (String) obj);\n          return pe.nodePattern;\n        } catch (Exception pex) {\n          throw new RuntimeException(\"Error parsing \" + obj + \" to node pattern\", pex);\n        }\n      } else {\n        throw new Error(\"Invalid node pattern variable class: \" + obj.getClass() + \" for variable \" + name);\n      }\n    }\n    return null;","sourceCodeStart":317,"sourceCodeEnd":353,"githubUrl":"https://github.com/stanfordnlp/CoreNLP/blob/1b7edd19c4d0d7b1f13a2591425b9b60a0b1af7a/src/edu/stanford/nlp/ling/tokensregex/Env.java#L317-L353","documentation":"Env.getNodePattern resolves a variable to a NodePattern; if the bound object is a SequencePattern whose pattern expression is not a simple NodePatternExpr (e.g. a sequence or composite expression), it cannot be used as a node pattern and throws an Error (not Exception).","triggerScenarios":"Referencing, in node position (e.g. [$VAR] inside a rule node), a variable bound to a full sequence pattern rather than a single node pattern.","commonSituations":"Binding a variable to a multi-token sequence and then using it as a single token pattern in a rule; confusing sequence variables with node variables.","solutions":["Bind the variable to a single node pattern (e.g. a NodePattern or NodePatternExpr), or use a literal node expression at the reference site","If a sequence is intended, use it in sequence position with getSequencePatternExpr semantics, not as a node","Split the sequence into separate node variables"],"exampleFix":null,"handlingStrategy":"type-guard","validationCode":"Object obj = env.get(name);\nif (obj instanceof SequencePattern && !(((SequencePattern) obj).getPatternExpr() instanceof SequencePattern.NodePatternExpr)) {\n  throw new IllegalStateException(name + \" is a sequence pattern; use it in sequence position, not as a node\");\n}","typeGuard":"boolean isNodePatternUsable(Object o) { return o instanceof NodePattern || o instanceof SequencePattern.NodePatternExpr || (o instanceof SequencePattern s && s.getPatternExpr() instanceof SequencePattern.NodePatternExpr); }","tryCatchPattern":"try { NodePattern np = env.getNodePattern(name); } catch (Error e) { log.error(\"Variable {} is not a node pattern: {}\", name, e.getMessage()); throw e; }","preventionTips":["Use distinct variable naming conventions for node vs sequence variables","Check the bound expression type when binding, not at lookup time","Only reference single-token expressions in node position"],"tags":["tokensregex","node-pattern","type-mismatch"],"backgroundTag":"type-mismatch","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"}