Rascal语法的预测编辑器

时间:2015-02-21 22:25:54

标签: rascal

我正在尝试为Rascal编写的语法编写一个预测编辑器。其核心是将符号列表作为输入并且作为输出返回符号类型列表的函数,使得任何这些类型的实例将是语法下的输入符号的语法上合法的延续。因此,如果输入列表是[4,+],则输出可能是[整数]。在Rascal有一个聪明的方法吗?我可以想到命令式编程的方式,但我怀疑他们没有充分利用Rascal的力量。

1 个答案:

答案 0 :(得分:0)

这是一个非常大的问题。这里有一些可以得到答案,但完整的答案将完全为你实现:-)

  1. 使用#运算符将您感兴趣的语言的原始语法更新为值,以便您可以轻松查询语法的简洁表示。表示是在模块TypeParseTree上定义的,它扩展了TypeGrammar
  2. 为输入查询构造相同的表示形式。这可以通过多种方式完成。一种踢脚式,语言参数化的方式是扩展Rascal的解析器算法以返回部分树的部分输入,但我相信这将是太麻烦了。一个更简单的解决方案需要为一组部分输入编写语法,即具有特定点较短规则的语言语法。语法将是模糊的,但在这种情况下是一个问题。
    • 使用标签标记"短"规则,以便您以后可以轻松找到它们:syntax E = @short E "+";
    • 解析扩展且现在含糊不清的语法;
    • 生成的解析树将包含与用于统一原始语法的ParseTree中相同的表示形式,除了规则较长的那个,例如prod(E, [E,+,E],...)
    • 然后选择最适合您完成目标的树(使用@short标签),并提取他们的作品" prod",看起来像这样prod(E,[E,+],...)。例如,使用/运算符:[candidate : /candidate:prod(_,_,/"short") := trees],您可以使用光标位置查找附近的候选项,而不是那里的所有short树。
  3. 使用列表匹配来查找原始语法中的前缀,例如if (/match:prod(_,[*prefix, predicted, *postfix],_) := grammar) ...,前缀是从@short规则中提取的查询。 predicted是你的答案,而postfix就是你想要的。
  4. predicted符号作为一个类型返回给用户阅读:"<type(predicted, ())>"(即使它是一些复杂的正则表达式并且引用正确等等,它也能很好地打印出来。 )