feat(parser,ir,backend): Support array

This commit is contained in:
2026-05-31 22:06:09 +08:00
parent c42575c1c6
commit 669c415bd7
13 changed files with 575 additions and 130 deletions
+48 -4
View File
@@ -2,23 +2,57 @@ use std::fmt::Display;
use crate::{ast::types::Type as AstType, ir::types::IRType};
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum SemaType {
I32,
I1,
Void,
Array(Box<SemaType>, Vec<usize>),
Ptr(Box<SemaType>),
}
impl SemaType {
pub fn get_elevate_result(lhs: SemaType, rhs: SemaType) -> Option<SemaType> {
pub fn get_elevate_result(lhs: &SemaType, rhs: &SemaType) -> Option<SemaType> {
if lhs == rhs {
Some(lhs)
} else if (lhs == SemaType::I32 && rhs == SemaType::I1) || (lhs == SemaType::I1 && rhs == SemaType::I32) {
Some(lhs.clone())
} else if (*lhs == SemaType::I32 && *rhs == SemaType::I1) || (*lhs == SemaType::I1 && *rhs == SemaType::I32) {
Some(SemaType::I32)
} else {
None
}
}
pub fn is_scalar(&self) -> bool {
matches!(self, SemaType::I32 | SemaType::I1)
}
pub fn is_array_like(&self) -> bool {
matches!(self, SemaType::Array(_, _) | SemaType::Ptr(_))
}
pub fn indexed_type(&self) -> Option<SemaType> {
match self {
SemaType::Array(elem, dims) => {
if dims.len() == 1 {
Some((**elem).clone())
} else {
Some(SemaType::Array(elem.clone(), dims[1..].to_vec()))
}
}
SemaType::Ptr(elem) => Some((**elem).clone()),
_ => None,
}
}
pub fn element_size_in_bytes(&self) -> usize {
match self {
SemaType::I32 => 4,
SemaType::I1 => 1,
SemaType::Void => 0,
SemaType::Array(elem, dims) => elem.element_size_in_bytes() * dims.iter().product::<usize>(),
SemaType::Ptr(_) => 4,
}
}
}
impl Display for SemaType {
@@ -27,6 +61,14 @@ impl Display for SemaType {
SemaType::I32 => write!(f, "i32"),
SemaType::I1 => write!(f, "i1"),
SemaType::Void => write!(f, "void"),
SemaType::Array(elem, dims) => {
write!(f, "{}", elem)?;
for dim in dims {
write!(f, "[{}]", dim)?;
}
Ok(())
}
SemaType::Ptr(elem) => write!(f, "{}*", elem),
}
}
}
@@ -46,6 +88,8 @@ impl From<SemaType> for IRType {
SemaType::I32 => IRType::I32,
SemaType::I1 => IRType::I1,
SemaType::Void => IRType::Void,
SemaType::Array(elem, dims) => IRType::Array(Box::new((*elem).into()), dims),
SemaType::Ptr(elem) => IRType::Ptr(Box::new((*elem).into())),
}
}
}