Import 带ANTLR的复合文法
(环境是带有Javascript的ANTLR 4) 我有一个Test.g4语法,导入了另外两个语法(细节省略) Time.g4语法是: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
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