Составные грамматики с 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

Что я делаю неправильно?

Заранее спасибо, РГ

0 ответов

Другие вопросы по тегам