pub type NonEmpty<T> = Vec<T>;
pub type Identifier = String;
pub type TypeName = String;
#[derive(Clone, Debug, PartialEq)]
pub enum TypeSpecifierNonArray {
Void,
Bool,
Int,
UInt,
Float,
Double,
Vec2,
Vec3,
Vec4,
DVec2,
DVec3,
DVec4,
BVec2,
BVec3,
BVec4,
IVec2,
IVec3,
IVec4,
UVec2,
UVec3,
UVec4,
Mat2,
Mat3,
Mat4,
Mat23,
Mat24,
Mat32,
Mat34,
Mat42,
Mat43,
DMat2,
DMat3,
DMat4,
DMat23,
DMat24,
DMat32,
DMat34,
DMat42,
DMat43,
Sampler1D,
Image1D,
Sampler2D,
Image2D,
Sampler3D,
Image3D,
SamplerCube,
ImageCube,
Sampler2DRect,
Image2DRect,
Sampler1DArray,
Image1DArray,
Sampler2DArray,
Image2DArray,
SamplerBuffer,
ImageBuffer,
Sampler2DMS,
Image2DMS,
Sampler2DMSArray,
Image2DMSArray,
SamplerCubeArray,
ImageCubeArray,
Sampler1DShadow,
Sampler2DShadow,
Sampler2DRectShadow,
Sampler1DArrayShadow,
Sampler2DArrayShadow,
SamplerCubeShadow,
SamplerCubeArrayShadow,
ISampler1D,
IImage1D,
ISampler2D,
IImage2D,
ISampler3D,
IImage3D,
ISamplerCube,
IImageCube,
ISampler2DRect,
IImage2DRect,
ISampler1DArray,
IImage1DArray,
ISampler2DArray,
IImage2DArray,
ISamplerBuffer,
IImageBuffer,
ISampler2DMS,
IImage2DMS,
ISampler2DMSArray,
IImage2DMSArray,
ISamplerCubeArray,
IImageCubeArray,
AtomicUInt,
USampler1D,
UImage1D,
USampler2D,
UImage2D,
USampler3D,
UImage3D,
USamplerCube,
UImageCube,
USampler2DRect,
UImage2DRect,
USampler1DArray,
UImage1DArray,
USampler2DArray,
UImage2DArray,
USamplerBuffer,
UImageBuffer,
USampler2DMS,
UImage2DMS,
USampler2DMSArray,
UImage2DMSArray,
USamplerCubeArray,
UImageCubeArray,
Struct(StructSpecifier),
TypeName(TypeName)
}
#[derive(Clone, Debug, PartialEq)]
pub struct TypeSpecifier {
pub ty: TypeSpecifierNonArray,
pub array_specifier: Option<ArraySpecifier>
}
#[derive(Clone, Debug, PartialEq)]
pub struct StructSpecifier {
pub name: Option<String>,
pub fields: Vec<StructFieldSpecifier>,
}
#[derive(Clone, Debug, PartialEq)]
pub struct StructFieldSpecifier {
pub qualifier: Option<TypeQualifier>,
pub ty: TypeSpecifier,
pub identifiers: NonEmpty<(Identifier, Option<ArraySpecifier>)> }
#[derive(Clone, Debug, PartialEq)]
pub struct TypeQualifier {
pub qualifiers: NonEmpty<TypeQualifierSpec>
}
#[derive(Clone, Debug, PartialEq)]
pub enum TypeQualifierSpec {
Storage(StorageQualifier),
Layout(LayoutQualifier),
Precision(PrecisionQualifier),
Interpolation(InterpolationQualifier),
Invariant,
Precise
}
#[derive(Clone, Debug, PartialEq)]
pub enum StorageQualifier {
Const,
InOut,
In,
Out,
Centroid,
Patch,
Sample,
Uniform,
Buffer,
Shared,
Coherent,
Volatile,
Restrict,
ReadOnly,
WriteOnly,
Subroutine(Vec<TypeName>),
}
#[derive(Clone, Debug, PartialEq)]
pub struct LayoutQualifier {
pub ids: NonEmpty<LayoutQualifierSpec>
}
#[derive(Clone, Debug, PartialEq)]
pub enum LayoutQualifierSpec {
Identifier(Identifier, Option<Box<Expr>>),
Shared
}
#[derive(Clone, Debug, PartialEq)]
pub enum PrecisionQualifier {
High,
Medium,
Low
}
#[derive(Clone, Debug, PartialEq)]
pub enum InterpolationQualifier {
Smooth,
Flat,
NoPerspective
}
#[derive(Clone, Debug, PartialEq)]
pub struct FullySpecifiedType {
pub qualifier: Option<TypeQualifier>,
pub ty: TypeSpecifier
}
#[derive(Clone, Debug, PartialEq)]
pub enum ArraySpecifier {
Unsized,
ExplicitlySized(Box<Expr>)
}
#[derive(Clone, Debug, PartialEq)]
pub enum Declaration {
FunctionPrototype(FunctionPrototype),
InitDeclaratorList(InitDeclaratorList),
Precision(PrecisionQualifier, TypeSpecifier),
Block(Block),
Global(TypeQualifier, Vec<Identifier>)
}
#[derive(Clone, Debug, PartialEq)]
pub struct Block {
pub qualifier: TypeQualifier,
pub name: Identifier,
pub fields: Vec<StructFieldSpecifier>,
pub identifier: Option<(Identifier, Option<ArraySpecifier>)>
}
#[derive(Clone, Debug, PartialEq)]
pub enum FunIdentifier {
Identifier(Identifier),
Expr(Box<Expr>)
}
#[derive(Clone, Debug, PartialEq)]
pub struct FunctionPrototype {
pub ty: FullySpecifiedType,
pub name: Identifier,
pub parameters: Vec<FunctionParameterDeclaration>
}
#[derive(Clone, Debug, PartialEq)]
pub enum FunctionParameterDeclaration {
Named(Option<TypeQualifier>, FunctionParameterDeclarator),
Unnamed(Option<TypeQualifier>, TypeSpecifier)
}
#[derive(Clone, Debug, PartialEq)]
pub struct FunctionParameterDeclarator {
pub ty: TypeSpecifier,
pub name: Identifier,
pub array_spec: Option<ArraySpecifier>
}
#[derive(Clone, Debug, PartialEq)]
pub struct InitDeclaratorList {
pub head: SingleDeclaration,
pub tail: Vec<SingleDeclarationNoType>
}
#[derive(Clone, Debug, PartialEq)]
pub struct SingleDeclaration {
pub ty: FullySpecifiedType,
pub name: Option<Identifier>,
pub array_specifier: Option<ArraySpecifier>,
pub initializer: Option<Initializer>
}
#[derive(Clone, Debug, PartialEq)]
pub struct SingleDeclarationNoType {
pub name: Identifier,
pub array_specifier: Option<ArraySpecifier>,
pub initializer: Option<Initializer>
}
#[derive(Clone, Debug, PartialEq)]
pub enum Initializer {
Simple(Box<Expr>),
List(NonEmpty<Initializer>)
}
#[derive(Clone, Debug, PartialEq)]
pub enum Expr {
Variable(Identifier),
IntConst(i32),
UIntConst(u32),
BoolConst(bool),
FloatConst(f32),
DoubleConst(f64),
Unary(UnaryOp, Box<Expr>),
Binary(BinaryOp, Box<Expr>, Box<Expr>),
Ternary(Box<Expr>, Box<Expr>, Box<Expr>),
Assignment(Box<Expr>, AssignmentOp, Box<Expr>),
Bracket(Box<Expr>, ArraySpecifier),
FunCall(FunIdentifier, Vec<Expr>),
Dot(Box<Expr>, Identifier),
PostInc(Box<Expr>),
PostDec(Box<Expr>),
Comma(Box<Expr>, Box<Expr>)
}
#[derive(Clone, Debug, PartialEq)]
pub enum UnaryOp {
Inc,
Dec,
Add,
Minus,
Not,
Complement
}
#[derive(Clone, Debug, PartialEq)]
pub enum BinaryOp {
Or,
Xor,
And,
BitOr,
BitXor,
BitAnd,
Equal,
NonEqual,
LT,
GT,
LTE,
GTE,
LShift,
RShift,
Add,
Sub,
Mult,
Div,
Mod
}
#[derive(Clone, Debug, PartialEq)]
pub enum AssignmentOp {
Equal,
Mult,
Div,
Mod,
Add,
Sub,
LShift,
RShift,
And,
Xor,
Or
}
pub type TranslationUnit = NonEmpty<ExternalDeclaration>;
#[derive(Clone, Debug, PartialEq)]
pub enum ExternalDeclaration {
Preprocessor(Preprocessor),
FunctionDefinition(FunctionDefinition),
Declaration(Declaration)
}
#[derive(Clone, Debug, PartialEq)]
pub struct FunctionDefinition {
pub prototype: FunctionPrototype,
pub statement: CompoundStatement,
}
#[derive(Clone, Debug, PartialEq)]
pub struct CompoundStatement {
pub statement_list: Vec<Statement>
}
#[derive(Clone, Debug, PartialEq)]
pub enum Statement {
Compound(Box<CompoundStatement>),
Simple(Box<SimpleStatement>)
}
#[derive(Clone, Debug, PartialEq)]
pub enum SimpleStatement {
Declaration(Declaration),
Expression(ExprStatement),
Selection(SelectionStatement),
Switch(SwitchStatement),
CaseLabel(CaseLabel),
Iteration(IterationStatement),
Jump(JumpStatement)
}
pub type ExprStatement = Option<Expr>;
#[derive(Clone, Debug, PartialEq)]
pub struct SelectionStatement {
pub cond: Box<Expr>,
pub rest: SelectionRestStatement
}
#[derive(Clone, Debug, PartialEq)]
pub enum Condition {
Expr(Box<Expr>),
Assignment(FullySpecifiedType, Identifier, Initializer)
}
#[derive(Clone, Debug, PartialEq)]
pub enum SelectionRestStatement {
Statement(Box<Statement>),
Else(Box<Statement>, Box<Statement>)
}
#[derive(Clone, Debug, PartialEq)]
pub struct SwitchStatement {
pub head: Box<Expr>,
pub body: Vec<Statement>
}
#[derive(Clone, Debug, PartialEq)]
pub enum CaseLabel {
Case(Box<Expr>),
Def
}
#[derive(Clone, Debug, PartialEq)]
pub enum IterationStatement {
While(Condition, Box<Statement>),
DoWhile(Box<Statement>, Box<Expr>),
For(ForInitStatement, ForRestStatement, Box<Statement>)
}
#[derive(Clone, Debug, PartialEq)]
pub enum ForInitStatement {
Expression(Option<Expr>),
Declaration(Box<Declaration>)
}
#[derive(Clone, Debug, PartialEq)]
pub struct ForRestStatement {
pub condition: Option<Condition>,
pub post_expr: Option<Box<Expr>>
}
#[derive(Clone, Debug, PartialEq)]
pub enum JumpStatement {
Continue,
Break,
Return(Box<Expr>),
Discard
}
#[derive(Clone, Debug, PartialEq)]
pub enum Preprocessor {
Version(PreprocessorVersion),
Extension(PreprocessorExtension)
}
#[derive(Clone, Debug, PartialEq)]
pub struct PreprocessorVersion {
pub version: u16,
pub profile: Option<PreprocessorVersionProfile>
}
#[derive(Clone, Debug, PartialEq)]
pub enum PreprocessorVersionProfile {
Core,
Compatibility,
ES
}
#[derive(Clone, Debug, PartialEq)]
pub struct PreprocessorExtension {
pub name: PreprocessorExtensionName,
pub behavior: Option<PreprocessorExtensionBehavior>
}
#[derive(Clone, Debug, PartialEq)]
pub enum PreprocessorExtensionName {
All,
Specific(String)
}
#[derive(Clone, Debug, PartialEq)]
pub enum PreprocessorExtensionBehavior {
Require,
Enable,
Warn,
Disable
}