Comparing version
import * as antlr from "antlr4ng"; | ||
import { ANTLRv4ParserListener } from "./ANTLRv4ParserListener.js"; | ||
export declare class ANTLRv4Parser extends antlr.Parser { | ||
@@ -262,2 +263,4 @@ static readonly ACTION = 4; | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -270,2 +273,4 @@ export declare class GrammarDeclContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -278,2 +283,4 @@ export declare class GrammarTypeContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -288,2 +295,4 @@ export declare class PrequelConstructContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -299,2 +308,4 @@ export declare class OptionsSpecContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -307,2 +318,4 @@ export declare class OptionContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -319,2 +332,4 @@ export declare class OptionValueContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -330,2 +345,4 @@ export declare class DelegateGrammarsContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -338,2 +355,4 @@ export declare class DelegateGrammarContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -346,2 +365,4 @@ export declare class TokensSpecContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -354,2 +375,4 @@ export declare class ChannelsSpecContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -363,2 +386,4 @@ export declare class IdListContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -373,2 +398,4 @@ export declare class Action_Context extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -381,2 +408,4 @@ export declare class ActionScopeNameContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -390,2 +419,4 @@ export declare class ActionBlockContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -399,2 +430,4 @@ export declare class ArgActionBlockContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -409,2 +442,4 @@ export declare class ModeSpecContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -416,2 +451,4 @@ export declare class RulesContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -423,2 +460,4 @@ export declare class RuleSpecContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -440,2 +479,4 @@ export declare class ParserRuleSpecContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -448,2 +489,4 @@ export declare class ExceptionGroupContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -456,2 +499,4 @@ export declare class ExceptionHandlerContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -463,2 +508,4 @@ export declare class FinallyClauseContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -470,2 +517,4 @@ export declare class RulePrequelContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -477,2 +526,4 @@ export declare class RuleReturnsContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -487,2 +538,4 @@ export declare class ThrowsSpecContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -494,2 +547,4 @@ export declare class LocalsSpecContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -502,2 +557,4 @@ export declare class RuleActionContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -509,2 +566,4 @@ export declare class RuleModifiersContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -518,2 +577,4 @@ export declare class RuleModifierContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -524,2 +585,4 @@ export declare class RuleBlockContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -533,2 +596,4 @@ export declare class RuleAltListContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -541,2 +606,4 @@ export declare class LabeledAltContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -552,2 +619,4 @@ export declare class LexerRuleSpecContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -558,2 +627,4 @@ export declare class LexerRuleBlockContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -567,2 +638,4 @@ export declare class LexerAltListContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -574,2 +647,4 @@ export declare class LexerAltContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -581,2 +656,4 @@ export declare class LexerElementsContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -591,2 +668,4 @@ export declare class LexerElementContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -599,2 +678,4 @@ export declare class LexerBlockContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -609,2 +690,4 @@ export declare class LexerCommandsContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -618,2 +701,4 @@ export declare class LexerCommandContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -625,2 +710,4 @@ export declare class LexerCommandNameContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -632,2 +719,4 @@ export declare class LexerCommandExprContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -641,2 +730,4 @@ export declare class AltListContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -649,2 +740,4 @@ export declare class AlternativeContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -661,2 +754,4 @@ export declare class ElementContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -672,2 +767,4 @@ export declare class PredicateOptionsContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -683,2 +780,4 @@ export declare class PredicateOptionContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -693,2 +792,4 @@ export declare class LabeledElementContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -700,2 +801,4 @@ export declare class EbnfContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -706,2 +809,4 @@ export declare class BlockSuffixContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -715,2 +820,4 @@ export declare class EbnfSuffixContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -725,2 +832,4 @@ export declare class LexerAtomContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -734,2 +843,4 @@ export declare class AtomContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -741,2 +852,4 @@ export declare class WildcardContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -749,2 +862,4 @@ export declare class NotSetContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -760,2 +875,4 @@ export declare class BlockSetContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -770,2 +887,4 @@ export declare class SetElementContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -782,2 +901,4 @@ export declare class BlockContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -790,2 +911,4 @@ export declare class RulerefContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -798,2 +921,4 @@ export declare class CharacterRangeContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -806,2 +931,4 @@ export declare class TerminalDefContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -817,2 +944,4 @@ export declare class ElementOptionsContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -827,2 +956,4 @@ export declare class ElementOptionContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -834,2 +965,4 @@ export declare class IdentifierContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} | ||
@@ -843,2 +976,4 @@ export declare class QualifiedIdentifierContext extends antlr.ParserRuleContext { | ||
get ruleIndex(): number; | ||
enterRule(listener: ANTLRv4ParserListener): void; | ||
exitRule(listener: ANTLRv4ParserListener): void; | ||
} |
@@ -8,2 +8,3 @@ var __defProp = Object.defineProperty; | ||
import { ErrorType } from "../tool/ErrorType.js"; | ||
const linePattern = /\s*(?<tokenID>\w+|'[^']*')\s*=\s*(?<tokenTypeS>\d*)/; | ||
class TokenVocabParser { | ||
@@ -33,6 +34,5 @@ constructor(g, outputDirectory, libDirectory) { | ||
} | ||
const parts = tokenDef.split("="); | ||
if (parts.length === 2) { | ||
const tokenID = parts[0].trim(); | ||
const tokenTypeS = parts[1].trim(); | ||
const match = linePattern.exec(tokenDef); | ||
if (match) { | ||
const { tokenID, tokenTypeS } = match.groups; | ||
let tokenType; | ||
@@ -39,0 +39,0 @@ try { |
@@ -824,3 +824,3 @@ var __defProp = Object.defineProperty; | ||
this, | ||
this.tool.toolParameters.outputDirectory ?? ".", | ||
this.tool.getOutputDirectory(this.fileName), | ||
this.tool.toolParameters.libDirectory | ||
@@ -827,0 +827,0 @@ ); |
@@ -621,26 +621,16 @@ var __defProp = Object.defineProperty; | ||
this.match(this.input, Constants.DOWN, null); | ||
let cnt17 = 0; | ||
loop17: | ||
while (true) { | ||
let alt17 = 2; | ||
const LA17_0 = this.input.LA(1); | ||
if (LA17_0 === ANTLRv4Lexer.LEXER_CHAR_SET || LA17_0 === ANTLRv4Lexer.RANGE || LA17_0 === ANTLRv4Lexer.STRING_LITERAL || LA17_0 === ANTLRv4Lexer.TOKEN_REF) { | ||
alt17 = 1; | ||
let elementCount = 0; | ||
while (true) { | ||
const lookahead = this.input.LA(1); | ||
if (lookahead === ANTLRv4Lexer.LEXER_CHAR_SET || lookahead === ANTLRv4Lexer.RANGE || lookahead === ANTLRv4Lexer.STRING_LITERAL || lookahead === ANTLRv4Lexer.TOKEN_REF) { | ||
const setElement23 = this.setElement(); | ||
alts.push(setElement23.start); | ||
} else { | ||
if (elementCount >= 1) { | ||
break; | ||
} | ||
switch (alt17) { | ||
case 1: { | ||
const setElement23 = this.setElement(); | ||
alts.push(setElement23.start); | ||
break; | ||
} | ||
default: { | ||
if (cnt17 >= 1) { | ||
break loop17; | ||
} | ||
const eee = new EarlyExitException(17, this.input); | ||
throw eee; | ||
} | ||
} | ||
cnt17++; | ||
throw new EarlyExitException(17, this.input); | ||
} | ||
elementCount++; | ||
} | ||
this.match(this.input, Constants.UP, null); | ||
@@ -660,11 +650,13 @@ retval.p = this.factory.set(retval.start, alts, invert); | ||
try { | ||
let alt18 = 6; | ||
switch (this.input.LA(1)) { | ||
case ANTLRv4Lexer.STRING_LITERAL: { | ||
const LA18_1 = this.input.LA(2); | ||
if (LA18_1 === Constants.DOWN) { | ||
alt18 = 1; | ||
const lookahead = this.input.LA(2); | ||
if (lookahead === Constants.DOWN) { | ||
this.match(this.input, ANTLRv4Lexer.STRING_LITERAL, null); | ||
this.match(this.input, Constants.DOWN, null); | ||
this.matchAny(this.input); | ||
this.match(this.input, Constants.UP, null); | ||
} else { | ||
if (LA18_1 === Constants.UP || LA18_1 === ANTLRv4Lexer.LEXER_CHAR_SET || LA18_1 === ANTLRv4Lexer.RANGE || LA18_1 === ANTLRv4Lexer.STRING_LITERAL || LA18_1 === ANTLRv4Lexer.TOKEN_REF) { | ||
alt18 = 3; | ||
if (lookahead === Constants.UP || lookahead === ANTLRv4Lexer.LEXER_CHAR_SET || lookahead === ANTLRv4Lexer.RANGE || lookahead === ANTLRv4Lexer.STRING_LITERAL || lookahead === ANTLRv4Lexer.TOKEN_REF) { | ||
this.match(this.input, ANTLRv4Lexer.STRING_LITERAL, null); | ||
} else { | ||
@@ -685,8 +677,11 @@ const nvaeMark = this.input.mark(); | ||
case ANTLRv4Lexer.TOKEN_REF: { | ||
const LA18_2 = this.input.LA(2); | ||
if (LA18_2 === Constants.DOWN) { | ||
alt18 = 2; | ||
const lookahead = this.input.LA(2); | ||
if (lookahead === Constants.DOWN) { | ||
this.match(this.input, ANTLRv4Lexer.TOKEN_REF, null); | ||
this.match(this.input, Constants.DOWN, null); | ||
this.matchAny(this.input); | ||
this.match(this.input, Constants.UP, null); | ||
} else { | ||
if (LA18_2 === Constants.UP || LA18_2 === ANTLRv4Lexer.LEXER_CHAR_SET || LA18_2 === ANTLRv4Lexer.RANGE || LA18_2 === ANTLRv4Lexer.STRING_LITERAL || LA18_2 === ANTLRv4Lexer.TOKEN_REF) { | ||
alt18 = 4; | ||
if (lookahead === Constants.UP || lookahead === ANTLRv4Lexer.LEXER_CHAR_SET || lookahead === ANTLRv4Lexer.RANGE || lookahead === ANTLRv4Lexer.STRING_LITERAL || lookahead === ANTLRv4Lexer.TOKEN_REF) { | ||
this.match(this.input, ANTLRv4Lexer.TOKEN_REF, null); | ||
} else { | ||
@@ -707,37 +702,2 @@ const nvaeMark = this.input.mark(); | ||
case ANTLRv4Lexer.RANGE: { | ||
alt18 = 5; | ||
break; | ||
} | ||
case ANTLRv4Lexer.LEXER_CHAR_SET: { | ||
alt18 = 6; | ||
break; | ||
} | ||
default: { | ||
throw new NoViableAltException("", 18, 0, this.input); | ||
} | ||
} | ||
switch (alt18) { | ||
case 1: { | ||
this.match(this.input, ANTLRv4Lexer.STRING_LITERAL, null); | ||
this.match(this.input, Constants.DOWN, null); | ||
this.matchAny(this.input); | ||
this.match(this.input, Constants.UP, null); | ||
break; | ||
} | ||
case 2: { | ||
this.match(this.input, ANTLRv4Lexer.TOKEN_REF, null); | ||
this.match(this.input, Constants.DOWN, null); | ||
this.matchAny(this.input); | ||
this.match(this.input, Constants.UP, null); | ||
break; | ||
} | ||
case 3: { | ||
this.match(this.input, ANTLRv4Lexer.STRING_LITERAL, null); | ||
break; | ||
} | ||
case 4: { | ||
this.match(this.input, ANTLRv4Lexer.TOKEN_REF, null); | ||
break; | ||
} | ||
case 5: { | ||
this.match(this.input, ANTLRv4Lexer.RANGE, null); | ||
@@ -750,7 +710,9 @@ this.match(this.input, Constants.DOWN, null); | ||
} | ||
case 6: { | ||
case ANTLRv4Lexer.LEXER_CHAR_SET: { | ||
this.match(this.input, ANTLRv4Lexer.LEXER_CHAR_SET, null); | ||
break; | ||
} | ||
default: | ||
default: { | ||
throw new NoViableAltException("", 18, 0, this.input); | ||
} | ||
} | ||
@@ -769,30 +731,37 @@ } catch (re) { | ||
try { | ||
let alt19 = 8; | ||
switch (this.input.LA(1)) { | ||
case ANTLRv4Lexer.RANGE: { | ||
alt19 = 1; | ||
retval.p = this.range(); | ||
break; | ||
} | ||
case ANTLRv4Lexer.DOT: { | ||
const LA19_2 = this.input.LA(2); | ||
if (LA19_2 === Constants.DOWN) { | ||
const LA19_7 = this.input.LA(3); | ||
if (LA19_7 === ANTLRv4Lexer.ID) { | ||
const LA19_10 = this.input.LA(4); | ||
if (LA19_10 === ANTLRv4Lexer.STRING_LITERAL || LA19_10 === ANTLRv4Lexer.TOKEN_REF) { | ||
alt19 = 2; | ||
const lookahead2 = this.input.LA(2); | ||
if (lookahead2 === Constants.DOWN) { | ||
const lookahead3 = this.input.LA(3); | ||
if (lookahead3 === ANTLRv4Lexer.ID) { | ||
const lookahead4 = this.input.LA(4); | ||
if (lookahead4 === ANTLRv4Lexer.STRING_LITERAL || lookahead4 === ANTLRv4Lexer.TOKEN_REF) { | ||
this.match(this.input, ANTLRv4Lexer.DOT, null); | ||
this.match(this.input, Constants.DOWN, null); | ||
this.match(this.input, ANTLRv4Lexer.ID, null); | ||
retval.p = this.terminal().p; | ||
this.match(this.input, Constants.UP, null); | ||
} else { | ||
if (LA19_10 === ANTLRv4Lexer.RULE_REF) { | ||
alt19 = 3; | ||
if (lookahead4 === ANTLRv4Lexer.RULE_REF) { | ||
this.match(this.input, ANTLRv4Lexer.DOT, null); | ||
this.match(this.input, Constants.DOWN, null); | ||
this.match(this.input, ANTLRv4Lexer.ID, null); | ||
retval.p = this.ruleref() ?? void 0; | ||
this.match(this.input, Constants.UP, null); | ||
} else { | ||
const nvaeMark = this.input.mark(); | ||
const mark = this.input.mark(); | ||
const lastIndex = this.input.index; | ||
try { | ||
for (let nvaeConsume = 0; nvaeConsume < 4 - 1; nvaeConsume++) { | ||
this.input.consume(); | ||
} | ||
this.input.consume(); | ||
this.input.consume(); | ||
this.input.consume(); | ||
throw new NoViableAltException("", 19, 10, this.input); | ||
} finally { | ||
this.input.seek(lastIndex); | ||
this.input.release(nvaeMark); | ||
this.input.release(mark); | ||
} | ||
@@ -802,16 +771,15 @@ } | ||
} else { | ||
const nvaeMark = this.input.mark(); | ||
const mark = this.input.mark(); | ||
const lastIndex = this.input.index; | ||
try { | ||
for (let nvaeConsume = 0; nvaeConsume < 3 - 1; nvaeConsume++) { | ||
this.input.consume(); | ||
} | ||
this.input.consume(); | ||
this.input.consume(); | ||
throw new NoViableAltException("", 19, 7, this.input); | ||
} finally { | ||
this.input.seek(lastIndex); | ||
this.input.release(nvaeMark); | ||
this.input.release(mark); | ||
} | ||
} | ||
} else { | ||
const nvaeMark = this.input.mark(); | ||
const mark = this.input.mark(); | ||
const lastIndex = this.input.index; | ||
@@ -823,3 +791,3 @@ try { | ||
this.input.seek(lastIndex); | ||
this.input.release(nvaeMark); | ||
this.input.release(mark); | ||
} | ||
@@ -830,10 +798,15 @@ } | ||
case ANTLRv4Lexer.WILDCARD: { | ||
const LA19_3 = this.input.LA(2); | ||
if (LA19_3 === Constants.DOWN) { | ||
alt19 = 4; | ||
const lookahead2 = this.input.LA(2); | ||
if (lookahead2 === Constants.DOWN) { | ||
this.match(this.input, ANTLRv4Lexer.WILDCARD, null); | ||
this.match(this.input, Constants.DOWN, null); | ||
this.matchAny(this.input); | ||
this.match(this.input, Constants.UP, null); | ||
retval.p = this.factory.wildcard(retval.start); | ||
} else { | ||
if (LA19_3 === ANTLRv4Lexer.EOF || LA19_3 >= Constants.UP && LA19_3 <= ANTLRv4Lexer.ACTION || LA19_3 === ANTLRv4Lexer.ASSIGN || LA19_3 === ANTLRv4Lexer.DOT || LA19_3 === ANTLRv4Lexer.LEXER_CHAR_SET || LA19_3 === ANTLRv4Lexer.NOT || LA19_3 === ANTLRv4Lexer.PLUS_ASSIGN || LA19_3 === ANTLRv4Lexer.RANGE || LA19_3 === ANTLRv4Lexer.RULE_REF || LA19_3 === ANTLRv4Lexer.SEMPRED || LA19_3 === ANTLRv4Lexer.STRING_LITERAL || LA19_3 === ANTLRv4Lexer.TOKEN_REF || LA19_3 >= ANTLRv4Lexer.BLOCK && LA19_3 <= ANTLRv4Lexer.CLOSURE || LA19_3 >= ANTLRv4Lexer.OPTIONAL && LA19_3 <= ANTLRv4Lexer.POSITIVE_CLOSURE || LA19_3 >= ANTLRv4Lexer.SET && LA19_3 <= ANTLRv4Lexer.WILDCARD) { | ||
alt19 = 5; | ||
if (lookahead2 === ANTLRv4Lexer.EOF || lookahead2 >= Constants.UP && lookahead2 <= ANTLRv4Lexer.ACTION || lookahead2 === ANTLRv4Lexer.ASSIGN || lookahead2 === ANTLRv4Lexer.DOT || lookahead2 === ANTLRv4Lexer.LEXER_CHAR_SET || lookahead2 === ANTLRv4Lexer.NOT || lookahead2 === ANTLRv4Lexer.PLUS_ASSIGN || lookahead2 === ANTLRv4Lexer.RANGE || lookahead2 === ANTLRv4Lexer.RULE_REF || lookahead2 === ANTLRv4Lexer.SEMPRED || lookahead2 === ANTLRv4Lexer.STRING_LITERAL || lookahead2 === ANTLRv4Lexer.TOKEN_REF || lookahead2 >= ANTLRv4Lexer.BLOCK && lookahead2 <= ANTLRv4Lexer.CLOSURE || lookahead2 >= ANTLRv4Lexer.OPTIONAL && lookahead2 <= ANTLRv4Lexer.POSITIVE_CLOSURE || lookahead2 >= ANTLRv4Lexer.SET && lookahead2 <= ANTLRv4Lexer.WILDCARD) { | ||
this.match(this.input, ANTLRv4Lexer.WILDCARD, null); | ||
retval.p = this.factory.wildcard(retval.start); | ||
} else { | ||
const nvaeMark = this.input.mark(); | ||
const mark = this.input.mark(); | ||
const lastIndex = this.input.index; | ||
@@ -845,3 +818,3 @@ try { | ||
this.input.seek(lastIndex); | ||
this.input.release(nvaeMark); | ||
this.input.release(mark); | ||
} | ||
@@ -853,3 +826,3 @@ } | ||
case ANTLRv4Lexer.SET: { | ||
alt19 = 6; | ||
retval.p = this.blockSet(false).p; | ||
break; | ||
@@ -859,7 +832,7 @@ } | ||
case ANTLRv4Lexer.TOKEN_REF: { | ||
alt19 = 7; | ||
retval.p = this.terminal().p; | ||
break; | ||
} | ||
case ANTLRv4Lexer.RULE_REF: { | ||
alt19 = 8; | ||
retval.p = this.ruleref() ?? void 0; | ||
break; | ||
@@ -871,56 +844,2 @@ } | ||
} | ||
switch (alt19) { | ||
case 1: { | ||
const range24 = this.range(); | ||
retval.p = range24; | ||
break; | ||
} | ||
case 2: { | ||
this.match(this.input, ANTLRv4Lexer.DOT, null); | ||
this.match(this.input, Constants.DOWN, null); | ||
this.match(this.input, ANTLRv4Lexer.ID, null); | ||
const terminal25 = this.terminal(); | ||
this.match(this.input, Constants.UP, null); | ||
retval.p = terminal25.p; | ||
break; | ||
} | ||
case 3: { | ||
this.match(this.input, ANTLRv4Lexer.DOT, null); | ||
this.match(this.input, Constants.DOWN, null); | ||
this.match(this.input, ANTLRv4Lexer.ID, null); | ||
const ruleref26 = this.ruleref(); | ||
this.match(this.input, Constants.UP, null); | ||
retval.p = ruleref26; | ||
break; | ||
} | ||
case 4: { | ||
this.match(this.input, ANTLRv4Lexer.WILDCARD, null); | ||
this.match(this.input, Constants.DOWN, null); | ||
this.matchAny(this.input); | ||
this.match(this.input, Constants.UP, null); | ||
retval.p = this.factory.wildcard(retval.start); | ||
break; | ||
} | ||
case 5: { | ||
this.match(this.input, ANTLRv4Lexer.WILDCARD, null); | ||
retval.p = this.factory.wildcard(retval.start); | ||
break; | ||
} | ||
case 6: { | ||
const blockSet27 = this.blockSet(false); | ||
retval.p = blockSet27.p; | ||
break; | ||
} | ||
case 7: { | ||
const terminal28 = this.terminal(); | ||
retval.p = terminal28.p; | ||
break; | ||
} | ||
case 8: { | ||
const ruleref29 = this.ruleref(); | ||
retval.p = ruleref29; | ||
break; | ||
} | ||
default: | ||
} | ||
} catch (re) { | ||
@@ -938,31 +857,27 @@ if (re instanceof RecognitionException) { | ||
let RULE_REF30 = null; | ||
let RULE_REF31 = null; | ||
let RULE_REF32 = null; | ||
try { | ||
let alt23 = 3; | ||
const LA23_0 = this.input.LA(1); | ||
if (LA23_0 === ANTLRv4Lexer.RULE_REF) { | ||
const LA23_1 = this.input.LA(2); | ||
if (LA23_1 === Constants.DOWN) { | ||
const lookahead = this.input.LA(1); | ||
if (lookahead === ANTLRv4Lexer.RULE_REF) { | ||
const lookahead2 = this.input.LA(2); | ||
if (lookahead2 === Constants.DOWN) { | ||
switch (this.input.LA(3)) { | ||
case ANTLRv4Lexer.ARG_ACTION: { | ||
{ | ||
const LA23_4 = this.input.LA(4); | ||
if (LA23_4 === ANTLRv4Lexer.ELEMENT_OPTIONS) { | ||
alt23 = 1; | ||
const lookahead4 = this.input.LA(4); | ||
if (lookahead4 === ANTLRv4Lexer.ELEMENT_OPTIONS) { | ||
alt23 = 1; | ||
} else { | ||
if (lookahead4 === Constants.UP) { | ||
alt23 = 2; | ||
} else { | ||
if (LA23_4 === Constants.UP) { | ||
alt23 = 2; | ||
} else { | ||
const nvaeMark = this.input.mark(); | ||
const lastIndex = this.input.index; | ||
try { | ||
for (let nvaeConsume = 0; nvaeConsume < 4 - 1; nvaeConsume++) { | ||
this.input.consume(); | ||
} | ||
throw new NoViableAltException("", 23, 4, this.input); | ||
} finally { | ||
this.input.seek(lastIndex); | ||
this.input.release(nvaeMark); | ||
const nvaeMark = this.input.mark(); | ||
const lastIndex = this.input.index; | ||
try { | ||
for (let nvaeConsume = 0; nvaeConsume < 4 - 1; nvaeConsume++) { | ||
this.input.consume(); | ||
} | ||
throw new NoViableAltException("", 23, 4, this.input); | ||
} finally { | ||
this.input.seek(lastIndex); | ||
this.input.release(nvaeMark); | ||
} | ||
@@ -996,3 +911,3 @@ } | ||
} else { | ||
if (LA23_1 === ANTLRv4Lexer.EOF || LA23_1 >= Constants.UP && LA23_1 <= ANTLRv4Lexer.ACTION || LA23_1 === ANTLRv4Lexer.ASSIGN || LA23_1 === ANTLRv4Lexer.DOT || LA23_1 === ANTLRv4Lexer.LEXER_CHAR_SET || LA23_1 === ANTLRv4Lexer.NOT || LA23_1 === ANTLRv4Lexer.PLUS_ASSIGN || LA23_1 === ANTLRv4Lexer.RANGE || LA23_1 === ANTLRv4Lexer.RULE_REF || LA23_1 === ANTLRv4Lexer.SEMPRED || LA23_1 === ANTLRv4Lexer.STRING_LITERAL || LA23_1 === ANTLRv4Lexer.TOKEN_REF || LA23_1 >= ANTLRv4Lexer.BLOCK && LA23_1 <= ANTLRv4Lexer.CLOSURE || LA23_1 >= ANTLRv4Lexer.OPTIONAL && LA23_1 <= ANTLRv4Lexer.POSITIVE_CLOSURE || LA23_1 >= ANTLRv4Lexer.SET && LA23_1 <= ANTLRv4Lexer.WILDCARD) { | ||
if (lookahead2 === ANTLRv4Lexer.EOF || lookahead2 >= Constants.UP && lookahead2 <= ANTLRv4Lexer.ACTION || lookahead2 === ANTLRv4Lexer.ASSIGN || lookahead2 === ANTLRv4Lexer.DOT || lookahead2 === ANTLRv4Lexer.LEXER_CHAR_SET || lookahead2 === ANTLRv4Lexer.NOT || lookahead2 === ANTLRv4Lexer.PLUS_ASSIGN || lookahead2 === ANTLRv4Lexer.RANGE || lookahead2 === ANTLRv4Lexer.RULE_REF || lookahead2 === ANTLRv4Lexer.SEMPRED || lookahead2 === ANTLRv4Lexer.STRING_LITERAL || lookahead2 === ANTLRv4Lexer.TOKEN_REF || lookahead2 >= ANTLRv4Lexer.BLOCK && lookahead2 <= ANTLRv4Lexer.CLOSURE || lookahead2 >= ANTLRv4Lexer.OPTIONAL && lookahead2 <= ANTLRv4Lexer.POSITIVE_CLOSURE || lookahead2 >= ANTLRv4Lexer.SET && lookahead2 <= ANTLRv4Lexer.WILDCARD) { | ||
alt23 = 3; | ||
@@ -1018,38 +933,17 @@ } else { | ||
this.match(this.input, Constants.DOWN, null); | ||
let alt20 = 2; | ||
const LA20_0 = this.input.LA(1); | ||
if (LA20_0 === ANTLRv4Lexer.ARG_ACTION) { | ||
alt20 = 1; | ||
const lookahead2 = this.input.LA(1); | ||
if (lookahead2 === ANTLRv4Lexer.ARG_ACTION) { | ||
this.match(this.input, ANTLRv4Lexer.ARG_ACTION, null); | ||
} | ||
switch (alt20) { | ||
case 1: { | ||
this.match(this.input, ANTLRv4Lexer.ARG_ACTION, null); | ||
break; | ||
} | ||
default: | ||
} | ||
this.match(this.input, ANTLRv4Lexer.ELEMENT_OPTIONS, null); | ||
if (this.input.LA(1) === Constants.DOWN) { | ||
this.match(this.input, Constants.DOWN, null); | ||
loop21: | ||
while (true) { | ||
let alt21 = 2; | ||
const LA21_0 = this.input.LA(1); | ||
if (LA21_0 >= ANTLRv4Lexer.ACTION && LA21_0 <= ANTLRv4Lexer.WILDCARD) { | ||
alt21 = 1; | ||
} else { | ||
if (LA21_0 === Constants.UP) { | ||
alt21 = 2; | ||
} | ||
} | ||
switch (alt21) { | ||
case 1: { | ||
this.matchAny(this.input); | ||
break; | ||
} | ||
default: { | ||
break loop21; | ||
} | ||
} | ||
while (true) { | ||
const lookahead3 = this.input.LA(1); | ||
if (lookahead3 >= ANTLRv4Lexer.ACTION && lookahead3 <= ANTLRv4Lexer.WILDCARD) { | ||
this.matchAny(this.input); | ||
} else if (lookahead3 === Constants.UP) { | ||
break; | ||
} | ||
} | ||
this.match(this.input, Constants.UP, null); | ||
@@ -1062,27 +956,16 @@ } | ||
case 2: { | ||
RULE_REF31 = this.match(this.input, ANTLRv4Lexer.RULE_REF, null); | ||
const ruleRef = this.match(this.input, ANTLRv4Lexer.RULE_REF, null); | ||
if (this.input.LA(1) === Constants.DOWN) { | ||
this.match(this.input, Constants.DOWN, null); | ||
let alt22 = 2; | ||
const LA22_0 = this.input.LA(1); | ||
if (LA22_0 === ANTLRv4Lexer.ARG_ACTION) { | ||
alt22 = 1; | ||
if (this.input.LA(1) === ANTLRv4Lexer.ARG_ACTION) { | ||
this.match(this.input, ANTLRv4Lexer.ARG_ACTION, null); | ||
} | ||
switch (alt22) { | ||
case 1: { | ||
{ | ||
this.match(this.input, ANTLRv4Lexer.ARG_ACTION, null); | ||
} | ||
break; | ||
} | ||
default: | ||
} | ||
this.match(this.input, Constants.UP, null); | ||
} | ||
p = this.factory.ruleRef(RULE_REF31); | ||
p = this.factory.ruleRef(ruleRef); | ||
break; | ||
} | ||
case 3: { | ||
RULE_REF32 = this.match(this.input, ANTLRv4Lexer.RULE_REF, null); | ||
p = this.factory.ruleRef(RULE_REF32); | ||
const ruleRef = this.match(this.input, ANTLRv4Lexer.RULE_REF, null); | ||
p = this.factory.ruleRef(ruleRef); | ||
break; | ||
@@ -1089,0 +972,0 @@ } |
{ | ||
"name": "antlr-ng", | ||
"version": "0.5.2", | ||
"version": "0.6.0", | ||
"description": "Next generation ANTLR Tool", | ||
@@ -43,3 +43,3 @@ "type": "module", | ||
"@unicode/unicode-16.0.0": "1.6.5", | ||
"antlr4ng-cli": "2.0.0", | ||
"antlr-ng": "0.5.2", | ||
"esbuild": "0.24.2", | ||
@@ -57,4 +57,3 @@ "eslint": "9.17.0", | ||
"prepublishOnly": "npm run build && npm run copy-templates && npm run test", | ||
"build": "npm run generate-tool-parsers && npm run generate-test-parsers && npm run generate-unicode-data && npm run esbuild && tsc -p tsconfig.json", | ||
"build:win": "npm run generate-tool-parsers:win && npm run generate-test-parsers:win && npm run generate-unicode-data && npm run esbuild && tsc -p tsconfig.json", | ||
"build": "npm run generate-action-splitter && npm run generate-antlr-parser && npm run generate-test-parsers && npm run generate-unicode-data && npm run esbuild && tsc -p tsconfig.json", | ||
"esbuild": "tsx build/build.ts", | ||
@@ -64,6 +63,10 @@ "copy-templates": "tsx build/copy-templates.ts", | ||
"test": "vitest --no-watch --no-coverage", | ||
"generate-tool-parsers": "./build/generate-tool-parsers.sh", | ||
"generate-tool-parsers:win": "pwsh -ExecutionPolicy Bypass -File build\\generate-tool-parsers.ps1", | ||
"generate-test-parsers": "./build/generate-test-parsers.sh", | ||
"generate-test-parsers:win": "pwsh -ExecutionPolicy Bypass -File build\\generate-test-parsers.ps1", | ||
"generate-action-splitter": "npm run generate-parser -- -o ./src/generated ./src/grammars/ActionSplitter.g4", | ||
"generate-antlr-parser": "npm run generate-parser -- -o ./src/generated ./src/grammars/ANTLRv4Lexer.g4 ./src/grammars/ANTLRv4Parser.g4", | ||
"generate-test-parsers": "npm run generate-testp1 && npm run generate-testp2 && npm run generate-testp3 && npm run generate-testp4", | ||
"generate-testp1": "npm run generate-parser -- -o ./tests/generated ./tests/grammars/Java.g4", | ||
"generate-testp2": "npm run generate-parser -- -o ./tests/generated ./tests/grammars/JavaLR.g4", | ||
"generate-testp3": "npm run generate-parser -- -o ./tests/generated ./tests/grammars/PositionAdjustingLexer.g4", | ||
"generate-testp4": "npm run generate-parser -- -o ./tests/generated ./tests/grammars/Psl.g4", | ||
"generate-parser": "antlr-ng -Dlanguage=TypeScript --exact-output-dir", | ||
"generate-unicode-data": "tsx ./build/generate-unicode-data.ts" | ||
@@ -70,0 +73,0 @@ }, |
@@ -35,51 +35,78 @@ [](https://github.com/mike-lischke/antlr-ng/actions/workflows/nodejs.yml)[](https://www.npmjs.com/package/antlr-ng) | ||
The first thing needed is a grammar, which defines the language you want to parse. Don't confuse that with the target language, which is the programming language for which you want to generate the parser and lexer files. | ||
There are different ways how to use the antlr-ng tool. All scenarios need Node.js being installed on your box. If you haven't done that yet get it from https://www.nodejs.org. Any version 20.x or later can be used and any platform which runs Node.js also can run antlr-ng. | ||
Here's a super simple grammar: | ||
Use cases: | ||
```antlr | ||
grammar HelloWorld; | ||
1. As a replacement for ANTLR4's Java jar. This scenario requires no knowledge of TypeScript or JavaScript. Just replace your call to java by a call to antlr-ng (with some minimal parameter changes). | ||
2. As a tool in the build setup of your TypeScript/JavaScript project. | ||
3. Directly in your code. Instantiate the tool class and do everything in memory instead of the file system. | ||
greeting: hello world EOF; | ||
### Case 1: Use antlr-ng as ANTLR4 jar replacement | ||
hello: 'hello'; | ||
world: 'world'; | ||
Install the antlr-ng tool as a global command on your box by running: | ||
WS: [ \n\t]+ -> skip; | ||
```bash | ||
npm i -g antlr-ng | ||
``` | ||
This puts it in the global NPM cache and creates a link to it in a folder which is in your system PATH. Hence you can directly execute it: | ||
```bash | ||
antlr-ng -h | ||
Usage: program [options] <grammar...> | ||
Arguments: | ||
grammar A list of grammar files. | ||
Options: | ||
-o, --output-directory <path> specify output directory where all output is generated | ||
-lib, --lib-directory <path> specify location of grammars, tokens files | ||
--atn [boolean] Generate rule augmented transition network diagrams. (default: false) | ||
-e, --encoding <string> Specify grammar file encoding; e.g., ucs-2. (default: "utf-8") | ||
-mf, --message-format [string] Specify output style for messages in antlr, gnu, vs2005. (choices: "antlr", "gnu", "vs2005", default: "antlr") | ||
-lm, --long-messages [boolean] Show exception details when available for errors and warnings. (default: false) | ||
-l, --generate-listener [boolean] Generate parse tree listener. (default: true) | ||
-v, --generate-visitor [boolean] Generate parse tree visitor. (default: false) | ||
-p, --package <name> Specify a package/namespace for the generated code. | ||
-d, --generate-dependencies [boolean] Generate file dependencies. (default: false) | ||
-D, --define <key=value...> Set/override a grammar-level option. | ||
-w, --warnings-are-errors [boolean] Treat warnings as errors. (default: false) | ||
-f, --force-atn [boolean] Use the ATN simulator for all predictions. (default: false) | ||
--log [boolean] Dump lots of logging info to antlrng-timestamp.log. (default: false) | ||
--exact-output-dir [boolean] All output goes into -o dir regardless of paths/package (default: false) | ||
-V, --version output the version number | ||
-h, --help display help for command | ||
``` | ||
This defines a set of rules that comprise a very simple language (one that can parse the input `hello world` only, but with any number of whitespaces around each word). | ||
The parameter list should look very familiar, except that it defines a short hand version and a long version of each parameter. This is why you have to update your parameter list when replacing ANTLR4 by antlr-ng. A typical invocation looks like this: | ||
Save this text as `HelloWorld.g4` file (in your project folder, where you have installed the antlr-ng node package), which you can use now to let antlr-ng generate a parser and lexer for. Open a terminal in the project root and execute: | ||
```bash | ||
npx antlr-ng -Dlanguage=TypeScript -o generated/ HelloWorld.g4 | ||
antlr-ng -Dlanguage=TypeScript --exact-output-dir -o ./tests/generated ./tests/grammars/Java.g4 | ||
``` | ||
> The tool `npx` should be installed along with your NPM binary. | ||
This will create a number of files you can ignore for now, except `HelloWorldLexer.ts` and `HelloWorldParser.ts`, which are the two classes for parsing input. We got TypeScript output because `TypeScript` was defined as target language. By using `-Dlanguage=Python3` it will instead generate .py files. | ||
### Case 2: Using antlr-ng as package in your project | ||
> Language identifiers are case-sensitive! You have to use exactly the same string as given in the list in the first paragraph. Watch out for the special identifiers for C++ and C#! | ||
In this scenario you install the tool as another dev dependecy. In your project folder run: | ||
You now can import the generated classes and write a full parser application. This is however target language dependent. For TypeScript it looks like this: | ||
```bash | ||
npm i --save-dev antlr-ng | ||
``` | ||
```typescript | ||
import { CharStream, CommonTokenStream } from 'antlr4ng'; | ||
import HelloWorldLexer from './generated/HelloWorldLexer.js'; | ||
import HelloWorldParser from './generated/HelloWorldParser.js'; | ||
You can then create an NPM script in your package.json to handle your grammar(s): | ||
const text = "hello \n \t world\n" | ||
const input = CharStream.fromString(text); | ||
const lexer = new HelloWorldLexer(input); | ||
const tokens = new CommonTokenStream(lexer); | ||
const parser = new HelloWorldParser(tokens); | ||
const tree = parser.greeting(); | ||
```json | ||
"scripts": { | ||
"generate-parser": "antlr-ng -Dlanguage=TypeScript --exact-output-dir -o ./src/generated ./src/grammars/MyGrammar.g4", | ||
... | ||
}, | ||
``` | ||
Note the use of the `greeting()` method, which was auto generated from the `greeting` parser rule. | ||
Using the generated parser in your project is subject to the target language of it. For TypeScript and JavaScript you need antlr4ng as target runtime. Read its readme file for [an example](https://github.com/mike-lischke/antlr4ng?tab=readme-ov-file#usage) how to use the generated parser. | ||
More information about target specific topics will follow as this project evolves. You can also use the [docs from the old ANTLR4 tool](https://github.com/antlr/antlr4/tree/dev/doc), but keep in mind that there might be differences (especially how to invoke the tool). | ||
Just note: antlr4ng-cli has not been updated to use antlr-ng yet. This will be done as soon as we have a production ready release of the tool. In fact antlr4ng-cli will be replaced by antlr-ng in the future. | ||
### Case 3: Using antlr-ng in your code | ||
This scenario allows you to run the generation process in memory. All unit tests in the package use this approach. Details of that will be laid out in a separate document later. | ||
# Advanced Topics | ||
@@ -86,0 +113,0 @@ |
<img src="https://raw.githubusercontent.com/mike-lischke/mike-lischke/master/images/ANTLRng2.svg" title="ANTLR Next Generation" alt="ANTLRng" width="96" height="96"/><label style="font-size: 70%">Part of the Next Generation ANTLR Project</label> | ||
# ANTLRng Release Notes | ||
# antlr-ng Release Notes | ||
## 0.6.0 | ||
Fixed two problems in the token vocab parser (key/value parsing and import location). | ||
The tool is now bootstrapping itself, that is, the parsers needed for the tool and its tests are now generated by the previous version of itself. No Java needed anymore! | ||
## 0.5.2 | ||
@@ -6,0 +12,0 @@ |
Sorry, the diff of this file is too big to display
159
20.45%3488389
-0.86%570
-0.87%105470
-2.66%