#typescript #parsing #antlr4 #grammar
Вопрос:
Хорошо, я в полном уме от этой проблемы. Я пытаюсь использовать TypeScript с ANTLR4, и независимо от того, что я делаю, я не могу понять, в чем проблема (не так много документации о цели TS для ANTLR…). Я не уверен, есть ли ошибка в моем package.json, tsconfig.json или в чем-то еще. Я продолжаю получать ошибки cannot find module antlr4ts
и другие подобные ошибки Property 'exitRule' does not exist on type...
. Я так запуталась, и любая помощь была бы абсолютно признательна.
Я пытался следовать странице GitHub, эффективно используя их точные шаги, но она ломается, как только я перехожу к этому шагу.
Моя грамматика достаточно проста, где r()
находится начальное правило синтаксического анализа. Файлы лексера/синтаксического анализатора хранятся в главном каталоге (после запуска antlr4ts). Несмотря на то, что я получаю /output/
каталог с некоторыми файлами js , я попытался свести свой проект к минимуму (даже без index.html
; просто tsconfig.json, package.json,
грамматики и файлов, созданных грамматикой).
Одна из ошибок:
Cannot find module 'antlr4ts'. Did you mean to set the 'moduleResolution' option to 'node', or to add aliases to the 'paths' option?
tsconfig.json:
{
"compilerOptions": {
"outDir": "output",
"target": "es6",
"lib": ["es6", "dom"]
},
"include": ["./*"],
"exclude": ["node_modules"]
}
пакет.json:
{
"name": "naturaldeductionthesistypescript",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo "Error: no test specified" amp;amp; exit 1",
"antlr4ts": "antlr4ts -listener MyGrammar.g4",
"compile-typescript": "tsc"
},
"author": "",
"license": "ISC",
"dependencies": {
"antlr4ts": "^0.5.0-alpha.4"
},
"devDependencies": {
"antlr4ts-cli": "^0.5.0-alpha.4",
"typescript": "^3.5.3"
}
}
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();
Грамматика
grammar MyGrammar;
r : 'hello' ID;
ID : [a-z] ;
WS : [ trn] -> skip ;
Комментарии:
1. Смогли ли вы устранить эту проблему? У меня по-прежнему много проблем.
2. @BBacon к сожалению, я просто сдался и использовал JS с ANTLR. Не стоило хлопот заставлять его работать с TS. Такой позор, что архитектура настолько сложна для запуска и запуска.
3. Привет @джошуа-кроттс github.com/DaveJacksonKC/antlr4ts-monaco-demo эта демонстрация мне очень помогла.
Ответ №1:
Странно, что у тебя с этим так много проблем. Я использовал среду выполнения TS в нескольких своих проектах и никогда не видел ничего подобного. В качестве рабочего примера проверьте это: antlr4-c3.
Вы можете увидеть файлы конфигурации там и то, как я использую среду выполнения. Для полноты картины здесь приведены конфигурационные файлы:
tsconfig.json:
{
"compilerOptions": {
"declaration": true,
"module": "commonjs",
"target": "es6",
"outDir": "out",
"removeComments": true,
"noImplicitAny": true,
"sourceMap": true,
"inlineSources": true,
"isolatedModules": false,
"allowSyntheticDefaultImports": true,
"experimentalDecorators": true,
"strictNullChecks": true
},
"compileOnSave": true,
"include": [
"src/**/*.ts", "test/**/*.ts"
],
"exclude": [
"node_modules",
".vscode-test"
]
}
Пример кода из моих модульных тестов:
...
import {
ANTLRErrorListener, CharStreams, CommonToken, CommonTokenStream, RecognitionException, Recognizer, Token,
} from "antlr4ts";
import { Override } from "antlr4ts/Decorators";
import { TerminalNode } from "antlr4ts/tree/TerminalNode";
...
const inputStream = CharStreams.fromString("var c = a b");
const lexer = new ExprLexer(inputStream);
const tokenStream = new CommonTokenStream(lexer);
const parser = new ExprParser(tokenStream);
const errorListener = new ErrorListener();
parser.addErrorListener(errorListener);
parser.expression();
expect(errorListener.errorCount, "Test 1").equals(0);