2014-02-12 51 views
1

我写在JavaScript解析器的嵌套数组变成这样:解析字符串转换操作数和运算

"(1 + 2 - (4 - 3))" 

成这样:

[1, "+", 2, "-", [4, "-", 3]] 

我目前拥有的代码是:

function parse(string) { 
    string = string.split(" ") 
    string = string.replace(/(/g, [).replace(/)/g, ]) //This part does not work 
} 

如何在不使用第三方工具(如解析器生成器)的情况下以最有效的方式执行此操作?

+0

你是否指'''数组?因为你想要一个字符串,它会是这样的:http://jsfiddle.net/USCZT/。如果没有,你可能需要一个正则表达式。 –

+0

按'[',我的意思是数组。我将如何使用正则表达式呢? – eax

回答

0

我没有测试过这一点,但是这可能会给你这样的一个方法的总体思路:

function parse(str) { 
    var tokens = []; 
    var chars = str.split(''); 
    var currToken, currChar; 

    chars = sanitize(chars); // remove invalid chars and whitespace 

    for (var i = 0; i < chars.length; i++) { 
    currChar = chars[i]; 
    if (currChar === '(') { 
     currToken = parse(chars.slice(i + 1).join('')); // recurse 
     tokens.append(currToken); 
     i += currToken.length + 1; // skip '(' and characters covered by currToken 
    } 
    else if (currChar === ')') { // note that this assumes there is always one ')' for every '(' 
     break; // base case, terminates recursion 
    } 
    else { 
     tokens.append(currChar); 
    } 
    } 

    return tokens; 
} 

没写sanitize,但你可以自己写。请注意,如果每个开口大括号没有匹配的大括号,则上述函数会中断。你可以通过另一个函数来预先验证或修复字符串。

0

这是你正在尝试做什么?

string = "(1 + 2 - (4 - 3))"; 
string = string.split(" "); 
var newStr = []; 
for (var i = 0;i < string.length; i++) 
{ 
    string[i] = string[i].replace(/\(/g,'[').replace(/\)/g,']'); 
    newStr.push(string[i]); 
} 

alert(newStr); 

fiddle

+0

不,我想用'['',用括号表示数组的开头来代替''['''。 – eax

+0

@eax也许我想念你想要做的事情。但检查出更新的小提琴。这对你有帮助吗? – Popo

相关问题