escript-antlr4
Getting started
- Install
escript-antlr4
and antlr4ts
as dependencies using your preferred
package manager.
npm install escript-antlr4 antlr4ts --save
yarn add escript-antlr4 antlr4ts
- Use your grammar in TypeScript (or JavaScript)
import { EscriptLexer, EscriptParser } from 'escript-antlr4';
import { ANTLRInputStream, CommonTokenStream } from 'antlr4ts';
const program = `
program main(arg0, arg1)
Print(arg0);
endprogram
function f1() endfunction
function f2() endfunction
`;
const inputStream = new ANTLRInputStream(program);
const lexer = new EscriptLexer(inputStream);
const tokenStream = new CommonTokenStream(lexer);
const parser = new EscriptParser(tokenStream);
const tree = parser.compilationUnit();
The two main ways to inspect the tree are by using a listener or a visitor, you
can read about the differences between the two
here.
Listener Approach
import { EscriptParserListener, ProgramDeclarationContext } from 'escript-antlr4';
import { ParseTreeWalker } from 'antlr4ts/tree';
class EnterProgramListener implements EscriptParserListener {
enterProgramDeclaration(context: ProgramDeclarationContext) {
console.log(`Program name: ${context.IDENTIFIER().text}`);
}
}
const listener: EscriptParserListener = new EnterProgramListener();
ParseTreeWalker.DEFAULT.walk(listener, tree);
Visitor Approach
import { EscriptParserVisitor, FunctionDeclarationContext } from 'escript-antlr4';
import { AbstractParseTreeVisitor } from 'antlr4ts/tree';
class CountElementsVisitor
extends AbstractParseTreeVisitor<number>
implements EscriptParserVisitor<number> {
defaultResult() {
return 0;
}
aggregateResult(aggregate: number, nextResult: number) {
return aggregate + nextResult;
}
visitFunctionDeclaration(context: FunctionDeclarationContext): number {
return 1 + super.visitChildren(context);
}
}
const countElementsVisitor = new CountElementsVisitor();
const count = countElementsVisitor.visit(tree);
console.log(`There are ${count} function declarations`);