我正在寻求实现Shunting-yard Algorithm,但我需要一些帮助来确定将字符串拆分为其标记的最佳方法是什么。
如果您注意到,该算法的第一步是“读取令牌”。这不是一件非常重要的事情。令牌可以包括数字,运算符和parens。
如果您正在做类似的事情:
(5 + 1)
一个简单的string.split()会给我一个标记数组{“(”,“”,“,”+“,”1“,”)“}。
但是,如果您有多位数字,例如:
,则会变得更加复杂((2048 * 124)+ 42)
现在一个天真的string.split()不会做的伎俩。多位数是一个问题。
我知道我可以写一个词法分析器,但是如果没有写一个成熟的词法分析器,有没有办法做到这一点?
我在JavaScript中实现这一点,我想避免在可能的情况下沿着词法路径走。 我将使用“*”,“+”,“ - ”和“/”运算符以及整数。
答案 0 :(得分:6)
正则表达式怎么样?您可以轻松编写正则表达式以按您希望的方式拆分它,JS string.split方法也接受正则表达式作为参数。
例如......(修改以包含您需要的所有字符等)
/([0-9]+|[*+-\/()])/
答案 1 :(得分:2)
您可以按照http://mikesamuel.blogspot.com/2009/05/efficient-parsing-in-javascript.html
中所述使用全局匹配基本上,您创建一个描述令牌
的正则表达式/[0-9]+|false|true|\(|\)/g
并将'g'放在末尾,使其全局匹配,然后调用其匹配方法
var tokens = myRegex.match(inputString);
并取回一个数组。