UNPKG

@atlassianlabs/jql-parser

Version:

JQL lexer, parser, listener and visitor

95 lines (68 loc) 3.04 kB
# JQL Parser [![Atlassian license](https://img.shields.io/badge/license-Apache%202.0-blue.svg?style=flat-square)](LICENSE) This library contains auto-generated sources from the [antlr4ts](https://github.com/tunnelvisionlabs/antlr4ts) library using the JQL ANTLR4 grammar. It enables consumers to parse a JQL query into a parse tree. ## Usage ```typescript 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 ```sh 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](https://github.com/antlr/antlr4/blob/master/doc/listeners.md). #### Listener Approach ```typescript 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 ```typescript 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](https://community.developer.atlassian.com/c/atlassian-ecosystem-design). 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](LICENSE) file.