我正在尝试重新创建 Tijs 的CurryOn16示例“TrafoFields”,从视频中抓取代码,但使用 Java18.rsc 语法而不是他的 Java15.rsc。我已经在 repl 中成功解析了 Example.java ,就像他在视频中所做的那样,产生了一个 var pt
。然后我尝试用trafoFields(pt)
. 我得到的回应是:
|project://Rascal-Test/src/TrafoFields.rsc|(235,142,<12,9>,<16,11>): Syntax error: concrete syntax fragment
我的 TrafoFields.rsc 看起来像这样:
module TrafoFields
import lang::java::\syntax::Java18;
/**
* - Make public fields private
* - add getters and setters
*/
start[CompilationUnit] trafoFields(start[CompilationUnit] cu) {
return innermost visit (cu) {
case (ClassBody)`{
' <ClassBodyDeclaration* cs1>
' public <Type t> <ID f>;
' <ClassBodyDeclaration* cs2>
'}`
=> (ClassBody)`{
' <ClassBodyDeclaration* cs1>
' private <Type t> <ID f>;
' public void <ID setter>(<Type t> x) {
' this.<ID f> = x;
' }
' public <Type t> <ID getter>() {
' return this.<ID f>;
' }
' <ClassBodyDeclaration* cs2>
'}`
when
ID setter := [ID]"set<f>",
ID getter := [ID]"get<f>"
}
}
与 Tijs 代码的唯一偏差是我已更改ClassBodyDec*
为ClassBodyDeclaration*
,因为语法将此作为非终端。任何提示还有什么可能是错的?
更新
更多适应Java18语法的非终端重写:
- 身份证=>身份证