@atlassianlabs/jql-parser

JQL lexer, parser, listener and visitor

Usage no npm install needed!

<script type="module">
  import atlassianlabsJqlParser from 'https://cdn.skypack.dev/@atlassianlabs/jql-parser';
</script>

README

JQL Parser

Atlassian license

This library contains auto-generated sources from the antlr4ts library using the JQL ANTLR4 grammar. It enables consumers to parse a JQL query into a parse tree.

Usage

import { CharStreams, CommonTokenStream } from 'antlr4ts';
import { JQLLexer, JQLParser } from '@atlassianlabs/jql-parser';

// Create the lexer and parser
const jqlText = "project = JQL";
const charStream = CharStreams.fromString(jqlText);
const lexer = new JQLLexer(charStream);
const tokenStream = new CommonTokenStream(lexer);
const parser = new JQLParser(tokenStream);

// Parse the input, where `jqlQuery` is the entry point
const parsedJQLTree = parser.jqlQuery();

Installation

yarn add @atlassianlabs/jql-parser

Documentation

Inspecting the parse tree

A JQL parse tree can be inspected using the JQLParserListener or JQLParserVisitor, you can read about the differences between the visitor/listener approaches here.

Listener Approach

import { JQLParserListener, JqlQueryContext } from '@atlassianlabs/jql-parser';
import { ParseTreeWalker } from 'antlr4ts/tree/ParseTreeWalker';


class EnterQueryListener implements JQLParserListener {
    enterJqlQuery: (context: JqlQueryContext) {
        console.log(`Query start line number ${context._start.line}`);
        // ...
    }

    // other enterX functions...
}

// Create the listener
const listener: JQLParserListener = new EnterQueryListener();
// Use the entry point for listeners on the parsed JQL tree
ParseTreeWalker.DEFAULT.walk(listener, parsedJQLTree);

Visitor Approach

import { JQLParserVisitor, JqlOperandContext } from '@atlassianlabs/jql-parser';
import { AbstractParseTreeVisitor } from 'antlr4ts/tree/AbstractParseTreeVisitor';

// Extend the AbstractParseTreeVisitor to get default visitor behaviour
class CountOperandsVisitor extends AbstractParseTreeVisitor<number>
  implements JQLParserVisitor<number> {
  defaultResult() {
    return 0;
  }

  aggregateResult(aggregate: number, nextResult: number) {
    return aggregate + nextResult;
  }

  visitJqlOperand(context: JqlOperandContext): number {
    return 1 + super.visitChildren(context);
  }
}

// Create the visitor
const countOperandsVisitor = new CountOperandsVisitor()
// Use the visitor entry point with the parsed JQL tree
const numberOfOperands = countOperandsVisitor.visit(parsedJQLTree);

Support

For developers outside of Atlassian looking for help, or to report issues, please make a post on the community forum. We will monitor the forums and redirect topics to the appropriate maintainers.

License

Copyright (c) 2021 - 2022 Atlassian and others. Apache 2.0 licensed, see LICENSE file.