首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rascal语法的预测编辑器

Rascal语法的预测编辑器
EN

Stack Overflow用户
提问于 2015-02-21 22:25:54
回答 1查看 80关注 0票数 0

我试图为用Rascal编写的语法编写一个预见性编辑器。它的核心是一个函数,它以符号列表作为输入,并将符号类型的列表作为输出返回,这样,这些类型中任何一个类型的实例都是语法下输入符号的语法合法延续。因此,如果输入列表为4,则输出可能是整数。在Rascal有什么聪明的方法吗?我可以想到一些命令式的编程方法,但我怀疑他们没有充分利用Rascal的能力。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-22 07:11:35

这是个相当大的问题。以下是一些答案,但完整的答案将为您实现:-)

  1. 使用#运算符将您感兴趣的语言的原始语法具体化为值,这样您就可以很容易地查询语法的简明表示。该表示是在扩展TypeGrammar的模块TypeGrammar上定义的。
  2. 为输入查询构造相同的表示形式。这可以在许多方面做到。一个令人兴奋的,语言参数化的方法是扩展Rascal的解析器算法,以返回部分输入的部分树,但我认为这现在太麻烦了。一个更简单的解决方案将需要为一组部分输入编写语法,即在特定点使用较短规则的语言语法。语法将是模棱两可的,但在这种情况下这不是一个问题。
    • 使用标记标记“短”规则,以便您可以轻松地在以后找到它们:syntax E = @short E "+";
    • 用扩展语法和现在的歧义语法进行分析;
    • 生成的解析树将包含与用于还原原始语法的ParseTree中相同的表示形式,但在该语法中,规则更长,就像在prod(E, [E,+,E],...)中那样。
    • 然后选择最适合完成目标的树(使用@short标记),并提取它们的产品"prod",它看起来像这个prod(E,[E,+],...)。例如,使用/操作符:[candidate : /candidate:prod(_,_,/"short") := trees],您可以使用光标位置来查找候选对象,而不是位于其中的所有short树。

  1. 使用列表匹配来查找原始语法中的前缀,如if (/match:prod(_,[*prefix, predicted, *postfix],_) := grammar) ...,前缀是从@short规则中提取的查询。predicted是你的答案,postfix是你所追求的一切。
  2. predicted符号返回为供用户阅读的类型:"<type(predicted, ())>" (即使它是一些复杂的regexp类型并正确引用,也会很好地打印它)。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28652118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档