ripex 0.3.0

Multi-language structural parsing and fact extraction.
Documentation
use super::expr::Expr;
use crate::span::Span;

#[derive(Debug, Clone)]
pub enum Stmt {
    Expr(Expr, Span),
    Decl(FuncDecl, Span),
    VarDecl(VarDecl, Span),
    If(Expr, Box<Stmt>, Option<Box<Stmt>>, Span),
    Switch(Expr, Vec<CaseClause>, Span),
    While(Expr, Box<Stmt>, Span),
    Do(Box<Stmt>, Expr, Span),
    For(
        Option<Box<Stmt>>,
        Option<Expr>,
        Option<Box<Stmt>>,
        Box<Stmt>,
        Span,
    ),
    Return(Option<Expr>, Span),
    Break(Span),
    Continue(Span),
    Goto(String, Span),
    Label(String, Span),
    Block(Block, Span),
    Empty(Span),
    Preprocessor(PreprocDirective, Span),
}

#[derive(Debug, Clone)]
pub struct Block {
    pub stmts: Vec<Stmt>,
    pub span: Span,
}

#[derive(Debug, Clone)]
pub struct FuncDecl {
    pub name: String,
    pub return_type: Box<Expr>,
    pub params: Vec<ParamDecl>,
    pub is_variadic: bool,
    pub is_knr: bool,
    pub body: Option<Block>,
    pub storage_class: Option<String>,
    pub is_inline: bool,
    pub span: Span,
}

#[derive(Debug, Clone)]
pub struct ParamDecl {
    pub type_: Box<Expr>,
    pub name: Option<String>,
    pub span: Span,
}

#[derive(Debug, Clone)]
pub struct VarDecl {
    pub type_: Box<Expr>,
    pub name: String,
    pub init: Option<Expr>,
    pub is_const: bool,
    pub storage_class: Option<String>,
    pub span: Span,
}

#[derive(Debug, Clone)]
pub struct CaseClause {
    pub expr: Option<Expr>,
    pub stmts: Vec<Stmt>,
    pub span: Span,
}

#[derive(Debug, Clone)]
pub enum PreprocDirective {
    Include(String, Span),
    Define(String, Option<String>, Span),
    Undef(String, Span),
    Ifdef(String, Span),
    Ifndef(String, Span),
    If(String, Span),
    Else(Span),
    Elif(String, Span),
    Endif(Span),
    Error(String, Span),
    Pragma(String, Span),
    Line(String, Span),
}