1use crate::Token;
42
43#[derive(Debug, Clone)]
44pub struct Chunk(pub Vec<Stat>, pub Option<LastStat>);
45
46#[derive(Debug, Clone)]
47pub struct Block(pub Chunk);
48
49#[derive(Debug, Clone)]
50pub enum Stat {
51 Assign(VarList, ExprList),
52 FunctionCall(FunctionCall),
53 Do(Block),
54 While(Box<Expr>, Block),
55 Repeat(Box<Expr>, Block),
56 If(Box<Expr>, Block, Vec<(Box<Expr>, Block)>, Option<Block>),
57 For(Token, Box<Expr>, Box<Expr>, Option<Box<Expr>>, Block),
58 ForIn(NameList, ExprList, Block),
59 Function(FuncName, FuncBody),
60 LocalFunction(Token, FuncBody),
61 LocalDeclVar(NameList, Option<ExprList>),
62}
63
64#[derive(Debug, Clone)]
65pub enum LastStat {
66 Return(Option<ExprList>),
67 Break,
68}
69
70#[derive(Debug, Clone)]
71pub struct FuncName(pub Vec<Token>, pub Option<Token>);
72
73#[derive(Debug, Clone)]
74pub struct VarList(pub Vec<Var>);
75
76#[derive(Debug, Clone)]
77pub enum Var {
78 VarName(Token),
79 VarIdx(PrefixExp, Box<Expr>),
80 VarMember(PrefixExp, Token),
81}
82
83#[derive(Debug, Clone)]
84pub struct NameList(pub Vec<Token>);
85
86#[derive(Debug, Clone)]
87pub struct ExprList(pub Vec<Expr>);
88
89#[derive(Debug, Clone)]
90pub enum Expr {
91 Nil,
92 False,
93 True,
94 Number(f64),
95 String(String),
96 Dots,
97 Function(Function),
98 PrefixExp(PrefixExp),
99 TableConstructor(TableConstructor),
100 ExprBinop(Box<Expr>, Binop, Box<Expr>),
101 Unop(Unop, Box<Expr>),
102}
103
104#[derive(Debug, Clone)]
105pub enum PrefixExp {
106 PrefixVar(Box<Var>),
107 PrefixCall(FunctionCall),
108 PrefixParen(Box<Expr>),
109}
110
111#[derive(Debug, Clone)]
112pub struct FunctionCall(pub Box<PrefixExp>, pub Option<Token>, pub Args);
113
114#[derive(Debug, Clone)]
115pub enum Args {
116 ArgsNone,
117 ArgsList(ExprList),
118 ArgsTable(TableConstructor),
119 ArgsString(String),
120}
121
122#[derive(Debug, Clone)]
123pub struct Function(pub FuncBody);
124
125#[derive(Debug, Clone)]
126pub struct FuncBody(pub ParamList, pub Block);
127
128#[derive(Debug, Clone)]
129pub struct ParamList(pub NameList, pub bool);
130
131#[derive(Debug, Clone)]
132pub struct TableConstructor(pub FieldList);
133
134#[derive(Debug, Clone)]
135pub struct FieldList(pub Vec<Field>);
136
137#[derive(Debug, Clone)]
138pub enum Field {
139 AssignIdx(Box<Expr>, Box<Expr>),
140 AssignName(Token, Box<Expr>),
141 UniExp(Box<Expr>),
142}
143
144#[derive(Debug, Clone)]
145pub struct Fieldsep;
146
147#[derive(Debug, Clone)]
148pub struct Binop(pub Token);
149
150#[derive(Debug, Clone)]
151pub struct Unop(pub Token);