V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
geelaw
V2EX  ›  分享创造

娱乐性 λ 演算的玩具解析器

  •  4
     
  •   geelaw ·
    GeeLaw · 2018-02-14 10:00:03 +08:00 · 2452 次点击
    这是一个创建于 2472 天前的主题,其中的信息可能已经有所发展或是发生改变。

    因为 这篇 blog 里面记载的原因 突然就对 λ 演算有一点点兴趣,于是写了一个 λ 项的解析器。

    作为一个理论计算机科学学生,我比较喜欢 neat 的设定,为了最简化问题,采用 de Bruijn 下标记法,使用无类型的 λ 演算,并且不允许自由变量。

    词法:

    • 空白只有分割单词的作用;
    • lambda 单词是 lambda 这个串,或者 .(句点);
    • var 单词是一个不超过 65536 的正整数;
    • const 单词是一个标识符(选的字符集比较怪,细节没什么可说的);
    • ( 单词和 ) 单词就是 ()

    语法:

    • 一个 λ 项从开始符号 Term 产生;
    • Term 可以变成 List Abs 或者 List App
    • List 可以变成 List App 或者 空白;
    • Abs 可以变成 lambda Term
    • App 可以变成 varconst 或者 ( Term )

    语义(如何联系到普通的记法):

    • 任何 var 都不能超过它具有的 Abs 祖先的个数。(不允许自由变量)
    • var 的面值决定了它表示的变量是被它祖上第 面值 近的 Abs 祖先捕获的变量。
    • const 的字面量通常来说是一个字典里面的 entry,这样在书写的时候会简单一些,和文字替换是一样的效果(外面可能需要加括号),具体字典有哪些 entry 由 parser 的消费者决定。
    • 举例来说 λx.λy.xy 的写法是 lambda lambda 2 1 或者更简单的是 ..2 1

    目前只写了解析器(从头开始手写的~包括自己的内存池、引用计数指针、CRTP 模板、自己的词法器、语法器,这个语法太简单了,所以手写比较容易),

    GitHub 的地址是 GeeLaw/pure-lambda-calculus-playground

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1006 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 20:01 · PVG 04:01 · LAX 12:01 · JFK 15:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.