ANTLR4 TypeScript目标找不到模块及相关属性问题如何解决
问题根因
- 缺失模块解析配置:当前tsconfig.json未配置
moduleResolution字段,TypeScript 3.5.3在target设置为es6时默认使用classic模块解析策略,不会检索node_modules目录下的第三方包,因此无法识别antlr4ts依赖。 - 生成文件导入路径错误:main.ts中导入antlr4ts生成的词法、语法分析器时未添加相对路径前缀,TypeScript会将其识别为第三方包而非本地文件,触发找不到模块或属性不存在的报错。
- 若使用全局安装的antlr4ts-cli生成语法文件,可能出现cli版本与项目依赖的antlr4ts版本不匹配的情况,也会触发
Property 'exitRule' does not exist类报错。
解决方案
1. 修改tsconfig.json配置
在compilerOptions中新增moduleResolution、esModuleInterop配置,修改后完整配置如下:
{ "compilerOptions": { "outDir": "output", "target": "es6", "lib": ["es6", "dom"], "moduleResolution": "node", "esModuleInterop": true }, "include": ["./*"], "exclude": ["node_modules"] }
2. 修正main.ts的导入路径
将本地生成的词法、语法分析器导入路径改为相对路径,修改后代码如下:
import { ANTLRInputStream, CommonTokenStream } from 'antlr4ts'; import { MyGrammarLexer } from './MyGrammarLexer'; import { MyGrammarParser } from './MyGrammarParser'; // Create the lexer and parser let inputStream = new ANTLRInputStream("text"); let lexer = new MyGrammarLexer(inputStream); let tokenStream = new CommonTokenStream(lexer); let parser = new MyGrammarParser(tokenStream); // Parse the input, where `compilationUnit` is whatever entry point you defined let tree = parser.r();
3. 重新执行构建流程
按顺序执行以下命令:
- 安装依赖:
npm install - 生成语法对应的TS文件:
npm run antlr4ts - 编译TypeScript代码:
npm run compile-typescript - 运行测试:
node output/main.js
如果之前使用过全局安装的antlr4ts-cli,先执行npm uninstall -g antlr4ts-cli卸载全局版本,避免版本不匹配问题。
内容的提问来源于stack exchange,提问作者Joshua Crotts
相关产品推荐
相关产品推荐

