我已经实现了ANTLR4的基本语法,以使用简单Javascript风格的语言构建JavaScript解释器。
当我运行脚本以转换代码(解析/生成/转译)时,我得到 TypeError: ctx.INT is not a function了来自转译器文件的代码。
这是我要编译的脚本
var fs = require('fs');
var antlr4 = require('antlr4');
var buildAst = require('./build-ast');
var mylangTranspiler = require('./mylang-transpiler');
function runScript(inputText) {
var ast = buildAst(inputText);
var transpiler = new mylangTranspiler();
antlr4.tree.ParseTreeWalker.DEFAULT.walk(transpiler, ast);
// eval(transpiler.output);
fs.writeFile("./main.js", transpiler.output, function(err) {
if(err) {
return console.log(err);
}
console.log("The file was saved!");
});
}
var contents = fs.readFileSync('./tests/test.mylang', 'utf8');
console.log(contents);
runScript(contents);
module.exports = runScript;
这是捕获错误的地方
mylangTranspiler.prototype.resolveExpr = function(ctx) {
console.log(ctx);
if (ctx.INT() != null) {
return ctx.INT().getText();
} else if (ctx.ID() != null) {
return ctx.ID().getText();
} else if (ctx.STRING() != null) {
return ctx.STRING().getText().replace(/\$\{([^\}]+)\}/g, '" + $1 + "');
} else return "undefined";
}
这是我的语法文件
grammar mylang;
compilationUnit: stmt*;
stmt
: assignStmt
| invocationStmt
;
assignStmt: SET ID TO expr;
invocationStmt: ID ((expr COMMA)* expr)?;
expr: expr (MUL | DIV) expr # MulDiv
| expr (ADD | SUB) expr # AddSub
| LPAREN expr RPAREN # Parens
| ID # ID
| INT # Int
| STRING # String
;
INT: [0-9]+;
STRING : '"' .*? '"' ;
ID: [a-zA-Z_] [a-zA-Z0-9_]*;
COMMA: ',';
SAY: 'show';
SET: 'set';
TO: 'to';
MUL: 'times';
DIV: 'by';
ADD: 'add';
SUB: 'sub';
LPAREN: '(';
RPAREN: ')';
WS : [ \t\r\n]+ -> skip;
我试图实现的是基本的计算器操作,变量分配和向控制台的打印,但是具有不同的语法,这些语法将转换为JavaScript。
GCT1015
相关分类