可能的错误:这个 Rascal 语法规则的含义是什么?

Possible bug: What is the meaning of this Rascal grammar-rule?

所以我正在努力将语法重写为相同语法的其他形式,并且正在使用函数 grammar2rascal(g),但是它在尝试回写时会产生(在我看来)奇怪的结果 follow/precede 限制。我想知道是否有人可以向我解释这意味着什么以及为什么 rascal 会这样工作。我假设 rascal 在内部重写了一些东西,因此想到了这个,但是我仍然想了解它的含义和用途。

所以这里是:

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" 开头的部分。那么我是不是遗漏了什么或者这是某种错误?

查看 grammar2rascal 的代码,存在 precede 处理不正确的错误。这已在 1c7fed 中修复,这应该会在大约一个小时 (16:00 CET) 后出现在不稳定的更新站点上。

确实,现在它打印出来了,如您所料:

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