使用 ANTLR4 v4.8
我正在编写转译器探索使用 ANTLR(带有访问者的 javascript 目标)。
语法 -> lex/parse 很好,我现在坐在解析树上。
语法
grammar Mygrammar;
/*
* parser rules
*/
progm : stmt+;
stmt
: progdecl
;
progdecl : PROGDECLKW ID '..';
print : WRITEKW STRLIT '..';
/*
* lexer rules
*/
PROGDECLKW : 'DECLAREPROGRAM';
WRITEKW : 'PRINT';
// Literal
STRLIT : '\'' .*? '\'' ;
// Identifier
ID : [a-zA-Z0-9]+;
// skip
LINE_COMMENT : '*' .*? '\n' -> skip;
TERMINATOR : [\r\n]+ -> skip;
WS : [ \t\n\r]+ -> skip;
hw.mg
***************
* Hello world
***************
DECLAREPROGRAM hw..
PRINT 'Hello World!'..
index.js
...
const myVisitor = require('./src/myVisitor').myVisitor;
const input = './src_sample/hw.mg';
const chars = new antlr4.FileStream(input);
...
parser.buildParseTrees = true;
const myVisit = new myVisitor();
myVisit.visitPrint(parser.print());
访问者的使用似乎并不简单,这篇 SO帖子在一定程度上有所帮助。
关于上下文的使用。当我点击每个节点时,有没有一种跟踪 ctx 的好方法?
用作myVisit.visit(tree)起始上下文很好。当我开始访问每个节点时,使用非根上下文
myVisit.visitPrint(parser.print())会引发错误。
错误:
PrintContext {
parentCtx: null,
invokingState: -1,
ruleIndex: 3,
children: null,
start: CommonToken {
source: [ [MygrammarLexer], [FileStream] ],
type: -1,
channel: 0,
start: 217,
与exception: InputMismatchException [Error]
我一起相信这是因为children它null不是被填充的。
这反过来又是由于 line 9:0 mismatched input '<EOF>' expecting {'DECLAREPROGRAM', 'PRINT'}
问题:
上面是传递上下文的唯一方法还是我做错了?如果使用正确,那么我倾向于将其报告为错误。
编辑 17.3 - 添加语法和源代码
慕村9548890
相关分类