Import 带ANTLR的复合文法

Import 带ANTLR的复合文法,import,grammar,composite,antrl4,Import,Grammar,Composite,Antrl4,(环境是带有Javascript的ANTLR 4) 我有一个Test.g4语法,导入了另外两个语法(细节省略) 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]; g

(环境是带有Javascript的ANTLR 4)

我有一个Test.g4语法,导入了另外两个语法(细节省略)

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];
grammar Basic;
any: DECIMAL_LITERAL;
DECIMAL_LITERAL: DIGIT+;
fragment DIGIT: [0-9];
Basic.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];
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]');
如果我只导入时间语法,一切正常。但是,如果同时导入时间语法和基本语法,则会出现以下错误:

line 1:8 mismatched input '1234567890123' expecting Digit
line 1:22 mismatched input '1234567890888' expecting Digit
我做错了什么

提前谢谢大家,,
RG

当您只导入
基本语法时会发生什么?它不会编译,因为“间隔”规则是在时间上定义的。g4当您只导入
基本语法时会发生什么?它不会编译,因为“间隔”规则是在时间上定义的。g4