purua/parser/
ast.rs

1//
2// The Complete Syntax of Lua 5.1:
3//   From... https://www.lua.org/manual/5.1/manual.html#8
4//
5// chunk ::= {stat [`;´]} [laststat [`;´]]
6// block ::= chunk
7// stat ::=  varlist `=´ explist |
8// 	 functioncall |
9// 	 do block end |
10// 	 while exp do block end |
11// 	 repeat block until exp |
12// 	 if exp then block {elseif exp then block} [else block] end |
13// 	 for Name `=´ exp `,´ exp [`,´ exp] do block end |
14// 	 for namelist in explist do block end |
15// 	 function funcname funcbody |
16// 	 local function Name funcbody |
17// 	 local namelist [`=´ explist]
18// laststat ::= return [explist] | break
19// funcname ::= Name {`.´ Name} [`:´ Name]
20// varlist ::= var {`,´ var}
21// var ::=  Name | prefixexp `[´ exp `]´ | prefixexp `.´ Name
22// namelist ::= Name {`,´ Name}
23// explist ::= {exp `,´} exp
24// exp ::=  nil | false | true | Number | String | `...´ | function |
25// 	 prefixexp | tableconstructor | exp binop exp | unop exp
26// prefixexp ::= var | functioncall | `(´ exp `)´
27// functioncall ::=  prefixexp args | prefixexp `:´ Name args
28// args ::=  `(´ [explist] `)´ | tableconstructor | String
29// function ::= function funcbody
30// funcbody ::= `(´ [parlist] `)´ block end
31// parlist ::= namelist [`,´ `...´] | `...´
32// tableconstructor ::= `{´ [fieldlist] `}´
33// fieldlist ::= field {fieldsep field} [fieldsep]
34// field ::= `[´ exp `]´ `=´ exp | Name `=´ exp | exp
35// fieldsep ::= `,´ | `;´
36// binop ::= `+´ | `-´ | `*´ | `/´ | `^´ | `%´ | `..´ |
37// 	 `<´ | `<=´ | `>´ | `>=´ | `==´ | `~=´ |
38// 	 and | or
39// unop ::= `-´ | not | `#´
40//
41use 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);