languagetool-org/languagetool · error · SAXException

Only backward references in match elements are possible, tri

Error message

Only backward references in match elements are possible, tried to specify token " + refNumber + "\n Line: " + pLocator.getLineNumber() + ", column: " + pLocator.getColumnNumber() + ".

What it means

Error "Only backward references in match elements are possible, tried to specify token " + refNumber + "\n Line: " + pLocator.getLineNumber() + ", column: " + pLocator.getColumnNumber() + "." thrown in languagetool-org/languagetool.

Source

Thrown at languagetool-core/src/main/java/org/languagetool/tagging/disambiguation/rules/DisambiguationRuleHandler.java:282

        filterClassName = attrs.getValue("class");
        filterArgs = attrs.getValue("args");
        break;
      case MARKER:
        if (inMarker) {
          throw new IllegalStateException("'<marker>' may not be nested in rule '" + id + "'");
        }
        example.append("<marker>");
        if (inPattern || inAntiPattern) {
          startPos = tokenCounter;
          inMarker = true;
        }
        break;
    }
  }

  private void refNumberSanityCheck(int refNumber) throws SAXException {
    if (refNumber > patternTokens.size()) {
      throw new SAXException("Only backward references in match elements are possible, tried to specify token "
              + refNumber + "\n Line: " + pLocator.getLineNumber()
              + ", column: " + pLocator.getColumnNumber() + ".");
    }
  }

  @Override
  public void endElement(String namespaceURI, String sName,
                         String qName) throws SAXException {
    switch (qName) {
      case RULE:
        DisambiguationPatternRule rule = new DisambiguationPatternRule(id,
                name, language, patternTokens, disambiguatedPOS, posSelector,
                disambigAction);

        endPositionCorrection = endPos - tokenCountForMarker;
        if (startPos != -1 && endPos != -1) {
          rule.setStartPositionCorrection(startPos);
          rule.setEndPositionCorrection(endPositionCorrection);

View on GitHub (pinned to 2e990059ce)

Solutions

  1. Change the token reference to point backwards (positive ref within the tokens seen so far)
  2. Fix the match no attribute in the rule XML so it references a previous token
  3. Restructure the rule pattern so the referenced token precedes the match element
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at languagetool-core/src/main/java/org/languagetool/tagging/disambiguation/rules/DisambiguationRuleHandler.java:282 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of languagetool-org/languagetool@2e990059ce (2026-09-06). Data as JSON: /api/errors/dc8cb34ffdf1065a. Report an issue: GitHub.