写点什么

结构支持

作者:Miracle
  • 2025-09-24
    四川
  • 本文字数:1308 字

    阅读完需:约 4 分钟

结构支持

看来最底层的开发环境,类似显卡上的汇编语言,也需要有结构的支持,当然这不是 spirv 本身的要求,而是加载以及生成封装代码的要求,为了避免重新制造轮子,我们还是需要一个自己的自行车


首先是一个结构的解析器


use super::{Extra, Type, rust_ws};use chumsky::prelude::*;use smol_str::SmolStr;
pub fn struct_parser<'a>() -> impl Parser<'a, &'a str, (SmolStr, Vec<(SmolStr, Type)>), Extra<'a>> + Clone { let field_list = super::ident_type().clone() .separated_by(just(',').padded_by(rust_ws())) .allow_trailing() .collect::<Vec<(SmolStr, Type)>>() .delimited_by( just('{').padded_by(rust_ws()), just('}').padded_by(rust_ws()) ).labelled("fields list");
just("struct").padded_by(rust_ws()).ignore_then(super::ident_parser().padded_by(rust_ws())) .then(field_list.or_not()).try_map(|(name, _fields), _| { let mut fields = Vec::new(); if let Some(list) = _fields { for field in list { fields.push((field.0, field.1)); } } Ok((name, fields)) }).boxed()}
复制代码

然后在 语句的层面,增加对 struct 的解析


增加 Stmt 枚举

#[derive(Debug, Clone)]pub enum Stmt {    Expr(Value),    Const(SmolStr, Type, Value),    Static(SmolStr, Type, Value),    Struct{ is_pub: bool, name: SmolStr, fields: Vec<(SmolStr, Type)>},    Let { pat: Pattern, value: Value },    Assign { pat: Pattern, value: Value },    For { pat: Pattern, iter: Value, body: Vec<Stmt> },    Break,    Continue,    Match { expr: Value, arms: Vec<(Pattern, Vec<Stmt>)> },    If { cond: Value, then_branch: Vec<Stmt>, else_branch: Option<Vec<Stmt>> },    While { cond: Value, body: Vec<Stmt> },    Fn { is_pub: bool, name: SmolStr, args: Vec<(SmolStr, Option<Type>)>, body: Vec<Stmt> },    Block(Vec<Stmt>),    Return(Option<Value>),    Empty,}
复制代码


然后是解析算子

        let struct_stmt = just("pub").or_not().then(super::structure::struct_parser().clone())            .map(|(_pub, (name, fields))| Stmt::Struct{is_pub: _pub.is_some(), name, fields} )            .labelled("struct statement");
复制代码


我们的 最简单的 shader 代码 变成这样

    pub struct Param {        id: [u32; 1024],    }
pub fn main(param: Param) { let id = spirv_group(); let z = id[0]; param.id[z] = z; }
复制代码


现在看看编译出来的效果



完美,有一个小问题,arg 里面解析的 Struct 是临时创建的 没有参数

我们需要的是引用 而不是定义

原因是这里


解析器 发现是一个类型 ident 的时候 直接 给出 一个空的 Struct,在 AST 阶段 考虑到前向定义的问题,我们可以暂时不处理,这样可以在今后实现的时候 再来处理定义


用户头像

Miracle

关注

三十年资深码农 2019-10-25 加入

还未添加个人简介

评论

发布
暂无评论
结构支持_Miracle_InfoQ写作社区