我试图为用Rascal编写的语法编写一个预见性编辑器。它的核心是一个函数,它以符号列表作为输入,并将符号类型的列表作为输出返回,这样,这些类型中任何一个类型的实例都是语法下输入符号的语法合法延续。因此,如果输入列表为4,则输出可能是整数。在Rascal有什么聪明的方法吗?我可以想到一些命令式的编程方法,但我怀疑他们没有充分利用Rascal的能力。
发布于 2015-02-22 07:11:35
这是个相当大的问题。以下是一些答案,但完整的答案将为您实现:-)
#运算符将您感兴趣的语言的原始语法具体化为值,这样您就可以很容易地查询语法的简明表示。该表示是在扩展Type和Grammar的模块Type和Grammar上定义的。syntax E = @short E "+";ParseTree中相同的表示形式,但在该语法中,规则更长,就像在prod(E, [E,+,E],...)中那样。@short标记),并提取它们的产品"prod",它看起来像这个prod(E,[E,+],...)。例如,使用/操作符:[candidate : /candidate:prod(_,_,/"short") := trees],您可以使用光标位置来查找候选对象,而不是位于其中的所有short树。
if (/match:prod(_,[*prefix, predicted, *postfix],_) := grammar) ...,前缀是从@short规则中提取的查询。predicted是你的答案,postfix是你所追求的一切。predicted符号返回为供用户阅读的类型:"<type(predicted, ())>" (即使它是一些复杂的regexp类型并正确引用,也会很好地打印它)。https://stackoverflow.com/questions/28652118
复制相似问题