我正在尝试为Rascal编写的语法编写一个预测编辑器。其核心是将符号列表作为输入并且作为输出返回符号类型列表的函数,使得任何这些类型的实例将是语法下的输入符号的语法上合法的延续。因此,如果输入列表是[4,+],则输出可能是[整数]。在Rascal有一个聪明的方法吗?我可以想到命令式编程的方式,但我怀疑他们没有充分利用Rascal的力量。
答案 0 :(得分:0)
这是一个非常大的问题。这里有一些可以得到答案,但完整的答案将完全为你实现:-)
#
运算符将您感兴趣的语言的原始语法更新为值,以便您可以轻松查询语法的简洁表示。表示是在模块Type
,ParseTree
上定义的,它扩展了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, ())>"
(即使它是一些复杂的正则表达式并且引用正确等等,它也能很好地打印出来。 )