8 个版本
0.1.7 | 2023 年 12 月 9 日 |
---|---|
0.1.6 | 2023 年 12 月 2 日 |
0.1.3 | 2023 年 11 月 30 日 |
1389 在 开发工具
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-IR
和 EBNF-IR
分别是莫甘娜中表示的语言 AST 的内部表示以及语言的语法。
依赖关系
~2.7–4.5MB
~77K SLoC