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) имитирует "неограниченный просмотр вперед", и поэтому об ошибке синтаксического анализа может быть сообщено через несколько символов или даже через несколько строк после фактической причины (но никогда раньше!). Таким образом, сокращение примера (дельта-отладка) поможет локализовать причину.

Мой образ жизни в этом таков:

  1. Сначала замените все отверстия в шаблоне конкретными фрагментами Java. Я знаю Java, поэтому у меня должен получиться написать правильный фрагмент, который соответствовал бы дыркам.
  2. Если ошибка синтаксического анализа все еще есть, теперь вы проверяете верхний нетерминальный. Это тот, который вам нужен? также убедитесь, что перед началом и после конца фрагмента внутри обратных кавычек нет лишних пробелов. По-прежнему возникает ошибка синтаксического анализа? Сначала напишите более короткий фрагмент, а сначала суб-нетерминал.
  3. Ошибка синтаксического анализа решена? это означает, что одно из отверстий шаблона было синтаксически неверным. Тип дыры здесь ведущий, это должен быть один из нетерминалов, используемых грамматикой буквально, и, конечно же, в нужном месте во фрагменте. Добавьте отверстия по очереди, пока снова не столкнетесь с ошибкой. Тогда вы знаете причину и, возможно, исправление.
Другие вопросы по тегам