Цель типографского текста ANTLR4 не может найти ни модули, ни свойства?

#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);