<p align="center"> ⚠️ Morgana is still in early stage. ⚠️ </p>
<p align="center">
<img src="https://raw.githubusercontent.com/broceliande-labs/morgana-core/master/images/morgana.png">
</p>
# Morgana
Morgana is a declarative language that allows users to define the datatypes of the AST of a language together with their syntax rules.
## Why?
Most compilers generator tend to overlook the aspect of the generation of the AST, which can be as tedious as writing a parser or a lexer.
This formalism aims at providing a single declarative specification that cleanly and concisely allows to represent the nodes
of the AST of a language together with their introduction rules, that is, their syntax rules.
Once a specification is in place, the user will be able to generate automatically code for the AST, lexer, parser, pretty printer and hopefully also a skeleton for the LSP.
Morgana _itself_ is not a CLI or a library, Morgana is the formalism; ideally, various adoption of the format will allow more generators for spurious objectives.
Consider the following _Morg_.
```
-- Simple arithmetic expressions
ast Expressions
node Expression :=
| Num : u32
| Mul : Expression '*' Expression
| Div : Expression '/' Expression
| Sum : Expression '+' Expression
| Min : Expression '-' Expression
```
Analysing the Morg, a Rust generator (for example) can generate an AST in a form such as
```rust
pub enum Expression {
Num(u32),
Mul(Box<Expression>, Box<Expression>),
...
}
```
together with a parser, automatically. It is clear that this would not be possible
- if we have the objective of automatically giving meaningful names to the nodes of the tree - by
using EBNF rules only such as
```
Expression := Expression '*' Expression
| Expression '/' Expression
| Expression '+' Expression
| Expression '-' Expression
```
as, simply, no information regarding the structure of the AST is embedded in the rules: we would need another formalism or implement by hand the AST.
## Usage
Remember that Morgana is in early stage and we are trying to figure out the best way to do what we plan. In general, the usage is as shown here:
```mermaid
flowchart TD
subgraph Z[" "]
direction LR
lang.morg --> parser
parser --> MorgAst
MorgAst --> AST-IR
MorgAst --> EBNF-IR
AST-IR --> ASTGen
EBNF-IR --> ParserGen
end
```
where `MorgAst` is the internal representation of the structure of the language represented in the metalanguage and `AST-IR` and `EBNF-IR` are internal representation of the AST of the language as represented in the Morg and of the syntax of the language, respectively.