我目前正在使用JavaCC实现JavaScript / ECMAScript 5.1解析器,并且ArrayLiteral生产出现问题。
ArrayLiteral :
[ Elision_opt ]
[ ElementList ]
[ ElementList , Elision_opt ]
ElementList :
Elision_opt AssignmentExpression
ElementList , Elision_opt AssignmentExpression
Elision :
,
Elision ,
我有三个问题,我会逐一问他们。
我试图简化/重写上面描述的ArrayLiteral
制作,最后到达下面的制作(伪语法):
ArrayLiteral:
"[" ("," | AssignmentExpression ",") * AssignmentExpression ? "]"
我的第一个问题:重写是否正确?
另外两个请求:
答案 0 :(得分:1)
是的,这正确地捕获了所呈现的语法。
然而,更好的重写将是:
"[" AssignmentExpression ? ( "," AssignmentExpression ? ) * "]"
因为OP中的重写不是LL(1) - 你无法在不阅读整个AssignmentExpression
的情况下区分这些可能性 - 而使用这一个你可以通过查看第一个令牌。