如何解决像 new Date().getTime() 这样的表达式中的歧义?

How to solve ambiguity in an expression like new Date().getTime()?

我们正在使用 Rascal 开发新版本的 JavaScript 语法。根据语言规范(第 6 版)和现有的 JavaScript 语法,以下是表达式的有效产生式:

syntax Expression = ... 
                  | new: "new" Expression
                  | call: Expression Args

syntax Args = ... 

但是,当我们尝试解析像 "new Date().getTime()" 这样的表达式时,我们会遇到歧义错误。我们尝试使用 "left" 和“>”运算符的组合来修复它,例如

| left "new" Expression
> Expression Args

但我们无法解决问题。我相信这可能很容易解决,但花了几个小时后,我们无法找到解决方案。

我已尝试在此处完成您的示例,并且在不引发 Ambiguity() 异常的情况下工作。

module Test

import IO;
import ParseTree;

lexical Ident = [A-Za-z]+ !>> [a-zA-Z];
layout Whitespace = [\t\n\r\ ]*;

syntax Expression 
  = Ident
  | "new" Expression
  > Expression "(" {Expression ","}* ")"
  > right Expression "." Expression
  ;

void main() {
  Expression ex = parse(#Expression, "a().b()");
  println(ex);

  Expression ex2 = parse(#Expression, "new a().b()");
  println(ex2);
}