Dyalog APL 解析器

问题描述 投票:0回答:1

我正在寻找一个类似于 aplparse 的 Dyalog APL 解析器,但它要么用 APL 本身编写,要么作为 Dyalog 引擎的一部分提供。我将在 APL 程序中操作 AST,这就是为什么我需要解析器的输出是该语言的本机输出。请注意,我的问题不是 this thread 的重复,因为我可以访问要解析的 APL 函数的完整定义。

parsing abstract-syntax-tree apl dyalog
1个回答
0
投票

我和Aaron Hsu正在积极合作,其中Hsu承担了大部分的责任。这将是 Co-dfns 项目的一部分,但即使可以访问完整的源代码,它也相当棘手,并且需要做出一些权衡:

  1. 您的代码是否使用带有半全局的 tradfns ?当

    a b←c
    和/或
    a
    是半全局时,解析
    b
    取决于运行时
    ⎕NC
    信息,并且可以选择性地解析搁浅赋值、修改赋值或具有结果传递的单个赋值。静态解析要求半全局的
    ⎕NC
    永远不会从值类型更改为函数/运算符类型。

  2. 您的代码是否动态地将名称与 Execute (

    )、
    ⎕FX
    ⎕FIX
    ⎕NS
    ⎕WC
    ⎕CY
    ⎕LOAD
    绑定?完全解析这些直接命中会遇到停止问题,因此我们必须处理启发式方法,如果您不幸要解析未知来源的任意代码,则可以对抗性地解决这些问题。

无论如何,考虑到这一点,您现在就可以启动并运行 Co-dfns,特别是通过运行

PS
。您的代码需要全部放在一个脚本命名空间中,此时 AST 生成如下所示:

      ⍝ Load Co-dfns into your workspace
      ]link.load # path/to/Co-dfns/ws
      LOAD 'path/to/Co-dfns'

      ⍝ Run the parser
      codfns.PS⊃⎕NGET 'path/to/namespace.apln' 1

但是,如果成功,只会将 AST 溢出到您的会话中,因此您可能希望将结果绑定到某些变量:

      (p d t k n lx pos end)(xn xt)sym IN←codfns.PS⊃⎕NGET 'namespace.apln' 1

请注意,AST 表示为带有父向量 p 和深度向量

d
Apter 树
。这确实是代码就是文档的情况,但如果您需要帮助或有疑问,请随时联系 Aaron 或我。

此外,这仍然是一项正在进行的工作。目前,点命名空间表示法尚未完全到位,控制结构刚刚被删除,名称解析有几个尖锐的边缘,以及一系列尚未实现的小功能,主要与 tradfns 有关。

也就是说,如果您的代码仅使用 dfns 并且不动态绑定名称,那么 Co-dfns 可能适合您。在这些限制下,我们已经成功编译了其他项目。

祝你好运,请随时联系我们!

© www.soinside.com 2019 - 2024. All rights reserved.