Возможная ошибка: что означает это грамматическое правило Rascal? - PullRequest
0 голосов
/ 03 мая 2018

ТАК Я работаю над переписыванием грамматик в другие формы той же грамматики и использую функцию grammar2rascal (g), однако она выдает (на мой взгляд) странный результат при попытке переписать ограничения следования / предшествования. Мне было интересно, может ли кто-нибудь объяснить мне, что это значит и почему негодяй так работает. Я предполагаю, что негодяй внутренне переписывает некоторые вещи и поэтому придумывает это, однако я все еще хотел бы понять его значение и использование.

Итак, вот так:

lexical Id = "a" !<< [a-z]+ !>> "b";

становится:

lex("Id"){prod(lex("Id"),[conditional(iter(\char-class([range(97,122)])),{\not-follow(lit("b")),\not-precede(lit("a"))})],{})}

, который выглядит хорошо, но записывается как:

lexical Id = [a-z]+ !>> "b" !<< [a-z]+ !>> "b";

Это полностью удаляет не предшествующую "a" часть правила. Так я что-то упустил или это какая-то ошибка?

1 Ответ

0 голосов
/ 03 мая 2018

При просмотре кода grammar2rascal обнаружена ошибка, при которой precede обрабатывается некорректно. Это исправлено в 1c7fed , это должно появиться на нестабильном сайте обновлений примерно через час (16:00 CET).

И действительно, теперь он печатает, как и следовало ожидать:

lexical Id = "a" !<< [a-z]+ !>> "b";
...