我打算在 java 中实现一个 JavaScript 解析器。我知道有几种方法可以做到这一点。有一些视图框架/引擎/解析器可以帮助做到这一点,比如:
- ANTLR 3/4 : v3 似乎只有一个 js 语法
- Mozilla Rhino:atm 我可以解析初始(顶部)命名空间上的变量名。但我无法解析嵌套范围,例如对象成员.. 嗯..
- Nashorn:也许我应该试一试..?
也许:
- 闭包编译器:恕我直言,这非常好。但不适用于“非谷歌”js-code :) 例如,您必须对您的 javascript 源应用多个编码约定才能使其正常工作..
- 也许可以调整Packer来做到这一点?是否有Packer的 Java 实现???
有与本文相关的EcmaScript 5.1。这似乎很舒服。但这并不是我要找的……而且仍然没有 java :)
我的问题是:
什么可能/将是解析 JavaScript 的最佳方式:
- (对象-)函数名称
- (对象-)成员名称,例如变量
甚至有可能做到吗?
你的方法是什么?对我来说,解析 JavaScript 的所有特殊标记并不是必需的。重要的因素是在一致的上下文中解析函数/变量,以获取如下典型标记:
// Avoid `console` errors in browsers that lack a console.
function Object() {
var method;
var noop = function() {
};
var methods = ['assert', 'clear', 'count', 'debug', 'dir', 'dirxml', 'error', 'exception', 'group', 'groupCollapsed', 'groupEnd', 'info', 'log', 'markTimeline', 'profile', 'profileEnd', 'table', 'time', 'timeEnd', 'timeStamp', 'trace', 'warn'];
var length = methods.length;
var console = (window.console = window.console || {});
while (length--) {
method = methods[length];
// Only stub undefined methods.
if (!console[method]) {
console[method] = noop;
}
}
};
var obj = new Object();
var test = "Hello World";
解析应该能够提供以下信息:
Node: Object
Node: Object.method
Node: Object.noop
Node: Object.length
Node: Object.console
Node: Object
Node: obj
Node: test
如果节点是函数/变量,则不需要任何直接确定。