Составные грамматики с ANTLR
(Среда - ANTLR 4 с Javascript)
У меня есть грамматика Test.g4, импортирующая две другие грамматики (подробности опущены).
grammar Test;
import Time, Basic;
request: PERIOD '=' exp=interval;
PERIOD: [Pp][Ee][Rr][Ii][Oo][Dd];
Грамматика Time.g4:
grammar Time;
epoch: Digit Digit Digit Digit Digit Digit Digit Digit Digit Digit Digit Digit Digit;
interval: '[' from=epoch ',' to=epoch ']';
Digit: DIGIT;
fragment DIGIT: [0-9];
Грамматика Basic.g4:
grammar Basic;
any: DECIMAL_LITERAL;
DECIMAL_LITERAL: DIGIT+;
fragment DIGIT: [0-9];
Для грамматики времени существует специальный посетитель:
const Time = superclass => class extends superclass {
constructor() {
super();
superclass.call(this);
return this;
}
visitEpoch(ctx) {
return parseInt(ctx.getText());
}
visitInterval(ctx) {
var from = parseInt(this.visit(ctx.from));
var to = parseInt(this.visit(ctx.to));
return { from: from, to: to }
}
}
exports.Time = Time;
Код теста:
#!/usr/bin/env node
const antlr4 = require('antlr4');
const TestLexer = require('./TestLexer').TestLexer;
const TestParser = require('./TestParser').TestParser;
const TestVisitor = require('./TestVisitor').TestVisitor;
const Time = require('./time').Time;
class Visitor extends Time(TestVisitor) {
run(chars) {
var stream = new antlr4.InputStream(chars);
var lexer = new TestLexer(stream);
var tokens = new antlr4.CommonTokenStream(lexer);
var parser = new TestParser(tokens);
parser.buildParseTrees = true;
var tree = parser.request();
var result = this.visitRequest(tree);
console.log(result[2]);
}
}
var time = new Visitor();
time.run('period=[1234567890123,1234567890888]');
Если я импортирую только грамматику времени, все работает нормально. Однако, если я импортирую и Time, и Basic грамматики, я получаю следующие ошибки:
line 1:8 mismatched input '1234567890123' expecting Digit
line 1:22 mismatched input '1234567890888' expecting Digit
Что я делаю неправильно?
Заранее спасибо, РГ