1

Я хочу, чтобы преобразоватьСоздание 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]; 

так сохраняется выражение, но на вложенном уровне в массиве.

+0

Прочитайте [Алгоритм Shunting-yard.] (Https://en.wikipedia.org/wiki/Shunting-yard_algorithm) –

+0

Но это дает мне результат в postfix. Как я могу затем преобразовать его в вложенный массив – Jamgreen

+0

Дело в том, что он будет анализировать его на основе приоритета. Оттуда тривиально помещать его в вложенный массив. Каждый раз, когда вы заканчиваете разбор заданного оператора и его операндов, вы помещаете их в массив. Вы делаете это рекурсивно. –

ответ

0

См. my SO answer on how to write a parser.

Используя это, вы можете анализировать выражение и выплевывать код при анализе выражения. Вы можете легко создать постфикс.

Если вы хотите сгенерировать префиксный код, у вас есть способ избежать выполнения вывода до тех пор, пока вы не столкнетесь с префиксной операцией. Для этого разобрать выражение и построить дерево; затем пройдите дерево в порядке префикса и выплюните результат.

+0

Я уже прочитал ваш ответ, но, боюсь, я этого не понимаю. Я не понимаю фрагменты кода и как его можно использовать для простой логики высказываний. Я предполагаю, что мой язык BNF определяется как 'p :: = p | ~ p |^| v | -> | <-> ', но я не знаю, как его использовать с вашими примерами. – Jamgreen

+1

Ваш BNF не является нормальным. Во-первых, он не показывает, как операнды относятся к операторам. Обычно языки выражений допускают скобки; твой нет, и это кажется подозрительным. Найдите пример небольшого выражения langauge, перепишите его и вернитесь с другим определением. Если вам нужна помощь в определении вашего BNF, запустите другой вопрос SO. –

Смежные вопросы