Skip to content
This repository was archived by the owner on Aug 18, 2025. It is now read-only.

Commit cd1daff

Browse files
committed
新增指针成员访问、数组指针类型和指针数组类型的解析功能,扩展指针操作能力,增强表达式处理的灵活性和准确性
1 parent 1c1daad commit cd1daff

File tree

1 file changed

+112
-3
lines changed

1 file changed

+112
-3
lines changed

src/parser/pointer_parser.rs

Lines changed: 112 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::ast::{Type, Expression, PointerArithmeticOp};
1+
use crate::ast::{Type, Expression, PointerArithmeticOp, PointerMemberAccessOp};
22
use crate::parser::parser_base::ParserBase;
33
use crate::parser::statement_parser::StatementParser;
44
use crate::parser::expression_parser::ExpressionParser;
@@ -11,6 +11,11 @@ pub trait PointerParser {
1111
fn parse_dereference(&mut self) -> Result<Expression, String>;
1212
fn parse_function_pointer_type(&mut self) -> Result<Type, String>;
1313
fn parse_pointer_arithmetic(&mut self, left: Expression) -> Result<Expression, String>;
14+
fn parse_pointer_member_access(&mut self, left: Expression) -> Result<Expression, String>;
15+
fn parse_array_pointer_type(&mut self) -> Result<Type, String>;
16+
fn parse_pointer_array_type(&mut self) -> Result<Type, String>;
17+
fn parse_array_pointer_access(&mut self, left: Expression) -> Result<Expression, String>;
18+
fn parse_pointer_array_access(&mut self, left: Expression) -> Result<Expression, String>;
1419
fn is_pointer_type(&self, token: &str) -> bool;
1520
fn count_pointer_level(&self, tokens: &[String]) -> usize;
1621
}
@@ -30,6 +35,11 @@ impl<'a> PointerParser for ParserBase<'a> {
3035

3136
Ok(Type::OptionalPointer(Box::new(target_type)))
3237
} else if self.peek() == Some(&"*".to_string()) {
38+
// 检查是否是数组指针 (*[size]Type)
39+
if self.peek_ahead(1) == Some(&"[".to_string()) {
40+
return self.parse_array_pointer_type();
41+
}
42+
3343
// 计算指针级别
3444
let mut level = 0;
3545
while self.peek() == Some(&"*".to_string()) {
@@ -52,8 +62,11 @@ impl<'a> PointerParser for ParserBase<'a> {
5262

5363
debug_println(&format!("解析{}级指针类型: {:?}", level, target_type));
5464
Ok(target_type)
65+
} else if self.peek() == Some(&"[".to_string()) {
66+
// 检查是否是指针数组 ([size]*Type)
67+
return self.parse_pointer_array_type();
5568
} else {
56-
Err("期望指针类型标记 '*' 或 '?*'".to_string())
69+
Err("期望指针类型标记 '*'、'?*' 或 '['".to_string())
5770
}
5871
}
5972

@@ -146,13 +159,109 @@ impl<'a> PointerParser for ParserBase<'a> {
146159
}
147160
level
148161
}
162+
163+
// 新增:解析指针成员访问
164+
fn parse_pointer_member_access(&mut self, left: Expression) -> Result<Expression, String> {
165+
debug_println("开始解析指针成员访问");
166+
167+
// 检查操作符类型
168+
let op = if self.peek() == Some(&"->".to_string()) {
169+
self.consume(); // 消费 "->"
170+
PointerMemberAccessOp::Arrow
171+
} else if self.peek() == Some(&".".to_string()) {
172+
self.consume(); // 消费 "."
173+
PointerMemberAccessOp::Dot
174+
} else {
175+
return Err("期望指针成员访问操作符 '->' 或 '.'".to_string());
176+
};
177+
178+
// 解析成员名
179+
let member_name = self.consume().ok_or_else(|| "期望成员名".to_string())?;
180+
181+
debug_println(&format!("解析指针成员访问: {:?} {:?} {}", left, op, member_name));
182+
Ok(Expression::PointerMemberAccess(Box::new(left), member_name))
183+
}
184+
185+
// 新增:解析数组指针类型 (*[size]Type)
186+
fn parse_array_pointer_type(&mut self) -> Result<Type, String> {
187+
debug_println("开始解析数组指针类型");
188+
189+
self.expect("*")?; // 消费 "*"
190+
self.expect("[")?; // 消费 "["
191+
192+
// 解析数组大小
193+
let size_token = self.consume().ok_or_else(|| "期望数组大小".to_string())?;
194+
let size = size_token.parse::<usize>()
195+
.map_err(|_| format!("无效的数组大小: {}", size_token))?;
196+
197+
self.expect("]")?; // 消费 "]"
198+
199+
// 解析元素类型
200+
let element_type = self.parse_base_type()?;
201+
202+
debug_println(&format!("解析数组指针类型: *[{}]{:?}", size, element_type));
203+
Ok(Type::ArrayPointer(Box::new(element_type), size))
204+
}
205+
206+
// 新增:解析指针数组类型 ([size]*Type)
207+
fn parse_pointer_array_type(&mut self) -> Result<Type, String> {
208+
debug_println("开始解析指针数组类型");
209+
210+
self.expect("[")?; // 消费 "["
211+
212+
// 解析数组大小
213+
let size_token = self.consume().ok_or_else(|| "期望数组大小".to_string())?;
214+
let size = size_token.parse::<usize>()
215+
.map_err(|_| format!("无效的数组大小: {}", size_token))?;
216+
217+
self.expect("]")?; // 消费 "]"
218+
self.expect("*")?; // 消费 "*"
219+
220+
// 解析指针目标类型
221+
let target_type = self.parse_base_type()?;
222+
223+
debug_println(&format!("解析指针数组类型: [{}]*{:?}", size, target_type));
224+
Ok(Type::PointerArray(Box::new(target_type), size))
225+
}
226+
227+
// 新增:解析数组指针访问 ((*arrayPtr)[index])
228+
fn parse_array_pointer_access(&mut self, left: Expression) -> Result<Expression, String> {
229+
debug_println("开始解析数组指针访问");
230+
231+
self.expect("[")?; // 消费 "["
232+
233+
// 解析索引表达式
234+
let index_expr = self.parse_expression()?;
235+
236+
self.expect("]")?; // 消费 "]"
237+
238+
debug_println(&format!("解析数组指针访问: {:?}[{:?}]", left, index_expr));
239+
Ok(Expression::ArrayPointerAccess(Box::new(left), Box::new(index_expr)))
240+
}
241+
242+
// 新增:解析指针数组访问 (ptrArray[index])
243+
fn parse_pointer_array_access(&mut self, left: Expression) -> Result<Expression, String> {
244+
debug_println("开始解析指针数组访问");
245+
246+
self.expect("[")?; // 消费 "["
247+
248+
// 解析索引表达式
249+
let index_expr = self.parse_expression()?;
250+
251+
self.expect("]")?; // 消费 "]"
252+
253+
debug_println(&format!("解析指针数组访问: {:?}[{:?}]", left, index_expr));
254+
Ok(Expression::PointerArrayAccess(Box::new(left), Box::new(index_expr)))
255+
}
149256
}
150257

151258
impl<'a> ParserBase<'a> {
152259
// 辅助方法:检查是否是指针操作符
153260
pub fn is_pointer_operator(&self, token: &str) -> bool {
154-
token == "&" || token == "*"
261+
token == "&" || token == "*" || token == "->" || token == "."
155262
}
263+
264+
156265

157266
// 辅助方法:解析指针目标类型(支持多级指针)
158267
fn parse_pointer_target_type(&mut self) -> Result<Type, String> {

0 commit comments

Comments
 (0)