Я пытаюсь воссоздать Ti js ' CurryOn16 , например, "TrafoFields", очищающий код от видео, но использующий грамматику Java18.rs c вместо его Java15.rs c. Я успешно проанализировал Пример. java в репле, как он это сделал в видео, получив переменную pt
. Затем я пытаюсь выполнить преобразование с trafoFields(pt)
. Я получаю ответ:
|project://Rascal-Test/src/TrafoFields.rsc|(235,142,<12,9>,<16,11>): Syntax error: concrete syntax fragment
Мой TrafoFields.rs c выглядит так:
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>"
}
}
Единственное отклонение от кода Ti js 'заключается в том, что я изменено ClassBodyDec*
на ClassBodyDeclaration*
, так как грамматика имеет это как нетерминальное. Любой намек, что еще может быть не так?
ОБНОВЛЕНИЕ
Больше нетерминальной перезаписи с адаптацией к грамматике Java18: