languagetool-org/languagetool · error · SAXException

Only backward references in match elements are possible…

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.

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.

Appendix: 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)