我想转换
((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 :(得分:0)
请参阅my SO answer on how to write a parser。
使用此方法,您可以解析表达式,并在解析表达式时吐出代码。您可以通过这种方式轻松生成后缀。
如果要生成前缀代码,那么至少在遇到前缀操作之前,您可以避免输出。去做这个, 解析表达式并构建一棵树;然后以前缀顺序遍历树并吐出结果。