Я хочу, чтобы преобразоватьСоздание AST из логического выражения
((a v b)^c) v e -> c
в
[
'implication'
[
'or',
[
'and',
[
'or',
'a',
'b'
],
'c'
],
'e'
],
'c'
]
Как это возможно?
Я предполагаю, что я должен начать с определения некоторых операторов (и тип оператора соответствует символу оператора)
var operators = {
'v' : 'or',
'^' : 'and',
'->': 'implication'
};
и затем траверс строку
// string
var infix = '((a v b)^c) v e -> c';
// remove spaces, so infix[i]!=" "
infix = infix.replace(/\s+/g, '');
// traverse through string
for (let i=0; i<infix.length; i++) {
// get token
var token = infix[i];
// if token is an operator
if (operators.indexOf(token) !== -1) {
(...)
}
// if token is parenthesis
else if (token === '(') {
(...)
}
(...)
}
, но я не знаю, как идите дальше этого.
Я предполагаю, что дерево структурировано массив будет сделано, используя что-то вроде
expression = [operators[token], expression];
так сохраняется выражение, но на вложенном уровне в массиве.
Прочитайте [Алгоритм Shunting-yard.] (Https://en.wikipedia.org/wiki/Shunting-yard_algorithm) –
Но это дает мне результат в postfix. Как я могу затем преобразовать его в вложенный массив – Jamgreen
Дело в том, что он будет анализировать его на основе приоритета. Оттуда тривиально помещать его в вложенный массив. Каждый раз, когда вы заканчиваете разбор заданного оператора и его операндов, вы помещаете их в массив. Вы делаете это рекурсивно. –