feat(ast): add abstract syntax for expressions, patterns, and types

This commit is contained in:
dualfroz committed 2026-08-23 18:06:00 +02:00
1 parent 682fd8146b
commit e13d734741
1 file changed
+66
+66
View File
@@ -0,0 +1,66 @@
module Fml.Core.Ast
// Abstract syntax for the fml language. Multi-argument functions are
// desugared into nested single-argument lambdas by the parser, so the
// evaluator and type checker only ever see one parameter per lambda.
type Expr =
| IntLit of int
| BoolLit of bool
| StringLit of string
| UnitLit
| Var of string
| Lambda of string * Expr
| App of Expr * Expr
| Let of bool * string * Expr * Expr
| LetGroup of bool * (string * Expr) list * Expr
| If of Expr * Expr * Expr
| BinOp of string * Expr * Expr
| Neg of Expr
| Tuple of Expr list
| Nil
| Cons of Expr * Expr
| Match of Expr * (Pattern * Expr) list
| Construct of string * Expr list
| Record of (string * Expr) list
| Field of Expr * string
and Pattern =
| PVar of string
| PWildcard
| PInt of int
| PBool of bool
| PString of string
| PUnit
| PTuple of Pattern list
| PNil
| PCons of Pattern * Pattern
| PConstruct of string * Pattern list
| PRecord of (string * Pattern) list
// Surface syntax for type expressions inside declarations and annotations.
type TyExpr =
| TEVar of string
| TECon of string * TyExpr list
| TETuple of TyExpr list
| TEArrow of TyExpr * TyExpr
| TEList of TyExpr
type TypeBody =
| Variants of (string * TyExpr list) list
| RecordDef of (string * TyExpr) list
type TypeDecl =
{ Name: string
Params: string list
Body: TypeBody }
// A top-level phrase is either a bare expression, a definition group, a type
// declaration group, a module, or an open directive. Definitions extend the
// persistent session environment.
type Phrase =
| PhraseExpr of Expr
| PhraseLet of bool * (string * Expr) list
| PhraseType of TypeDecl list
| PhraseModule of string * Phrase list
| PhraseOpen of string