【发布时间】:2014-11-13 12:16:52
【问题描述】:
我目前使用 JavaCC 实现 JavaScript/ECMAScript 5.1 解析器,但 ArrayLiteral 生产存在问题。
ArrayLiteral :
[ Elision_opt ]
[ ElementList ]
[ ElementList , Elision_opt ]
ElementList :
Elision_opt AssignmentExpression
ElementList , Elision_opt AssignmentExpression
Elision :
,
Elision ,
我有三个问题,我会一一问。
这是第二个。
我已将这个产生式简化为以下形式:
ArrayLiteral:
"[" ("," | AssignmentExpression ",") * AssignmentExpression ? "]"
正确与否请看第一个问题:
How to simplify JavaScript/ECMAScript array literal production?
现在我尝试在JavaCC中实现如下:
void ArrayLiteral() :
{
}
{
"["
(
","
| AssignmentExpression()
","
) *
(
AssignmentExpression()
) ?
"]"
}
JavaCC 抱怨 , 或 AssignmentExpression(其内容)模棱两可。显然,需要LOOKAHEAD 规范。我花了很多时间试图弄清楚LOOKAHEADs,尝试了不同的东西,比如
-
LOOKAHEAD (AssignmentExpression() ",")在(...)* -
LOOKAHEAD (AssignmentExpression() "]")在(...)?
还有其他一些变体,但我无法摆脱 JavaCC 警告。
我不明白为什么这不起作用:
void ArrayLiteral() :
{
}
{
"["
(
LOOKAHEAD ("," | AssignmentExpression() ",")
","
| AssignmentExpression()
","
) *
(
LOOKAHEAD (AssignmentExpression() "]")
AssignmentExpression()
) ?
"]"
}
好的,AssignmentExpression() 本身是模棱两可的,但 LOOKAHEADs 中的尾随 "," 或 "]" 应该清楚应该采取哪些选择 - 还是我在这里弄错了?
此产品的正确LOOKAHEAD 规范是什么样的?
更新
不幸的是,这不起作用:
void ArrayLiteral() :
{
}
{
"["
(
","
|
LOOKAHEAD (AssignmentExpression() ",")
AssignmentExpression()
","
) *
(
AssignmentExpression()
) ?
"]"
}
警告:
Warning: Choice conflict in (...)* construct at line 6, column 5.
Expansion nested within construct and expansion following construct
have common prefixes, one of which is: "function"
Consider using a lookahead of 2 or more for nested expansion.
第 6 行在第一个 LOOKAHEAD 之前是 (。公共前缀"function" 只是AssignmentExpression 的可能开头之一。
【问题讨论】:
标签: javascript parsing grammar ecmascript-5 javacc