feat(ast): add abstract syntax for expressions, patterns, and types
This commit is contained in:
1 parent
682fd8146b
commit
e13d734741
1 file changed
+66
@@ -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
|
||||
Reference in new issue
Block a user