Код: Выделить всё
import antlr4 from 'antlr4';
import MyGrammarLexer from './QueryLexer.js';
import MyGrammarParser from './QueryParser.js';
import MyGrammarListener from './QueryListener.js';
const input = "field = 123 AND items in (1,2,3)"
const chars = new antlr4.InputStream(input);
const lexer = new MyGrammarLexer(chars);
const tokens = new antlr4.CommonTokenStream(lexer);
const parser = new MyGrammarParser(tokens);
const tree = parser.MyQuery();
Сначала я попробовал следующее:
Код: Выделить всё
// imports...
import _ from "lodash/fp.js";
const parse = _.compose([
_.invoke("MyQuery"),
MyGrammarParser,
antlr4.CommonTokenStream,
MyGrammarLexer,
antlr4.InputStream,
]);
Вставка нового on Каждая строка внутри _.compect (кроме _.invoke ) сбоя с TypeError: невозможно прочитать свойства неопределенного (чтение 'длины') при new Antlr4.inputStream . < /p>
Вместо этого я могу использовать вспомогательную функцию: < /p>
Код: Выделить всё
// imports...
import _ from "lodash/fp.js";
_.construct = Constructor => param => new Constructor(param);
const parse = _.compose([
_.invoke("MyQuery"),
_.construct(MyGrammarParser),
_.construct(antlr4.CommonTokenStream),
_.construct(MyGrammarLexer),
_.construct(antlr4.InputStream),
]);
const tree = parse("field = 123 AND items in (1,2,3)");
< /code>
Это работает, и IMO выглядит намного лучше, чем оригинал, но я хочу знать, есть ли способ написать это с помощью встроенных функций JavaScript или Lodash. Насколько я знаю, невозможно передать конструктор в качестве параметра, как если бы он был обычной функцией, следовательно, _.construct
В итоге я хочу Чтобы пройти конструктор в качестве параметра, как если бы он был обычной функцией, не имея сначала обернуть его в вспомогательную функцию. Руководство, однако решением этого вопроса должно быть Lodash/antlr 4 независимо.
Подробнее здесь: https://stackoverflow.com/questions/794 ... in-javascr