1- use crate :: ast:: { Type , Expression , PointerArithmeticOp } ;
1+ use crate :: ast:: { Type , Expression , PointerArithmeticOp , PointerMemberAccessOp } ;
22use crate :: parser:: parser_base:: ParserBase ;
33use crate :: parser:: statement_parser:: StatementParser ;
44use 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
151258impl < ' 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