首页 > 解决方案 > 可能的错误:这个流氓语法规则的含义是什么?

问题描述

所以我正在努力将语法重写为相同语法的其他形式,并且正在使用函数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”的部分。那么我错过了什么还是这是某种错误?

标签: context-free-grammarrascal

解决方案


查看代码grammar2rascal有一个错误precede处理错误。这是在1c7fed中修复的,这应该会在大约一个小时(欧洲中部时间 16:00)出现在不稳定的更新站点上。

事实上,现在它打印出来了,正如您所期望的那样:

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

推荐阅读