Как использовать debug() с парсером undefined()

Я пытаюсь отладить undefined парсер в петитпарсер.

Смотрите код без debug первый:

import "package:petitparser/petitparser.dart";

main() {
  var mynum = undefined();
  var parser = string("abc").map((s) {
    mynum.set(string("888"));
    return s;
  }) & mynum;

  var result = parser.parse("abc888");
  print(result);
}

Это печатает:

Success[1:7]: [abc, 888]

Но если я добавлю debug:

import "package:petitparser/petitparser.dart";

main() {
  var mynum = undefined();
  var parser = string("abc").map((s) {
    mynum.set(string("888"));
    return s;
  }) & mynum;

  var result = debug(parser).parse("abc888");
  print(result);
}

Это не удастся:

Instance of 'SequenceParser'
  Instance of 'ActionParser'
    Instance of 'PredicateParser'[abc expected]
    Success[1:4]: abc
  Success[1:4]: abc
  Instance of 'SetableParser'
    Instance of 'FailureParser'[undefined parser]
    Failure[1:4]: undefined parser
  Failure[1:4]: undefined parser
Failure[1:4]: undefined parser
Failure[1:4]: undefined parser

Что-то не так в моем использовании?

1 ответ

Решение

Текущая реализация Parser debug(Parser) не работает с самоизменяющимися парсерами. Его реализация использует Parser transformParser(Parser, Function) это создает преобразованную копию полного графа грамматики. Таким образом, ваша функция действия не оказывает никакого влияния на работающий код, поскольку она изменяет неиспользованную старую версию грамматики.

Я могу придумать способ исправить проблему (отладка может изменить синтаксический анализатор на месте), но, похоже, у него есть и другие недостатки. Хотите подать и выпустить на GitHub, чтобы обсудить это дальше?

Другие вопросы по тегам