You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决new Date().getTime()表达式的歧义?Rascal JS语法开发求助

解决Rascal中JavaScript语法的new Date().getTime()歧义问题

我来帮你搞定这个歧义问题!首先得弄明白为什么会出现这个错误:当解析new Date().getTime()时,Rascal的解析器面临两种可能的解析路径:

  1. 正确路径:先解析new Date()得到一个NewExpression,再将其作为调用对象,结合后面的getTime()组成CallExpression
  2. 错误路径:把Date().getTime()当成new的参数,也就是解析成new (Date().getTime())

你之前尝试用left "new" Expression > Expression Args没解决问题,核心原因是优先级搞反了,而且left修饰符在这里根本不适用——left是给中缀运算符(比如+、*)指定左结合性的,而new是前缀表达式,不需要这个修饰符。

正确的修复方案

我们需要明确CallExpression的优先级高于NewExpression,这样解析器会优先把new Date()作为一个完整的表达式,再和后面的调用部分结合。修改你的语法定义如下:

syntax Expression 
    = call: Expression Args
    > new: "new" Expression
    | ... ; // 这里放你已有的其他表达式产生式,比如PrimaryExpression等

syntax Args = "(" (Expression ("," Expression)*)? ")" ;

如果你的语法里还包含成员访问(比如.操作符),记得也要把MemberExpression的优先级设得比CallExpression高(符合ECMAScript规范),这样Date().getTime()会先被解析成成员访问表达式,再参与后续解析:

syntax Expression 
    = call: Expression Args
    > member: Expression "." Identifier
    > new: "new" Expression
    | ... ;

为什么这样有效?

在Rascal的语法规则里,>表示左边的产生式优先级高于右边的。把call放在new的左边,意味着解析器会优先尝试匹配call模式——也就是先把new Date()当成一个完整的Expression,再和后面的Args组合成调用表达式,而不会错误地把Date().getTime()当成new的参数。

这样修改后,new Date().getTime()就会被正确解析,歧义错误也就消失啦!

内容的提问来源于stack exchange,提问作者Rodrigo Bonifacio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:57:15