Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的JavaScript解析器_Javascript_Python_Parsing_Compiler Construction - Fatal编程技术网

Python中的JavaScript解析器

Python中的JavaScript解析器,javascript,python,parsing,compiler-construction,Javascript,Python,Parsing,Compiler Construction,至少在C和Java(Mozilla)、JavaScript(Mozilla)和Ruby中都有JavaScript解析器。目前有Python的版本吗 本质上,我不需要JavaScript解释器,只需要一个符合ECMA-262标准的解析器 快速的谷歌搜索没有发现即时的答案,所以我正在询问so社区 ,另一个用于语言识别的工具,是一个语言工具,它提供了一个框架,用于根据包含各种目标语言中动作的语法描述构造识别器、解释器、编译器和翻译器 该网站提供了许多语法,包括 碰巧有一个可用的-因此您可以直接从Pyt

至少在C和Java(Mozilla)、JavaScript(Mozilla)和Ruby中都有JavaScript解析器。目前有Python的版本吗

本质上,我不需要JavaScript解释器,只需要一个符合ECMA-262标准的解析器

快速的谷歌搜索没有发现即时的答案,所以我正在询问so社区

,另一个用于语言识别的工具,是一个语言工具,它提供了一个框架,用于根据包含各种目标语言中动作的语法描述构造识别器、解释器、编译器和翻译器

该网站提供了许多语法,包括

碰巧有一个可用的-因此您可以直接从Python调用语法生成的lexer(识别器)(祝您好运)。

您可以试试 它是一个包装器,上面是Mozilla的javascript C实现的代码名。

正如pib所提到的,是一个用Python编写的javascript标记器。它似乎有一些粗糙的边缘,但到目前为止一直在为我想要完成的工作

更新:对Pynacissus进行了另一次破解,下面是在类似访问者模式的系统中使用Pynacissus的工作方向。不幸的是,我当前的客户购买了我的下一次迭代实验,并决定不将其公开。下面代码的一个更简洁的版本是gist


如今,至少有一种更好的工具,称为:

SlimIt是一个用Python编写的JavaScript迷你程序。它编译 JavaScript转换成更紧凑的代码,以便下载和运行 更快

SlimIt还提供了一个包含JavaScript解析器的库, lexer,漂亮的打印机和树访客

演示:

假设我们有以下javascript代码:

$.ajax({
    type: "POST",
    url: 'http://www.example.com',
    data: {
        email: 'abc@g.com',
        phone: '9999999999',
        name: 'XYZ'
    }
});
现在我们需要从
数据
对象获取
电子邮件
电话
姓名

这里的想法是实例化一个
slimit
解析器,访问所有节点,过滤所有赋值并将它们放入字典:

from slimit import ast
from slimit.parser import Parser
from slimit.visitors import nodevisitor


data = """
$.ajax({
    type: "POST",
    url: 'http://www.example.com',
    data: {
        email: 'abc@g.com',
        phone: '9999999999',
        name: 'XYZ'
    }
});
"""

parser = Parser()
tree = parser.parse(data)
fields = {getattr(node.left, 'value', ''): getattr(node.right, 'value', '')
          for node in nodevisitor.visit(tree)
          if isinstance(node, ast.Assign)}

print fields
它打印:

{'name': "'XYZ'", 
 'url': "'http://www.example.com'", 
 'type': '"POST"', 
 'phone': "'9999999999'", 
 'data': '', 
 'email': "'abc@g.com'"}

我已经将esprima.js翻译成Python:

这是一个手动翻译,所以速度非常快,解析
angular.js
文件大约需要1秒(每秒10万个字符)。它支持整个ECMAScript 5.1和版本6的一部分,例如箭头函数、
const
let


或者,您也可以使用更新版本的esprima to python,它工作得很好,支持整个JavaScript 6

antlr3的两个ecmascript/javascript语法都已损坏且未维护。这是一条红鲱鱼。ANTLR 4似乎活着回来。不幸的是蜘蛛门钥匙死在上游。这太棒了!您还可以通过字典访问每个值,例如:
print fields['url']
这个2013年的库似乎无法解析Javascript类。Slimit很不错,但只支持ES5:(这不能从已解析的AST中发出JavaScript,是吗?我想修改AST并发出新的JavaScript,但它似乎不能做到这一点。@GSING2011不,它在解析方面有点困难,所以用另一种方式做已经远远超出了它的能力。我建议scrapinghub的js2xml:经过测试,工作得很好。你可以使用它并重新构建。)例如,爬虫从中捕获一些JSON数据。
{'name': "'XYZ'", 
 'url': "'http://www.example.com'", 
 'type': '"POST"', 
 'phone': "'9999999999'", 
 'data': '', 
 'email': "'abc@g.com'"}