Rascal: TrafoFields Синтаксическая ошибка: конкретный фрагмент синтаксиса
Я пытаюсь воссоздать пример Tijs CurryOn16 "TrafoFields", очищая код от видео, но используя грамматику Java18.rsc вместо его Java15.rsc. Я успешно проанализировал Example.java в ответе, как он это сделал в видео, и получил varpt
. Затем я пытаюсь сделать преобразование с помощью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:
- Id => ID
1 ответ
Ах да, это ахиллесово исцеление от использования конкретного синтаксиса; ошибки разбора.
Обратите внимание, что обобщенный синтаксический анализатор (такой как GLL, который использует Rascal) имитирует "неограниченный просмотр вперед", и поэтому об ошибке синтаксического анализа может быть сообщено через несколько символов или даже через несколько строк после фактической причины (но никогда раньше!). Таким образом, сокращение примера (дельта-отладка) поможет локализовать причину.
Мой образ жизни в этом таков:
- Сначала замените все отверстия в шаблоне конкретными фрагментами Java. Я знаю Java, поэтому у меня должен получиться написать правильный фрагмент, который соответствовал бы дыркам.
- Если ошибка синтаксического анализа все еще есть, теперь вы проверяете верхний нетерминальный. Это тот, который вам нужен? также убедитесь, что перед началом и после конца фрагмента внутри обратных кавычек нет лишних пробелов. По-прежнему возникает ошибка синтаксического анализа? Сначала напишите более короткий фрагмент, а сначала суб-нетерминал.
- Ошибка синтаксического анализа решена? это означает, что одно из отверстий шаблона было синтаксически неверным. Тип дыры здесь ведущий, это должен быть один из нетерминалов, используемых грамматикой буквально, и, конечно же, в нужном месте во фрагменте. Добавьте отверстия по очереди, пока снова не столкнетесь с ошибкой. Тогда вы знаете причину и, возможно, исправление.