【问题标题】:Get tokens from a JavaScript code从 JavaScript 代码中获取令牌
【发布时间】:2016-03-25 11:27:39
【问题描述】:

我想用 JavaScript/Node 编写一个简单的解释器。在生成令牌时遇到了障碍。

var code = 'if (a > 2 && b<4) c = 10;';

code.match(/\W+/g)
// [" (", " > ", " && ", "<", ") ", ";"]

code.match(/\w+/g)
// ["if", "a", "2", "b", "4", "elo"]

如图所示,W+ 让我获取特殊字符,w+ 让我获取单词。我想知道如何将它们放在一个数组中,如下所示:

// ["if", "(", "a", ">", "2", "&&", "b", "<", "4", ")", "c", "=", "10", ";"]

【问题讨论】:

  • \W+ 非常幼稚,考虑(!a+-1)/\w+|\W+/ 将生成(! , a , +-, 1, ),而正确的标记是(, !, a, +, -1, )
  • 你不能用正则表达式解析 JS。它没有必要的解析能力。
  • @torazaburo 你能提出更好的建议吗?
  • 是的,使用解析算法编写一个实际的解析器。除非您将此作为练习,否则最好从几个现有的 JS 解析器之一开始,例如 esprima。

标签: javascript regex compiler-construction


【解决方案1】:

如图所示,W+ 让我获取特殊字符,w+ 让我获取单词。 我想知道如何将它们放在一个数组中,如下所示:

试试这个

code.match(/\w+|\W+/g)

输出为

["if", " (", "a", " > ", "2", " && ", "b", "<", "4", ") ", "c", " = ", "10", ";"]

这也会修剪标记

var tokens = code.match(/\w+|\W+/g).map(function(value){return value.trim()});

【讨论】:

  • 然而,如果codeif (!a) 类似,我将得到(! 而不是独立的(!
  • @DamianCzapiewski 你能分享你试过的字符串吗?
  • @DamianCzapiewski 检查了这个输入。我不认为从这里开始(直到我给出代码的阶段)你可以依赖基于正则表达式的分离标记。您现在需要迭代标记并根据 JavaScript 语言语法分离它们。
猜你喜欢
  • 2016-01-06
  • 1970-01-01
  • 1970-01-01
  • 2011-09-08
  • 2018-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-05
相关资源
最近更新 更多