@atlassianlabs/jql-parser
v1.0.1
Published
JQL lexer, parser, listener and visitor
Downloads
15,016
Readme
JQL Parser
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.