Я определил базовую c грамматику функционального выражения в Peg JS. У меня есть 2 вопроса:
У него есть внешние переменные и функции, которые я хочу предоставить при вызове parser.parse
. Что-то вроде myParser.parse("x + y", {x: 1, y: 2})
. Я взломал решение с помощью глобальных переменных, но есть ли лучший способ?
Теперь я хочу реализовать 2 типа посетителей, которые выводят либо результат выражения, используя переменные, переданные из Javascript или выведите выражение SQL, чтобы выполнить его в базе данных. Примерно так:
myParser.parse("MEAN(x, y)", "JavaScript", {x: 1, y: 2, MEAN: (args) => Math.mean(...args) })
вернет 1.5
, но:
myParser.parse("MEAN(x, y)", "SQL", {})
вернет AVG(x, y)
, выражение SQL.
В Peg есть visitor
концепция JS. Я полагаю, что мог бы написать 2 посетителей, MathVisitor
и SqlVisitor
, и настроить его на различные зависимости для обхода дерева разбора и вывода того, что я хочу. Но до сих пор я не мог понять, нужно ли мне это и как это использовать.