我正在寻找一个类似于 aplparse 的 Dyalog APL 解析器,但它要么用 APL 本身编写,要么作为 Dyalog 引擎的一部分提供。我将在 APL 程序中操作 AST,这就是为什么我需要解析器的输出是该语言的本机输出。请注意,我的问题不是 this thread 的重复,因为我可以访问要解析的 APL 函数的完整定义。
我和Aaron Hsu正在积极合作,其中Hsu承担了大部分的责任。这将是 Co-dfns 项目的一部分,但即使可以访问完整的源代码,它也相当棘手,并且需要做出一些权衡:
您的代码是否使用带有半全局的 tradfns ?当
a b←c
和/或 a
是半全局时,解析 b
取决于运行时 ⎕NC
信息,并且可以选择性地解析搁浅赋值、修改赋值或具有结果传递的单个赋值。静态解析要求半全局的 ⎕NC
永远不会从值类型更改为函数/运算符类型。
您的代码是否动态地将名称与 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 可能适合您。在这些限制下,我们已经成功编译了其他项目。
祝你好运,请随时联系我们!