Model ast without comments and errors
This commit is contained in:
parent
c593e4c872
commit
29d321334c
2 changed files with 151 additions and 0 deletions
150
src/ast.rs
Normal file
150
src/ast.rs
Normal file
|
|
@ -0,0 +1,150 @@
|
|||
#[derive(Debug, Clone)]
|
||||
struct Ident(String);
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
enum NumLit {
|
||||
/// - `0b_0001_1011`
|
||||
/// - `-0b10`
|
||||
Bin(i64, String),
|
||||
|
||||
/// - `12_345`
|
||||
/// - `-7`
|
||||
Dec(i64, String),
|
||||
|
||||
/// - `0x_c0_f3`
|
||||
/// - `-0xB`
|
||||
Hex(i64, String),
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
enum TableLitElem {
|
||||
/// `a`
|
||||
Positional(Box<Expr>),
|
||||
|
||||
/// `foo: a`
|
||||
Named(Ident, Box<Expr>),
|
||||
}
|
||||
|
||||
/// `'{ a, foo: b }`
|
||||
#[derive(Debug, Clone)]
|
||||
struct TableLit {
|
||||
elems: Vec<TableLitElem>,
|
||||
trailing_comma: bool,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
enum Lit {
|
||||
/// `nil`
|
||||
Nil,
|
||||
|
||||
/// - `true`
|
||||
/// - `false`
|
||||
Bool(bool),
|
||||
|
||||
/// See [`NumLit`].
|
||||
Num(NumLit),
|
||||
|
||||
/// - `"foo"`
|
||||
/// - `"Hello world!\n"`
|
||||
/// - `""`
|
||||
String(String),
|
||||
|
||||
/// See [`TableLit`].
|
||||
Table(TableLit),
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
enum TableConstrElem {
|
||||
/// `a`
|
||||
Positional(Box<Expr>),
|
||||
|
||||
/// `foo: a`
|
||||
Named(Ident, Box<Expr>),
|
||||
|
||||
/// `[a]: b`
|
||||
Indexed(Box<Expr>, Box<Expr>),
|
||||
}
|
||||
|
||||
/// `{ a, b, foo: c, [d]: e }`
|
||||
#[derive(Debug, Clone)]
|
||||
struct TableConstr {
|
||||
elems: Vec<TableConstrElem>,
|
||||
trailing_comma: bool,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
enum BinOp {
|
||||
/// `+`
|
||||
Add,
|
||||
/// `-`
|
||||
Sub,
|
||||
/// `*`
|
||||
Mul,
|
||||
/// `/`
|
||||
Div,
|
||||
/// `%`
|
||||
Mod,
|
||||
/// `==`
|
||||
Eq,
|
||||
/// `!=`
|
||||
Neq,
|
||||
/// `and`
|
||||
And,
|
||||
/// `or`
|
||||
Or,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
enum Expr {
|
||||
Lit(Lit),
|
||||
|
||||
/// See [`TableConstr`].
|
||||
TableConstr(TableConstr),
|
||||
|
||||
/// `foo`
|
||||
Var(Ident),
|
||||
|
||||
/// `[a]`
|
||||
VarExpr(Box<Expr>),
|
||||
|
||||
/// `foo = a`
|
||||
VarAssign(Ident, Box<Expr>),
|
||||
|
||||
/// `[a] = b`
|
||||
VarExprAssign(Box<Expr>, Box<Expr>),
|
||||
|
||||
/// `-a`
|
||||
Neg(Box<Expr>),
|
||||
|
||||
/// `not a`
|
||||
Not(Box<Expr>),
|
||||
|
||||
/// `a.foo`
|
||||
Field(Box<Expr>, Ident),
|
||||
|
||||
/// `a[b]`
|
||||
FieldExpr(Box<Expr>, Box<Expr>),
|
||||
|
||||
/// `a.foo = b`
|
||||
FieldAssign(Box<Expr>, Ident, Box<Expr>),
|
||||
|
||||
/// `a[b] = c`
|
||||
FieldExprAssign(Box<Expr>, Box<Expr>, Box<Expr>),
|
||||
|
||||
/// - `a + b`
|
||||
/// - `a == b`
|
||||
/// - `a and b`
|
||||
BinOp(Box<Expr>, BinOp, Box<Expr>),
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
enum Program {
|
||||
/// At the beginning of the file:
|
||||
/// ```text
|
||||
/// module
|
||||
/// ...
|
||||
/// ```
|
||||
Module(TableLit),
|
||||
|
||||
Expr(Expr),
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue