如何解决像 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);
}
我们正在使用 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);
}