Rascal: TrafoFields Синтаксическая ошибка: конкретный фрагмент синтаксиса - PullRequest
1 голос
/ 10 февраля 2020

Я пытаюсь воссоздать 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:

  • Id => ID

1 Ответ

1 голос
/ 10 февраля 2020

Ах да, это ахиллесово-исцеление от использования конкретного синтаксиса; разбирать ошибки.

Обратите внимание, что обобщенный синтаксический анализатор (такой как GLL, который использует Rascal) имитирует «неограниченный прогноз», и поэтому об ошибке синтаксического анализа может быть сообщено через несколько символов или даже несколько строк после фактической причины (но никогда раньше! ). Сокращение примера (дельта-отладка) поможет локализовать причину.

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

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