8 个版本

0.1.7 2023 年 12 月 9 日
0.1.6 2023 年 12 月 2 日
0.1.3 2023 年 11 月 30 日

1389开发工具

MIT 许可证

240KB
2K SLoC

⚠️ 莫甘娜仍处于早期阶段。 ⚠️

莫甘娜

莫甘娜是一种声明式语言,允许用户定义语言的 AST 数据类型及其语法规则。

为什么?

大多数编译器生成器往往忽略了 AST 生成方面的内容,这可能与编写解析器或词法分析器一样繁琐。这种形式化旨在提供一个单一的声明性规范,干净简洁地表示语言的 AST 节点及其引入规则,即它们的语法规则。

一旦有了规范,用户就可以自动生成代码用于 AST、词法分析器、解析器、美观打印器,也许还可以生成 LSP 的骨架。莫甘娜 本身 不是一个 CLI 或库,莫甘娜是一种形式化;理想情况下,各种对该格式的采用将允许更多的生成器用于各种目的。

考虑以下 Morg

-- Simple arithmetic expressions
ast Expressions 

node Expression := 
| Num : u32
| Mul : Expression '*' Expression
| Div : Expression '/' Expression
| Sum : Expression '+' Expression
| Min : Expression '-' Expression

分析 Morg,一个 Rust 生成器(例如)可以自动生成以下形式的 AST

pub enum Expression {
  Num(u32),
  Mul(Box<Expression>, Box<Expression>),
  ...
}

显然,如果没有目标为自动为树节点命名,那么这是不可能的

  • 仅使用 EBNF 规则,例如
Expression := Expression '*' Expression
            | Expression '/' Expression
            | Expression '+' Expression
            | Expression '-' Expression

因为规则中不包含有关 AST 结构的信息:我们需要另一种形式化或手动实现 AST。

用法

请记住,莫甘娜仍处于早期阶段,我们正在尝试找出完成计划的最佳方法。一般来说,用法如下

flowchart TD

subgraph Z[" "]
direction LR
  lang.morg --> parser
  parser --> MorgAst
  MorgAst --> AST-IR
  MorgAst --> EBNF-IR
  AST-IR --> ASTGen
  EBNF-IR --> ParserGen
end

其中 MorgAst 是在金属语言中表示的语言结构的内部表示,而 AST-IREBNF-IR 分别是莫甘娜中表示的语言 AST 的内部表示以及语言的语法。

依赖关系

~2.7–4.5MB
~77K SLoC