langcc - langcc:下一代编译器编译器

Created at: 2022-09-20 09:49:33
开发语言: C++
授权协议: Apache-2.0

langcc
:下一代编译器编译器

langcc
是一种工具,它以标准的BNF样式格式对语言进行正式描述,并自动生成编译器前端,包括语言的抽象语法树(AST)和遍历,词法分析器,解析器和漂亮的打印机的数据结构定义。 还用作以下技术报告的配套软件实现,这些技术报告描述了经典 LR 解析范例的几项创新:
langcc

langcc
可用作 和 (或 和 ) 组合的替代品。但是,提供了许多附加功能,包括:
lex
yacc
flex
bison
langcc

  • 通过独立的数据类型编译器自动生成 AST 数据结构 ()。
    datacc
  • 完整的 LR 解析器生成作为默认值,而不是限制性更强的 LALR。
  • 通过明确的“令人困惑的输入对”来清晰地呈现LR冲突,而不是不透明的偏移/减少错误。
  • LR 自动机的新颖效率优化。
  • LR 范例的扩展,包括递归下降 (RD) 解析操作,从而显著缩小和更直观的自动机。
  • LR范式的扩展,包括每个符号的属性,这对于许多工业语言结构的有效实现至关重要。
  • LR 语法 (CPS) 的常规转换,可显著扩展工具可以支持的语法类。

与以前的编译器前端生成器不同,它足够高效和通用,可以捕获完整的工业编程语言,包括Python 3.9.12(语法/py.lang)和Golang 1.17.8(语法/go.lang)。在这两种情况下,都会自动生成一个比每种语言的标准库解析器更快的解析器(速度提高了 1.2 倍和 4.3 倍)。事实上,所支持的语法类足够通用,以至于该工具是自托管的:也就是说,人们可以在“语言的语言”本身中表达“语言的语言”,并用于生成自己的编译器前端。我们在规范实现中执行此操作;有关更多详细信息请参阅源存储库中 bootstrap.sh 和语法/meta.lang 的文件。

langcc
langcc
langcc
langcc

langcc
是一个研究原型,尚未在生产中广泛使用。但是,我们相信它本质上是稳定且功能完整的,可以用作独立工具,以促进对新编译器和编程语言的快速探索。

该版本已在 Ubuntu 22.04 和 macOS 12.5 上进行了测试,但也应该在一些其他版本的 Ubuntu 和 macOS 上运行,但需要稍作调整。

对于乌班图 22.04:

./deps_ubuntu.sh
make -j8
sudo make install

对于 macOS 12.5(需要自制):

./deps_macos.sh
make -j8
sudo make install

并且,为了引导前端本身,随后运行:

langcc

./bootstrap.sh

例子

一旦(及其同伴)被安装,就可以运行各种示例:

langcc
datacc

  • 在目录中,有两个示例:和 。每个都有自己的本地生成文件。
    examples
    basic
    calc
  • 主构建过程本身编译和 ,生成测试和 。(注意:这些二进制文件分别需要位于目录中的Golang 1.17.8存储库和位于目录中的Python 3.9.12的存储库。
    grammars/py.lang
    grammars/go.lang
    build/go_standalone_test
    build/py_standalone_test
    ../go
    ../cpython
  • 有数据类型的语言,它描述了附加独立工具的输入(用于自动生成代数数据类型C++实现)。
    grammars/data.lang
    datacc
    langcc
  • 最后,还有语言本身的语言,。该语言还用作基本文档,因为它枚举了自己的所有功能。
    grammars/meta.lang

文档

有关完整文档,请参阅用户手册以及描述理论发展的技术报告