有没有一种简单的方法可以在没有完整的词法分析器的情况下对字符串进行标记?

时间:2009-10-19 18:51:40

标签: javascript computer-science tokenize lexer shunting-yard

我正在寻求实现Shunting-yard Algorithm,但我需要一些帮助来确定将字符串拆分为其标记的最佳方法是什么。

如果您注意到,该算法的第一步是“读取令牌”。这不是一件非常重要的事情。令牌可以包括数字,运算符和parens。

如果您正在做类似的事情:

  

(5 + 1)

一个简单的string.split()会给我一个标记数组{“(”,“”,“,”+“,”1“,”)“}。

但是,如果您有多位数字,例如:

,则会变得更加复杂
  

((2048 * 124)+ 42)

现在一个天真的string.split()不会做的伎俩。多位数是一个问题。

我知道我可以写一个词法分析器,但是如果没有写一个成熟的词法分析器,有没有办法做到这一点?

我在JavaScript中实现这一点,我想避免在可能的情况下沿着词法路径走。  我将使用“*”,“+”,“ - ”和“/”运算符以及整数。

2 个答案:

答案 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);

并取回一个数组。