add stmt to ast

This commit is contained in:
nora 2022-07-05 20:25:58 +02:00
parent 30da01fc05
commit fb1ce74e08
2 changed files with 39 additions and 7 deletions

View file

@ -5,13 +5,15 @@ use dbg_pls::DebugPls;
use crate::Spanned; use crate::Spanned;
pub type Ident = Spanned<String>;
// //
// --- Expr // --- Expr
// //
#[derive(Debug, DebugPls)] #[derive(Debug, DebugPls)]
pub enum Atom { pub enum Atom {
Ident(String), Ident(Ident),
Int(i128), Int(i128),
Float(f64), Float(f64),
String(String), String(String),
@ -83,6 +85,38 @@ pub enum Expr {
Binary(ExprBinary), Binary(ExprBinary),
} }
//
// --- Statements
//
#[derive(Debug, DebugPls)]
pub enum Stmt {
Labeled(Box<Spanned<Stmt>>),
Compound(Vec<Spanned<Stmt>>),
If {
cond: Expr,
then: Vec<Spanned<Stmt>>,
otherwise: Option<Vec<Spanned<Stmt>>>,
},
Switch,
While {
cond: Expr,
body: Vec<Spanned<Stmt>>,
},
For {
init_decl: Option<Spanned<Decl>>,
init_expr: Option<Spanned<Expr>>,
cond: Option<Spanned<Expr>>,
post: Option<Spanned<Expr>>,
body: Vec<Spanned<Stmt>>,
},
Goto(Ident),
Continue,
Break,
Return(Option<Spanned<Expr>>),
Expr(Expr),
}
// //
// --- Types and decls and garbage whatever // --- Types and decls and garbage whatever
// //
@ -107,8 +141,6 @@ pub enum TypeSpecifier {
// typedef-name // typedef-name
} }
pub type Ident = Spanned<String>;
bitflags! { bitflags! {
pub struct DeclAttr: u8 { pub struct DeclAttr: u8 {
const EXTERN = 0b00000001; const EXTERN = 0b00000001;
@ -174,7 +206,7 @@ pub struct Declarator {
#[derive(Debug, DebugPls)] #[derive(Debug, DebugPls)]
pub struct FunctionDef { pub struct FunctionDef {
pub decl: Decl, pub decl: Decl,
pub body: Vec<()>, pub body: Vec<Stmt>,
} }
#[derive(Debug, DebugPls)] #[derive(Debug, DebugPls)]

View file

@ -184,9 +184,9 @@ mod powers {
pub const SHIFT: (u8, u8) = (21, 22); pub const SHIFT: (u8, u8) = (21, 22);
pub const ADD_SUB: (u8, u8) = (23, 24); pub const ADD_SUB: (u8, u8) = (23, 24);
pub const MUL_DIV_MOD: (u8, u8) = (25, 26); pub const MUL_DIV_MOD: (u8, u8) = (25, 26);
pub const CAST: (u8, u8) = (27, 28); pub const CAST: u8 = 27;
pub const UNARY_OPERATOR: u8 = 29; pub const UNARY_OPERATOR: u8 = 28;
pub const POSTFIX: u8 = 30; pub const POSTFIX: u8 = 29;
} }
fn prefix_binding_power(tok: &Tok<'_>) -> u8 { fn prefix_binding_power(tok: &Tok<'_>) -> u8 {