Javascript对象解析

时间:2011-11-11 04:36:05

标签: javascript parsing

我正在尝试解析javascript(使用javascript),我遇到了对象的问题。 javascript如何确定对象或块之间的区别?

例如

{ x : 1, y : 2}

令牌流:

[{][x][:][1][,][y][:][2][}]

显然是一个对象,但是

{ var x = 1; var y = 2}

令牌流:

[{][var][x][=][1][;][var][y][=][2][}]

是一个完全有效的匿名JavaScript块。我如何有效地将每个令牌流识别为对象或块?

然而,更重要的是,我将如何确定可以是对象的令牌流或块之间的区别如下:

{ a : null }

令牌流:

[{][a][:][null][}]

这可以是参数a等于null的对象,它可以是块中的第一个语句(null)具有标签的块({{ 1}})

2 个答案:

答案 0 :(得分:3)

你没有。

语法的上下文会影响它的身份。你不能只是将事物脱离背景并确定它们是什么。

在语法中,对象文字是:

'{' (propertyNameAndValueList)? '}'

而块是:

'{' (statementList)? '}'

但只有在允许表达式的情况下才存在文字,而在允许语句的地方存在块。那些不是一回事。

因此,周围的背景区分了两种形式。

答案 1 :(得分:2)

通常,表达式可以是语句,但语法中的表达式有两个例外:

ExpressionStatement :
    [lookahead ∉ {{, function}] Expression ;

字体在这里并不完全正确,但它们的含义是,只有当第一个标记既不是' {'也没有'功能'。

ECMAScript 5.1规范第12.4节中的说明中阐明了这一点:

  

注意ExpressionStatement不能以开括号大括号开头,因为这可能会使其与Block不一致。此外,ExpressionStatement不能以function关键字开头,因为这可能使其与FunctionDeclaration不一致。